OpenVPN est une solution open source de VPN tournant à la fois sous Linux, BSD, Mac et Windows. Un VPN permet d’établir un tunnel entre deux points et ainsi outrepasser certaines restrictions par exemple. Ces tunnels peuvent être en clair ou encore cryptés, compressés ou ne rediriger que certains flux. Nous allons étudier comment mettre en oeuvre de façon simple une solution openvpn. Installation
Que ce soit pour un client ou pour un serveur il suffira simplement de taper:
Sous Debian:
apt-get install openvpn
Sous FreeBSD:
pkg install openvpn
# Ou via les ports:
cd /usr/ports/security/openvpn
make install clean
Il faut absolument choisir l’option suivante lors de la configuration du port:
[*] PKCS11 Use security/pkcs11-helper
Le dossier de configuration d’OpenVPN n’existe pas par défaut, nous allons le créer.
Sous Debian
mkdir -p /etc/openvpn
Sous FreeBSD
mkdir -p /usr/local/etc/openvpn/
Un paquetage de scripts est disponible lors de l’installation d’OpenSSL, nous allons l’utiliser pour générer l’ensemble des clés de chiffrement.
Sous Linux:
cd /usr/share/doc/openvpn/examples/easy-rsa/2.0
Sous FreeBSD:
cd /usr/local/share/doc/openvpn/easy-rsa/2.0
chmod +x *
Le fichier vars permet de spécifier des options SSL de génération de clés, je vous suggère de l’ouvrir et de modifier les champs appropriés (KEY_COUNTRY, KEY_PROVINCE, KEY_CITY, KEY_ORG, …)
vi ./vars
Sous FreeBSD, il faudra utiliser bash/zsh afin que la commande export fonctionne, ainsi que la prochaine commande.
Ensuite nous allons exécuter ce fichier afin de garder la configuration dans l’environnement actuel
. ./vars
Afin de préparer la distribution des clés un petit script bien pratique permet de nettoyer toutes les données:
./clean-all
et maintenant nous allons générer les clés du serveur (diffle-hellman et le CA):
./build-ca
./build-server-key servername (ou build-key-server servername)
./build-dh
Copiez les fichiers keys/ca.crt, keys/server.crt et keys/server.key dans ce dossier.
Nous allons maintenant décompresser le fichier de configuration d’exemple.
Sous Debian:
gunzip /usr/share/doc/openvpn/examples/sample-config-files/server.tar.gz
cp server.conf /etc/openvpn/server.conf
vi /etc/openvpn/server.conf
Sous FreeBSD:
cp /usr/local/share/doc/openvpn/sample-config-files/server.conf /usr/local/etc/openvpn/server.conf
vi /usr/local/etc/openvpn/openvpn.conf
Nous allons pouvoir désormais configurer openvpn. Commencez par éditer les lignes suivantes:
port 443
proto tcp
Ces règles permettront d’outrepasser la plupart des sécurités non intelligentes et ainsi de se connecter partout via le tunnel. Vous pouvez aussi spécifier le protocole UDP afin de gagner en rapidité mais il n’est pas dit que votre tunnel marche partout.
Modifiez la règle suivant afin de spécifier votre plage d’adresses locales:
server 10.1.4.0 255.255.255.0
Celle-ci définira le range 10.1.4.0/24 comme étant celui où sont l’ensemble des clients. Il est fortement conseillé d’utiliser des plages d’adresses IP non routables sur Internet (contenues dans 10.0.0.0/8, 172.16.0.0/16, 192.168.0.0/16 par exemple).
Maintenant nous allons nous intéresser au routage, la chose la plus importante. Chaque directive route enverra au client une commande lui imposant d’ajouter une route vers le tunnel VPN. Nous allons tout d’abord router comme il se doit le flux du VPN vers celui-ci
route 10.1.4.0 255.255.255.0
Ensuite, si vous souhaitez rediriger l’ensemble du trafic vers le tunnel, entrez simplement la commande suivante:
push "redirect-gateway def1"
Si vous ne souhaitez pas rediriger tout le trafic mais seulement certaines routes, utilisez plutôt le push route.
push route 8.8.0.0 255.255.0.0
push route 15.14.6.0 255.255.255.0
Lorsque vous serrez dans le tunnel VPN vous ne pourrez plus contacter votre DNS local, une directive permet de modifier votre DNS tant que la connexion est active.
push "dhcp-option DNS 147.56.36.197"
Voici deux options intéressantes en terme de gestion de clients. La première permet que les clients VPN se voient entre eux et la seconde permet d’autoriser plusieurs personnes à utiliser le même certificat (si non activé la seconde connexion sera rejetée)
client-to-client
duplicate-cn
Pour terminer gérons les logs:
log /var/log/openvpn.log
log-append /var/log/openvpn.log
Vous pouvez désormais lancer le service
service openvpn start
Il ne reste plus qu’à configurer le NAT et le routage.
Sous Linux, tapez les deux commandes suivantes, que je vous recommande de mettre dans le fichier /etc/rc.local afin qu’au redémarrage vous ne perdiez pas les règles:
echo "1" > /proc/sys/net/ipv4/conf/all/forwarding
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Sous FreeBSD, activez tout d’abord le routage et Packet Filter pour les prochains démarrages en ajoutant les lignes suivantes au fichier /etc/rc.conf:
gateway_enable="YES"
pf_enable="YES"
Puis activez les pour la configuration actuelle:
sysctl net.inet.ip.forwarding=1
pfctl -e
Chaque client OpenVPN est défini par une clé SSL.Pour créer une clé SSL pour un client, il suffit d’aller dans le répertoire de easy-rsa et taper
./build-key name
Cela va générer un fichier .key et un fichier .crt qu’il faudra placer dans le dossier openVPN qui va bien. En ce qui concerne le fichier de configuration, vous en trouverez un ici: /usr/share/doc/openvpn/examples/sample-config-files/client.conf à vous de personnaliser le port et le serveur ainsi que le nom des certificats.
Attention, le client doit être lancé en root ou administrateur windows afin de pouvoir modifier les règles de routage. Authentification via LDAP
On va aller plus loin en poussant cette fois-ci vers l’authentification LDAP. Ceci permet de n’utiliser qu’un certificat unique et ainsi d’identifier les utilisateurs via votre annuaire favori.
Installez tout d’abord le paquet openvpn-auth-ldap.
Sous Debian:
apt-get install openvpn-auth-ldap
Sous FreeBSD:
pkg install openvpn-auth-ldap
# Ou via les ports
cd /usr/ports/security/openvpn-auth-ldap
make install clean
Créez un fichier nommé auth-ldap.conf dans le dossier /etc/openvpn et éditez les options afin de vous connecter sur votre annuaire
<LDAP>
# LDAP server URL
URL ldap://ldap.domain.tld
# Bind DN (If your LDAP server doesn't support anonymous binds)
# BindDN uid=Manager,ou=People,dc=example,dc=com
# Bind Password
# Password SecretPassword
# Network timeout (in seconds)
Timeout 15
# Enable Start TLS
TLSEnable no
</LDAP>
<Authorization>
# Base DN
BaseDN "ou=people,dc=domain,dc=tld"
# User Search Filter
SearchFilter "(uid=%u)"
# Require Group Membership
RequireGroup false
# Add non-group members to a PF table (disabled)
#PFTable ips_vpn_users
</Authorization>
</LDAP>
Vous pouvez filtrer suivant le groupe ou encore via un filtre LDAP classique les utilisateurs.
On va ensuite binder le module sur le serveur OpenVPN en ajoutant la ligne suivante dans le fichier server.conf:
plugin /usr/lib/openvpn/openvpn-auth-ldap.so /etc/openvpn/auth/auth-ldap.conf
Vous pouvez désormais redémarrer le service. Pour que les clients soient invités à entrer leurs identifiants LDAP, il faut ajouter la directive suivante dans leur configuration.
auth-user-pass
Sans cette directive les clients ne pourront pas se loguer.