Zerotier VPN / SDN et sécurité

Dans le précédent article on a vu comment créer facilement un SDN avec Zerotier qui de part ses possibilités explose les deux autres possibilités dont j’avais parlé. Un VPN SDN c’est un réseau étendu qui peu s’intégrer dans un LAN existant ou être totalement virtuel. Dès lors se pose la question de la sécurité des accès et il convient de considérer principalement à deux niveaux :

  • Sécurité d’accès aux ressources au niveau machine assurée par celle-ci ou une solution globale comme Active Directory. Dans un petit réseau local les utilisateurs ont tendance à laisser pas mal de choses ouvertes, voire très peu protégées. Dès lors que l’on ouvre un réseau à un SDN il conviendra de renforcer la sécurité des équipements.
  • Sécurité d’accès au niveau IP. Sur un LAN ou plusieurs LAN interconnectés via des VPN cette sécurité est assurée au niveau des routeurs et des switches afin d’isoler les départements, entremises, etc…

Dès lors que l’on étend un réseau à un SDN comme Zerotier on va se retrouver avec des devices isolés et il faudra définir ce que ces devices auront le droit de faire. Cela est rendu possible de façon centralisée via un système de règles relativement puissant qui se base sur l’ID de chaque client ZT qui va interagir avec des règles basées sur des tags, les adresses IP ZT ou internes aux réseaux, les ports et les protocoles. Je vais me contenter de donner ici quelques exemples que chacun adaptera à ses besoins.

On se base principalement sur 3 expressions

  • DROP, on supprime le paquet et on termine l’évaluation de la règle.
  • BREAK, on termine l’évaluation de la règle mais on accepte l’évaluation par une autre capacité.
  • ACCEPT, on autorise.

On va se servir de la règle de base et l'améliorer

Pour autoriser uniquement les trames Ethernet IPv4, IPv4 ARP.

drop
    not ethertype ipv4
    and not ethertype arp
    and not ethertype ipv6;

Pour éviter toute forme d’IP spoofing, mais ça bloque également les IP non ZT. Donc à exclure si on utilise des ponts vers des réseaux existants.

drop
    not chr ipauth;

Pour autoriser à tout le monde par exemple SSH, HTTP et HTTPS

accept
    ipprotocol tcp
    and dport 22 or dport 80 or dport 443;

Ici on va créer un TAG “department” que l’on va associer à des clients, et à partir de là on définira des possibilités. Ces TAG peuvent permettre de faire communiquer ensemble des clients d’un même service en comparant leur niveau (tdiff department 0 ou 0 est la différence acceptable entre deux clients pour être valide), mais on peut aussi utiliser ces TAG avec TSEQ pour affecter des droits.

tag department
    id 1000 #ID est arbitraire mais unique
    enum 100 to_LAN1
    enum 200 to_LAN2
    enum 300 to_LAN1_LAN2
    enum 400 Finances
    enum 500 Ventes;

Autoriser Windows CIFS et Netbios aux clients tagués 500 (Ventes)

accept
    ipprotocol tcp
    and tseq department 500
    and dport 139 or dport 445;

Autoriser les clients tagués 300 (to_LAN1_LAN2) à accéder à des réseaux internes spécifiques via un pont :

accept tseq department 300 and ipdest 192.168.1.0/24;
accept tseq department 300 and ipdest 192.168.2.0/24;

Pour supprimer les paquets TCP SYN,!ACK qui ne sont pas explicitement autorisés

break
  chr tcp_syn             # TCP SYN (TCP flags will never match non-TCP packets)
  and not chr tcp_ack     # AND not TCP ACK;

Pour interdire les destinations qui ne sont pas explicitement autorisées ci-dessus

break ipdest 192.168.1.0/24;
break ipdest 192.168.2.0/24;
break ipdest 192.168.3.0/24;

Si restreindre les IP est utilisé pour contrôler l’accès à des machines accessibles via un bridge, Il faut également pouvoir rendre inaccessibles certains clients ZT sensibles. Le modèle utilisé pour le contrôle d'accès ressemble à la façon dont les organisations militaires classifient les données. Les informations sont considérées classifiées et seules les personnes disposant du niveau de classification requis sont autorisées à y accéder. Il ne s'applique hélas pas aux clients non ZT

Au départ, les membres se verront attribuer un tag classified par défaut de 0 ("no"). Ceux-ci peuvent communiquer puisque leur étiquette de classification sera zéro. Pour restreindre l'accès à un membre, définissez son tag de classification sur secret (1) ou top (2). (Dans cet exemple, il n'y a pas de différence, mais deux niveaux sont inclus au cas où vous voudriez mettre en œuvre une sorte de segmentation plus détaillée basée sur ceux-ci.). Ainsi, la première correspondance (not tor classified 0) sera vraie et le paquet sera abandonné, à moins que les deux membres en communication aient au moins un flag (équipe) en commun grâce au bit clearance (tand clearance 0). (et si vous n’avez pas compris allez voir la doc en anglais…).

# Is this member classified?
tag classified
  id 2
  enum 0 no
  enum 1 secret
  enum 2 top
  default no
;

# Clearance flags (a bit like groups)
tag clearance
  id 1
  default 0
  flag 0 staging
  flag 1 production
  flag 2 financial
  flag 3 security
  flag 4 executive
;

# If one party is classified, require at least one overlapping clearance bit
break
  not tor classified 0
  and tand clearance 0
;

Pour ne pas être en reste, on va bien sur se créer une capacité "superuser" que l’on pourra affecter à des clients ZT pour passer outre les interdictions…

cap superuser
  id 2000
  accept;

Et enfin on accepte ce qui n’est pas interdit….

accept;

Ce ne sont que quelques exemples et en parcourant la documentation disponible on s’apercevra que les possibilités sont énormes. Je vais essayer de compléter cet article au fil de l'eau, et vos commentaires sont comme toujours les bienvenus.

Sources

http://www.zerotier.com/manual.shtml#3 (la documentation officielle) 
https://www.reddit.com/r/zerotier/comments/958c3d/flow_rule_for_allowing_only_rdp_traffic/ 
https://gist.github.com/adamierymenko/7bcc66b5f7627699236cda8ac13f923b 
https://blog.reconinfosec.com/build-a-private-mesh-network-for-free/ 
https://docs.opnsense.org/manual/how-tos/zerotier.html (d'autres idées à creuser)

Zéro VPN !

On va parler aujourd’hui d’une approche un peu différente des VPN (Virtuel Private Network).

Le principe d'un VPN est de créer un tunnel de données sécurisé dans lequel on routera des réseaux privés en IPV4 ou IPV6. On peu aborder les VPN en plusieurs usages :

  • VPN Remote : il s’agit pour un utilisateur itinérant de se connecter au réseau de son entreprise ou de son domicile depuis un terminal itinérant. On configure généralement ce service au niveau du routeur ou du firewall, plusieurs protocoles sont possibles selon le niveau de sécurité souhaité (PPTP, OpenVPN, L2TP, SSL VPN, etc). Ensuite on utilise soit le logiciel intégré à l’OS client, soit un logiciel spécifique, le tout étant plus ou moins compliqué à mettre en œuvre selon les protocoles. PPPT est le plus simple, c’est aussi le moins sécurisé.
  • VPN Site to Site : il s’agit ici d’interconnecter deux réseaux d’entreprise (le siège et un bureau distant par exemple) afin de rendre transparent l’accès aux équipements. C’est souvent fait en IPSec, mais il est possible d’utiliser d’autres protocoles (SSL VPN, OpenVPN, etc.), ça reste une affaire de spécialistes réseaux et ça se complique quand les deux extrémités utilisent des équipements hétérogènes.
  • VPN Internet : il s’agit ici de masquer son adresse IP afin de se cacher ou simplement laisser croire au service distant qu’on se situe sur une autre partie du globe. Il suffit généralement de contracter un abonnement et d’installer le logiciel fourni.

Tous ces VPN utilisent peu ou prou les mêmes technologies et commencent dater. Vu qu’elles sont massivement utilisées par les entreprises elles sont sures et fiables dès lors qu’elles sont mises en œuvre par de vrais spécialistes. Vous l’aurez compris, la chose n’est pas toujours des plus simples. Si le grand public amateur de DIY parviendra généralement à mettre en œuvre ces solution avec un peu de perspicacité et quelques nuits blanches, il existe des solutions alternatives qui peuvent s’avérer plus simple.

ZERO !

Zéro, comme zéro configuration. Un nouveau type de logiciels voit le jour depuis quelques temps, ils comportent généralement un petit client propriétaire à installer sur les devices (Windows, Mac, Linux, mobiles, etc…) et une interface de gestion quelque part dans un cloud privé ou public. Au niveau du device on ne fait que se connecter, alors que depuis l’interface de gestion on décidera de qui voit quoi. Cela va permettre la création de réseaux point à point et multipoints en mode peer to peer, les échanges se faisant toujours de point à point, le site central ne servant qu’à la gestion. Je vais en citer 3 selon les usages, mais il en existe d’autres et Google est votre ami !

Wirelends

C’est le plus simple, il fonctionne en deux clics mais il offre out of the box la possibilité de se connecter à l’ensemble des équipements du réseau distant, voire même d’accéder à Internet via le réseau distant. Cependant c’est du point à point et uniquement entre deux points en même temps. C’est la solution la plus simple que je n’ai jamais trouvée et bien sûr c’est gratuit. Je ne l’ai testé que sous Windows, mais il est possible d’installer le service Linux sur un équipement existant afin de s’en servir de passerelle. C’est gratuit, mais pas Open Source, donc quid possible au niveau sécurité. Dans le même genre très facile et sous Windows seulement on trouve également RAdmin VPN.

NeoRouter

Celui là je l’utilise depuis quelques années, pour par exemple donner accès à des serveurs aux développeurs. Il comporte deux parties, un client multi plateformes très basic et un peu daté, et un logiciel d’administration que l’on peu installer n’importe ou si on ne choisit pas la version commerciale ou ce service peut être fourni par l’éditeur. On peu définir des utilisateurs et des autorisations par machines et par utilisateurs. Chaque client obtiendra une adresse IP privée supplémentaire qui lui permettra de joindre les autres machines de ce réseau privé multipoint. C’est simple, basic et ça fait le job mais ce n’est pas Open Source et il sera pour certains usages nécessaire de passer à la caisse. Impossible également de bridger un client qui pourrait servir de passerelle pour accéder aux autres équipements du réseau.

Zerotier

Et enfin, celui qui me semble le plus intéressant, Zerotier. Ici on est face à un projet Open Source sous licence GPL. Si la philosophie rappelle celle de NeoRouter, le projet semble bien plus moderne et aboutit. Je me suis contenté au départ de créer un tunnel entre deux PC, en fait je l’ai fait entre trois postes et ça c’est très simple à mettre en place. C’était l’objectif de mon test et c’est réussi. Il est cependant possible de créer des réseaux multipoints complexes et de grande ampleur avec des possibilités de routage vers d’autres réseaux grâce à des bridges et de gérer très finement les autorisations, mais là il va falloir y passer un peu de temps. On est face à un produit intégrable en entreprise, mais il existe une version communautaire avec très peu de restrictions qui est disponible gratuitement.

Pour faire du point à point c’est donc simple et facile, il suffit de se créer un compte, de créer un réseau et de choisir un range d’IP, installer le client, sous Windows il n’y a qu’à cliquer et se connecter ou rentrer la clé API. A partir de là les deux points communiquent, le ping est ok.

Pinging 10.147.20.28 with 32 bytes of data:
Reply from 10.147.20.28: bytes=32 time=32ms TTL=64
Reply from 10.147.20.28: bytes=32 time=31ms TTL=64
Reply from 10.147.20.28: bytes=32 time=30ms TTL=64
Reply from 10.147.20.28: bytes=32 time=30ms TTL=64

Mais là ou ce logiciel devient intéressant c’est qu’il est possible de le configurer une machine du LAN en passerelle. Entendons par là qu’une machine sur mon LAN servira de passerelle et rendra accessible toutes les autres machines.

Sous Windows

On part du principe que Zerotier est installé et fonctionne entre deux points comme vu ci-dessus. Sur la console d’administration on coche Do Not Auto-Assign IPs sur l’interface virtuelle de la machine qui va servir de passerelle et on lui affecte une IP fixe dans le range choisit, ici 10.147.20.28. 

Sur cette même console on défini une Managed Routes pour définir que le LAN 192.168.210.0/24 sera accessible via 10.147.20.28.

EDIT : en fait il vaut mieux faire du /23 ce qui permettra de voir le réseau local quand on est localement connecté sur un réseau appartenant à une route managée.

Il faut ensuite activer le routage IP entre les interfaces, routage qui n'est pas actif par défaut. Pour ça on lance regedit et on cherche la clé IpEnableRouter qui se trouve sous:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters.

On la passe la valeur de 0 à 1 pour activer le TCP/IP forwarding pour toutes les connections actives sur la machine. Et surtout on relance la machine. A partir de là on peu depuis la machine distante faire un ping sur l’IP LAN de la machine passerelle.

Pinging 192.168.210.28 with 32 bytes of data:
Reply from 192.168.210.28: bytes=32 time=63ms TTL=64
Reply from 192.168.210.28: bytes=32 time=36ms TTL=64
Reply from 192.168.210.28: bytes=32 time=30ms TTL=64
Reply from 192.168.210.28: bytes=32 time=30ms TTL=64

Si l’on veut rendre accessible d’autres machines, il faudra bien sur définir une route statique sur celles-ci (avec un -p si on veut que cette route soit persistante :

C:\route add 10.147.20.0 mask 255.255.255.0 192.168.210.28 -p

Et on pourra depuis la machine distante faire un ping sur l’IP LAN de la machine située sur le LAN en passant par la passerelle.

Pinging 192.168.210.24 with 32 bytes of data:
Reply from 192.168.210.24: bytes=32 time=33ms TTL=127
Reply from 192.168.210.24: bytes=32 time=31ms TTL=127
Reply from 192.168.210.24: bytes=32 time=30ms TTL=127
Reply from 192.168.210.24: bytes=32 time=30ms TTL=127

Sous Linux

Une VM linux deviendra une bonne passerelle. Mais on peu aussi installer ça sur un Raspberry ou une autre machine existante, un Jeedom par exemple... On part du principe que Linux est installé avec une IP LAN fixe et que vous êtes connecté en root.

Pour installer Zerotier on se servira de ce script (et on hésite pas à aller lire les informations disponible sur le site de Zerotier, notamment les faqs et leur communauté et aussi sur Redit) :

[[email protected] /]# curl -s https://install.zerotier.com/ | sudo bash

Ça va nous retourner une ID client que l’on rentre manuellement dans le manager.

Ensuite on découvre quelques commandes

[[email protected] /]# /usr/sbin/zerotier-one -d < pour faire un bind, mais pas toujours utile…
[[email protected] /]# /usr/sbin/zerotier-cli join 8044c2551c550881 < ID Réseau que l’on trouve dans le manager
[[email protected] /]# /usr/sbin/zerotier-cli listnetworks

Pour activer la passerelle

On édite le fichier /etc/sysctl.conf (avec nano par exemple) pour supprimer le # devant la ligne net.ipv4.ip_forward=1

Avec un ip a on repère le nom de l’interface virtuelle Zerotier (ici : zt7erf5fdc)

Ensuite on édite le fichier /usr/local/sbin/firewall.sh et on lui colle ce qui suit en renseignant correctement le nom de l’interface virtuelle (attention, selon les configurations il faut parfois remplacer eth0 par ensXX)

/usr/local/sbin/firewall.sh

# !/bin/sh
# A very basic IPtables / Netfilter script /etc/firewall/enable.sh
# PATH='/sbin'
# service networking restart > /dev/null 2>&1

# Flush the tables to apply changes
iptables -F

# Default policy to drop 'everything' but our output to internet
iptables -P FORWARD ACCEPT
iptables -P INPUT   ACCEPT
iptables -P OUTPUT  ACCEPT

# Allow established connections (the responses to our outgoing traffic)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Allow local programs that use loopback (Unix sockets)
iptables -A INPUT -s 127.0.0.0/8 -d 127.0.0.0/8 -i lo -j ACCEPT
iptables -t nat -A POSTROUTING -o ens32 -j MASQUERADE
iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i zt7erf5fdc -o ens32 -j ACCEPT

sleep 4
service networking restart

sleep 4
service ssh restart

exit 0

Un petit reboot et on peut maintenant depuis la machine distante faire un ping vers n’importe quelle machine du LAN dont la route idoine aura été renseignée.

Pour activer le pont (mode Bridge)

Pour l’instant on parlait de routage, ce qui implique que les machine à joindre aient une route statique vers celle qui va servir de routeur vers le réseau Zerotier. Mais il y a une autre option expliquée ici, faire un bridge. Comme vu plus haut on prépare une petite machine Linux sur laquelle on installe Zerotier, on y colle une IP Zerotier fixe + l’option Bridge et on la définie dans Managed Route en tant que celle qui va nous permettre de joindre le réseau local. On édite le fichier /etc/sysctl.conf (avec nano par exemple) pour supprimer le # devant la ligne net.ipv4.ip_forward=1 et un sysctl -p pour recharger la configuration. Avec un ip a on repère le nom de l’interface virtuelle Zerotier (ici : zt7erf5fdc) et on lance les commandes suivantes :

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -A FORWARD -i eth0 -o zt7erf5fdc -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i zt7erf5fdc -o eth0 -j ACCEPT

Pour rendre ces commandes persistantes (j'apprends Linux en même temps...) :

apt-get install iptables-persistent

Et si tout ça se passe dans une VM autant installer les Open VMware Tools (ça aidera notamment pour les sauvegardes) :

apt-get install open-vm-tools

reboot

Voilà comment depuis une machine itinérante ou un VPS je peux joindre n'importe quelle machine de mon réseau local de façon simple et sécurisée. Et si ce réseau comporte d'autres routes, il sera également possible d'y accéder, pour peu qu'on les définisses dans la manager... Ce qui veut concrètement dire que je peux me passer des routeurs IPSec qui gèrent des VPN entre plusieurs sites et les remplacer par un bête Raspberry à deux balles...

J'ai parlé ici de Windows et Linux, mais ça existe aussi pour Mac, IOS et Android.

Qu'en faire ?

En substance Wirelends rendra service dans un cadre DIY, NeoRouter, un peu daté se situe entre les deux, en revanche Zerotier propose une approche d’entreprise décentralisée intéressante. Traditionnellement les collaborateurs travaillent dans l’entreprise et accèdent aux ressources locales ou distantes vie des VPN point à point. Quant ils sont itinérants on colle sur leur terminal un client VPN configuré localement par l’IT qui devra repasser si des modifications sont à effectuer.

L’idée des VPN, je dirais plutôt SDN, tels que Zerotier est d’installer un client générique, pas incompatible avec d’autres clients, et entièrement configurable d’un point central. De plus, contrairement à NeoRouter, l’approche de Zerotier est multi réseaux, l’utilisateur pourra ainsi faire partie de plusieurs réseaux privés en même temps. Certains sur des forums on même imaginé qu’il découle de cette approche une standardisation car il n’est pas impossible que de plus en plus d’internautes auront besoin d’accéder simultanément à plusieurs réseaux privés correspondant à plusieurs activités à sécuriser… Et ici on va justement parler sécurité autour de Zerotier.

Sources

https://gist.github.com/ort163/787000d371dae49a4a399b0f6a7aab56 
https://www.digitalocean.com/community/tutorials/getting-started-software-defined-networking-creating-vpn-zerotier-one 
https://zerotier.atlassian.net/wiki/spaces/SD/pages/7536656/Running+ZeroTier+in+a+Docker+Container 
https://zerotier.atlassian.net/wiki/spaces/SD/pages/7438339/Layer+2+Bridging+with+LEDE+OpenWRT 
https://zerotier.atlassian.net/wiki/spaces/SD/pages/7471125/Layer+2+Bridging+of+Ethernet+and+ZeroTier+Networks+on+Linux 
https://www.reddit.com/r/zerotier/ 
https://news.ycombinator.com/item?id=16329046 
https://blog.reconinfosec.com/build-a-private-mesh-network-for-free/ 
https://github.com/cormacrelf/terraform-provider-zerotier 
https://0wned.it/2017/12/04/building-a-zerotier-bridged-network/ 
https://mangolassi.it/topic/8566/zerotier-bridging-configuration 
http://espressobin.net/ 
https://gist.github.com/adamierymenko/7bcc66b5f7627699236cda8ac13f923b 
https://ngrok.com/ (pas exploré mais ça peut être intéressant dans certains contextes)