Serveur OpenVPN avec intégration LDAP
Sources de la documentation :
- https://wiki.debian.org/OpenVPN
- https://www.howtoforge.com/set-up-openvpn-server-with-authentication-against-openldap-on-debian-6.0-squeeze
- https://kifarunix.com/configure-openvpn-ldap-based-authentication/
Procédure validée sur Debian 12.
Présentation du projet
Nous allons mettre en œuvre, ici, un serveur OpenVPN utilisant des clefs TLS et authentifiant les utilisateurs avec un annuaire OpenLDAP.
Pré-requis
Pour la création d'un annuaire OpenLDAP, reportez-vous à la documentation spécifique : Installation d'OpenLDAP, PAM-LDAP et NFS.
Pour la suite de cette documentation, les utilisateurs sont stockés dans ou=Utilisateurs,dc=mondomaine,dc=local
. Les serveurs VPN et LDAP ont respectivement pour adresse IP 10.50.0.1 et IP 10.50.0.2. Notre zone réseau VPN sera 10.99.0.0/24. Le réseau a accéder via le VPN est le 192.168.1.0/24.
Installation et initialisation d'OpenVPN
Installer les paquets OpenVPN, ainsi que le serveur DNS utilisé par la zone réseau VPN :
apt-get install openvpn openvpn-auth-ldap bind9 nftables
Nous allons configurer l'interface réseau enp0s8. Pour cela, nous modifions le fichier /etc/network/interfaces :
auto lo iface lo inet loopback auto enp0s3 iface enp0s3 inet static address 10.50.0.1 netmask 255.255.0.0
Appliquer ces changements :
service networking restart
Autoriser le trafic vers le serveur VPN et en loopback en modifiant le fichier /etc/nftables.conf. Adapter selon les autres services déjà installés :
#!/usr/sbin/nft -f flush ruleset table inet tableinet { chain input { type filter hook input priority filter; policy drop; iifname lo accept iifname tun0 accept ip protocol icmp accept udp dport 1194 accept iifname enp0s3 dport 53 accept ct state {established,related} accept } chain forward { type filter hook forward priority filter; } chain output { type filter hook output priority filter; } chain prerouting { type nat hook prerouting priority dstnat; } chain postrouting { type nat hook postrouting priority srcnat; oifname enp0s3 masquerade } }
Activer et redémarrer nftables :
systemctl enable nftables.service systemctl restart nftables.service
Il faut permettre au serveur de transmettre les paquets reçus et d'agir comme un routeur. Pour cela, modifier la ligne suivante dans /etc/sysctl.conf :
net.ipv4.ip_forward=1
Appliquer ce changement :
sysctl -p
On initialise la PKI du VPN. Vous pouvez retirer l'option nopass
pour définir un mot de passe pour le certificat de la CA :
make-cadir /etc/openvpn/easy-rsa/ cd /etc/openvpn/easy-rsa/ ./easyrsa init-pki ./easyrsa build-ca nopass ./easyrsa build-server-full server nopass
Générer les paramètres DH :
./easyrsa gen-dh
Générer la clef d'authentification TLS :
openvpn --genkey secret /etc/openvpn/server/ta.key
Paramétrage de l'authentification d'OpenVPN
Créer le répertoire qui accueillera les paramètres d'authentification :
mkdir /etc/openvpn/auth
Créer le fichier de paramètres LDAP /etc/openvpn/auth/ldap.conf :
<LDAP> URL ldap://10.50.0.2 BindDN cn=lecture,dc=mondomaine,dc=local Password test Timeout 15 TLSEnable no FollowReferrals no </LDAP> <Authorization> BaseDN "ou=Utilisateurs,dc=mondomaine,dc=local" SearchFilter "(&(uid=%u))" RequireGroup false </Authorization>
Configuration d'OpenVPN
Définir le fichier de configuration à charger avec systemd en éditant cette ligne dans /etc/default/openvpn :
AUTOSTART="server"
Créer la configuration d'OpenVPN dans /etc/openvpn/server.conf. Modifier la/les ligne(s) push "route x.x.x.x x.x.x.x"
en fonction des zones réseau que vous souhaitez rendre accessibles depuis le VPN :
local 10.50.0.1 port 1194 proto udp dev tun ca /etc/openvpn/easy-rsa/pki/ca.crt cert /etc/openvpn/easy-rsa/pki/issued/server.crt key /etc/openvpn/easy-rsa/pki/private/server.key dh /etc/openvpn/easy-rsa/pki/dh.pem server 10.99.0.0 255.255.255.0 ifconfig-pool-persist /var/log/openvpn/ipp.txt push "route 192.168.1.0 255.255.255.0" push "dhcp-option DNS 10.50.0.1" keepalive 10 120 tls-auth /etc/openvpn/server/ta.key cipher AES-256-CBC persist-key persist-tun status /var/log/openvpn/openvpn-status.log verb 3 explicit-exit-notify 1 push "redirect-gateway def1" client-to-client plugin /usr/lib/openvpn/openvpn-auth-ldap.so /etc/openvpn/auth/ldap.conf
Créer la configuration pour les clients dans /etc/openvpn/client.conf :
client dev tun proto udp remote 10.50.0.1 1194 resolv-retry infinite nobind persist-key persist-tun remote-cert-tls server cipher AES-256-CBC auth-user-pass verb 3
Créer le fichier de journal d'OpenVPN :
touch /var/log/openvpn/openvpn-status.log
Redémarrer le service :
service openvpn restart
Création des clefs et de la configuration client
Sur le serveur, créer les clefs pour le client (ici l'utilisateur pdubois
). Ajouter nopass
pour ne pas mettre de mot de passe à la clef TLS. Le mot de passe peut être passé en argument en ajoutant l'option --passout=pass:MonMotDePasse
:
cd /etc/openvpn/easy-rsa/ ./easyrsa --batch build-client-full pdubois
Créer le fichier de configuration pdubois.ovpn qui sera communiqué au client :
cd /etc/openvpn/easy-rsa/ cp /etc/openvpn/client.conf /tmp/pdubois.ovpn echo "<ca>" >> /tmp/pdubois.ovpn cat /etc/openvpn/easy-rsa/pki/ca.crt >> /tmp/pdubois.ovpn echo "</ca>" >> /tmp/pdubois.ovpn echo "<cert>" >> /tmp/pdubois.ovpn sed -n '/BEGIN CERTIFICATE/,/END CERTIFICATE/p' < /etc/openvpn/easy-rsa/pki/issued/pdubois.crt >> /tmp/pdubois.ovpn echo "</cert>" >> /tmp/pdubois.ovpn echo "<key>" >> /tmp/pdubois.ovpn cat /etc/openvpn/easy-rsa/pki/private/pdubois.key >> /tmp/pdubois.ovpn echo "</key>" >> /tmp/pdubois.ovpn echo "<tls-auth>" >> /tmp/pdubois.ovpn sed -n '/BEGIN OpenVPN Static key V1/,/END OpenVPN Static key V1/p' < /etc/openvpn/server/ta.key >> /tmp/pdubois.ovpn echo "</tls-auth>" >> /tmp/pdubois.ovpn
Sur le client, installer OpenVPN et le plugin OpenVPN pour Network Manager et redémarrer :
apt install openvpn network-manager-openvpn network-manager-openvpn-gnome
Copier le fichier pdubois.ovpn sur le client et le charger dans Network Manager. Pour cela, modifier les connexions :
Ajouter une nouvelle connexion :
Sélectionner Importer une configuration VPN enregistrée … et sélectionner le fichier :
Modifier le nom de la connexion et saisir les identifiants :
Valider et se connecter.
Pour se connecter sans interface graphique, exécuter la commande suivante :
openvpn --config pdubois.ovpn
Révocation des clefs client
Pour révoquer une clef client, exécuter les commandes suivantes :
cd /etc/openvpn/easy-rsa/ ./easyrsa --batch revoke pdubois