Publié le: 2011-09-15

OpenVPN

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

Configuration du serveur

Configuration préliminaire

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/

Configuration des clés SSL

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

Configuration du serveur (mode tun)

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

Configuration du client

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.