J'ai souvent parlé de Zerotier que j'utilise au quotidien, mais qui dans sa version gratuite comporte quelques limitations en terme de contrôle d'accès dans un environnement mixant du site-to-site et des clients isolés. J'ai donc voulut voir ce que proposait Tailscale, qui est un VPN managé relativement similaire reposant sur Wireguard. Tous deux offrent des fonctionnalités gratuites et payantes. Si payer ne doit pas être un problème dans un environnement de production, c'est un peu différent en mode home lab.... d'autant plus que certaines fonctionnalités de la version gratuite ne se retrouvent que dans la version Premium à $18 /mois/utilisateur.
La version gratuite des Tailscale est plutôt généreuse, elle propose 100 nodes et 3 utilisateurs (à condition de disposer d'un "custom domain" (je vais utiliser des comptes Microsoft 365, mais plusieurs autres possibilités sont disponibles : SSO Identity Providers). On peut donc disposer de 3 comptes sur un même domaine. Je parle de comptes car nativement (et normalement) le contrôle d'accès se fait sur l'utilisateur. Manque de chance j'ai besoin de gérer 4 utilisateurs, et je ne suis pas prêt à payer 4 x $18, ce qui me ferait plus de $ 800 par an !
J'ai donc cherché à contourner et je vais finalement gérer mes autorisations à partir des machines Tailscale que j'ai approuvées (mode NFS pour ceux qui se souviennent). Dans cet usage je ne cherche pas faire communiquer les clients Tailscale entre eux mais à leur permettre d'accéder à des ressources situées sur différents subnets sur lesquels je souhaite restreindre les possibilités.
Pour la suite on considère que le réseaux Tailscale est configuré avec les nodes qui servent à joindre les subnets.
Je vais créer deux utilisateurs :
[email protected]
[email protected]
Le premier compte qui sera également le mien va également me permettre de configurer et approuver les machines clientes.
Le second servira à connecter mes utilisateurs et je pourrais approuver leurs machines. Ce compte étant protégé en MFA, il nécessitera une validation de ma part. Une fois la machine connectée, je désactive l'expiration de la clé et on passe au contrôle s'accès :
{
"acls": [
{"action": "accept", "src": ["[email protected]"], "dst": ["*:*"]}, // Ici l'admin dispose de tous les droits
// Autorisation par machines
{
"action": "accept",
"src": ["azura", "lydia"], // Ici deux clients Tailscale
"dst": [
"pipa:25,53", // On autorise le host qui supporte le DNS si on veut utiliser les noms courts...
"mixa:80,443,445,3389",
"nona:80,443,445,1443,3389", // Ports autorisés
"lab-1:*",
"192.168.2.12:80,443,9100,5001,3389", // Par IP + ports
"192.168.6.0/24:*", // Par subnet
],
},
],
"hosts": {
"azura": "100.1.2.3", // Client Tailscale
"lydia": "100.5.2.3", // Client Tailscale
"mixa": "192.168.1.4", // Host on subnet
"nona": "192.168.2.8", // Host on subnet
"pipa": "192.168.2.1", // Host on subnet
"lab-1": "192.168.6.0/24", // subnet
},
}
Dans l'ordre :
- J'autorise l'admin à tout voir.
- Ensuite j'autorise les machines
azura
et lydia
à accéder uniquement aux hosts que j'aurais défini avec une restriction sur certains ports. C'est possible en définissant les hosts plus loin ou en se servant directement des adresses IP. L'ICMP (ping) est ouvert automatiquement vers les destinations autorisées.
- Je défini les clients et serveurs.
Voilà. Je n'ai pas creusé toutes les possibilité offertes par le contrôle d'accès proposé par Tailscale, la liste est longue et le documentation plutôt bien faire. Idées bienvenues !