Serveur OpenVPN avec intégration LDAP

Sources de la documentation :

Procédure validée sur Debian 11.

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.

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

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/
/etc/openvpn/easy-rsa/easyrsa init-pki
/etc/openvpn/easy-rsa/easyrsa build-ca nopass
/etc/openvpn/easy-rsa/easyrsa build-server-full server nopass

Générer les paramètres DH :

/etc/openvpn/easy-rsa/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://127.0.0.1
	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 10.50.0.0 255.255.255.0"
push "dhcp-option DNS 10.99.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
plugin /usr/lib/openvpn/openvpn-auth-ldap.so /etc/openvpn/auth/ldap.conf

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

Créer la configuration pour les clients dans /etc/openvpn/client.conf :

client
dev tun
proto udp
remote 192.168.1.18 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 :

/etc/openvpn/easy-rsa/easyrsa build-client-full pdubois

Créer le fichier de configuration pdubois.ovpn qui sera communiqué au client :

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>" >> 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.