Serveur OpenVPN avec intégration LDAP

Sources de la documentation :

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 :

Pensez à créer une règle pour SSH si vous utilisez ce service pour configurer votre serveur. Ne vous enfermez pas dehors !
#!/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 :

Chargement de la configuration OpenVPN

Ajouter une nouvelle connexion :

Chargement de la configuration OpenVPN

Sélectionner Importer une configuration VPN enregistrée … et sélectionner le fichier :

Chargement de la configuration OpenVPN

Modifier le nom de la connexion et saisir les identifiants :

Chargement de la configuration OpenVPN

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