OpenVPN 2.0 et versions ultérieures incluent une fonctionnalité qui permet au serveur OpenVPN d’obtenir en toute sécurité un nom d’utilisateur et un mot de passe d’un client se connectant, et d’utiliser ces informations comme base pour authentifier le client.
Pour utiliser cette méthode d’authentification, ajoutez d’abord la directive auth-user-pass à la configuration du client. Il demandera au client OpenVPN d’interroger l’utilisateur pour un nom d’utilisateur / mot de passe, en le transmettant au serveur via le canal TLS sécurisé.
Ensuite, configurez le serveur pour qu’il utilise un plugin d’authentification, qui peut être un script, un objet partagé ou une DLL. Le serveur OpenVPN appellera le plugin chaque fois qu’un client VPN essaie de se connecter, en lui transmettant le nom d’utilisateur / mot de passe entré sur le client. Le plugin d’authentification peut contrôler si le serveur OpenVPN permet ou non au client de se connecter en renvoyant une valeur d’échec (1) ou de succès (0).
Utilisation de plugins de script
Les plugins de script peuvent être utilisés en ajoutant la directive auth-user-pass-verify au fichier de configuration côté serveur. Exemple:
auth-user-pass-verify auth-pam.pl via-file
utilisera le auth-pam.pl script perl pour authentifier le nom d’utilisateur/mot de passe des clients de connexion. Voir la description de auth-user-pass-verify dans la page de manuel pour plus d’informations.
Le auth-pam.pl script est inclus dans la distribution du fichier source OpenVPN dans le répertoire sample-scriptssubdirectory. Il authentifiera les utilisateurs sur un serveur Linux à l’aide d’un module d’authentification PAM, qui pourrait à son tour implémenter l’authentification shadow password, RADIUS ou LDAP. auth-pam.pl est principalement destiné à des fins de démonstration. Pour l’authentification PAM dans le monde réel, utilisez le plugin d’objet openvpn-auth-pamshared décrit ci-dessous.
Utilisation de plugins d’objets partagés ou de DLL
Les plugins d’objets partagés ou de DLL sont généralement des modules C compilés qui sont chargés par le serveur OpenVPN au moment de l’exécution. Par exemple, si vous utilisez un package OpenVPN basé sur RPM sous Linux, le plugin openvpn-auth-pam devrait déjà être construit. Pour l’utiliser, ajoutez ceci au fichier de configuration côté serveur:
plugin /usr/share/openvpn/plugin/lib/openvpn-auth-pam.so login
Cela indiquera au serveur OpenVPN de valider le nom d’utilisateur / mot de passe saisi par les clients à l’aide du module loginPAM.
Pour une utilisation en production dans le monde réel, il est préférable d’utiliser le plugin openvpn-auth-pam, car il présente plusieurs avantages par rapport au auth-pam.pl scénario:
- Le plugin openvpn-auth-pam d’objet partagé utilise un modèle d’exécution à privilèges partagés pour une meilleure sécurité. Cela signifie que le serveur OpenVPN peut fonctionner avec des privilèges réduits en utilisant les directives user nobody, group nobody et chroot, et pourra toujours s’authentifier avec le fichier de mot de passe fantôme lisible par la racine.
- OpenVPN peut transmettre le nom d’utilisateur / mot de passe à un plugin via la mémoire virtuelle, plutôt que via un fichier ou l’environnement, ce qui est mieux pour la sécurité locale sur la machine serveur.
- Les modules d’extension compilés en C s’exécutent généralement plus rapidement que les scripts.
Si vous souhaitez plus d’informations sur le développement de vos propres plugins pour une utilisation avec OpenVPN, consultez les fichiers README dans le sous-répertoire des plugins de la distribution source OpenVPN.
Pour créer le plugin openvpn-auth-pam sous Linux, CD dans le répertoire plugin/auth-pam dans la distribution source OpenVPN et exécuter make.
Utiliser l’authentification par nom d’utilisateur/mot de passe comme seule forme d’authentification client
Par défaut, l’utilisation d’auth-user-pass-verify ou d’un plugin de vérification de nom d’utilisateur/mot de passe sur le serveur activera la double authentification, nécessitant que l’authentification par certificat client et l’authentification par nom d’utilisateur/mot de passe réussissent pour que le client soit authentifié.
Bien qu’il soit déconseillé du point de vue de la sécurité, il est également possible de désactiver l’utilisation des certificats clients et de forcer uniquement l’authentification par nom d’utilisateur/mot de passe. Sur le serveur:
client-cert-not-required
De telles configurations devraient généralement également définir:
username-as-common-name
ce qui indiquera au serveur d’utiliser le nom d’utilisateur à des fins d’indexation car il utiliserait le nom commun d’un client qui s’authentifiait via un certificat client.
Notez que client-cert-not-required n’élimine pas la nécessité d’un certificat de serveur, donc un client se connectant à un serveur qui utilise client-cert-not-required peut supprimer les directives cert et key du fichier de configuration client, mais pas la directive ca, car il est nécessaire pour le client de vérifier le certificat de serveur.