OpenVPN 2.0 y versiones posteriores incluyen una función que permite al servidor OpenVPN obtener de forma segura un nombre de usuario y una contraseña de un cliente que se conecta, y utilizar esa información como base para autenticar al cliente.
Para usar este método de autenticación, agregue primero la directiva auth-user-pass a la configuración del cliente. Dirigirá al cliente OpenVPN para que solicite al usuario un nombre de usuario / contraseña, pasándolo al servidor a través del canal TLS seguro.
A continuación, configure el servidor para que use un complemento de autenticación, que puede ser un script, un objeto compartido o una DLL. El servidor OpenVPN llamará al complemento cada vez que un cliente VPN intente conectarse, pasándole el nombre de usuario/contraseña ingresado en el cliente. El complemento de autenticación puede controlar si el servidor OpenVPN permite o no que el cliente se conecte devolviendo un valor de error (1) o éxito (0).
Usando complementos de script
Los complementos de script se pueden usar agregando la directiva auth-user-pass-verify al archivo de configuración del lado del servidor. Por ejemplo:
auth-user-pass-verify auth-pam.pl via-file
utilizará el auth-pam.pl script perl para autenticar el nombre de usuario / contraseña de los clientes que se conectan. Consulte la descripción de auth-user-pass-verify en la página de manual para obtener más información.
El auth-pam.pl el script se incluye en la distribución de archivos fuente de OpenVPN en el directorio sample-scriptssub. Autenticará a los usuarios en un servidor Linux utilizando un módulo de autenticación PAM, que a su vez podría implementar la autenticación de contraseña sombra, RADIUS o LDAP. auth-pam.pl está destinado principalmente a fines de demostración. Para la autenticación PAM en el mundo real, use el complemento openvpn-auth-pamshared object que se describe a continuación.
Utilizando complementos de Objeto compartido o DLL
Los complementos de objeto compartido o DLL generalmente son módulos C compilados que carga el servidor OpenVPN en tiempo de ejecución. Por ejemplo, si está utilizando un paquete OpenVPN basado en RPM en Linux, el complemento openvpn-auth-pam ya debería estar construido. Para usarlo, agregue esto al archivo de configuración del lado del servidor:
plugin /usr/share/openvpn/plugin/lib/openvpn-auth-pam.so login
Esto le indicará al servidor OpenVPN que valide el nombre de usuario/contraseña ingresados por los clientes utilizando el módulo loginPAM.
Para el uso de producción en el mundo real, es mejor usar el complemento openvpn-auth-pam, ya que tiene varias ventajas sobre el auth-pam.pl guión:
- El complemento openvpn-auth-pam de shared object utiliza un modelo de ejecución de privilegios divididos para una mejor seguridad. Esto significa que el servidor OpenVPN puede ejecutarse con privilegios reducidos mediante el uso de las directivas user nobody, group nobody y chroot, y aún podrá autenticarse contra el archivo de contraseña sombra solo legible como root.
- OpenVPN puede pasar el nombre de usuario/contraseña a un complemento a través de la memoria virtual, en lugar de a través de un archivo o el entorno, lo que es mejor para la seguridad local en la máquina servidor.
- Los módulos de complementos compilados en C generalmente se ejecutan más rápido que los scripts.
Si desea obtener más información sobre el desarrollo de sus propios complementos para su uso con OpenVPN, consulte los archivos LÉAME en el subdirectorio de complementos de la distribución de código fuente de OpenVPN.
Para crear el complemento openvpn-auth-pam en Linux, haga un cd al directorio plugin/auth-pam en la distribución de código fuente de OpenVPN y ejecute make.
Usar la autenticación de nombre de usuario/contraseña como la única forma de autenticación de cliente
De forma predeterminada, el uso de auth-user-pass-verify o un complemento de comprobación de nombre de usuario/contraseña en el servidor habilitará la autenticación dual, requiriendo que tanto el certificado de cliente como la autenticación de nombre de usuario/contraseña tengan éxito para que el cliente se autentique.
Aunque se desaconseja desde el punto de vista de la seguridad, también es posible deshabilitar el uso de certificados de cliente y forzar solo la autenticación de nombre de usuario/contraseña. En el servidor:
client-cert-not-required
Tales configuraciones generalmente también deben establecer:
username-as-common-name
que le indicará al servidor que use el nombre de usuario para fines de indexación, ya que usaría el Nombre Común de un cliente que se autenticaba a través de un certificado de cliente.
Tenga en cuenta que client-cert-not-required no eliminará la necesidad de un certificado de servidor, por lo que un cliente que se conecte a un servidor que use client-cert-not-required puede eliminar las directivas cert y key del archivo de configuración del cliente, pero no la directiva ca, porque es necesario que el cliente verifique el certificado de servidor.