Se han escrito muchas guías sobre OpenVPN, incluida la autorización a través de Active Directory. La mayoría de ellos se reducen al uso de LDAP, no encontré un enfoque usando Kerberos, que está escrito en un artículo completo. Sin embargo, aquí no se inventará algo nuevo, acabo de compilar lo que ya se ha hecho antes, PAM funciona bien con Kerberos y OpenVPN tiene un complemento PAM nativo. También decidí abandonar los certificados y consejos de usuario, donde simplemente recomiendan que todos los usuarios emitan un certificado, no me convenían, por lo que se encontró otra solución que funcionaba en todos los clientes.

Un poco sobre NSS
En mi caso, usé Centos 7 junto con sssd. Sin embargo, nada impide usar winbind. Lo principal es tener un automóvil en el dominio y un boleto de Kerberos. No escribiré sobre cómo se hace esto, porque No diré nada nuevo, hay muchos buenos manuales en la red.
Será necesario cambiar la configuración de
/etc/nsswitch.conf
si esto no se ha hecho antes. Dependiendo de qué módulo se utilizó, debe ingresar
sss o winbind en lugar de module_name, respectivamente. Las descripciones de los parámetros se pueden leer usando
man nsswitch.conf
.
La siguiente configuración debería ser suficiente:
passwd: files module_name shadow: files module_name group: files module_name
En el caso de sssd, no olvidamos, entre otras cosas, que en
/etc/sssd/sssd.conf
en el bloque [sssd], se debe mencionar nss:
services = nss, pam
En cuanto a winbind, es difícil para mí decir algo, no lo he usado.
El objetivo final es obtener el resultado correcto de getent. Verifique que la máquina pueda recibir información sobre usuarios y grupos de dominio:
> getent passwd kanlas kanlas:*:14123583:1257570:Kanlas Kanlasovich:/home/kanlas@example.com:/bin/bash > getent group VPN vpn:*:13821391:kanlas,igor,marina
NotaSi usó sssd y los datos de usuario se obtienen solo con el nombre completo (es decir, kanlas@example.com), agregue el parámetro use_fully_qualified_names = False
en sssd.conf en el bloque de dominio
Configurar PAM
Ahora necesita crear su propio módulo PAM. Para no usar el sistema access.conf, crearemos un archivo separado desde donde se leerá el grupo de acceso. No soy tan bueno en los módulos PAM, por lo que no puedo decir si se necesitan todas las líneas en el siguiente ejemplo. En general, solo estamos interesados en la
account required pam_listfile.so onerr=fail item=group sense=allow file=/etc/openvpn/auth/access-groups
línea
account required pam_listfile.so onerr=fail item=group sense=allow file=/etc/openvpn/auth/access-groups
.
La opción más fácil es tomar, por ejemplo, el módulo de inicio de sesión y agregarle la línea deseada. Lo cual fue hecho.
Obtenemos:
#%PAM-1.0 auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so auth substack system-auth auth include postlogin account required pam_listfile.so onerr=fail item=group sense=allow file=/etc/openvpn/auth/access-groups account include system-auth password include system-auth session required pam_selinux.so close session required pam_loginuid.so session optional pam_console.so session required pam_selinux.so open session required pam_namespace.so session optional pam_keyinit.so force revoke session include system-auth session include postlogin -session optional pam_ck_connector.so
Lo ponemos en
/etc/pam.d
, nombrándolo a nuestra discreción.
En
/etc/openvpn/auth/access-groups
, especificado en el módulo, el grupo de acceso se escribirá aquí, puede especificar su ruta si lo desea. Deberá especificar el nombre del grupo (Nombre común) con el dominio. En mi caso, escribí
VPN@example.com allí.
Queda por explicar a OpenVPN que necesita usar PAM. Ponemos las siguientes líneas en la configuración del servidor:
plugin /usr/lib64/openvpn/plugins/openvpn-plugin-auth-pam.so __pam username-as-common-name
¡Diferentes distribuciones pueden tener diferentes caminos! Busque un archivo por ruta o use find.El uso del parámetro username-as-common-name se debe al hecho de que, de lo contrario, una vez que el cliente haya aprobado el pase de usuario, el
nombre especificado en el certificado se enviará al servidor.En la configuración del cliente, agregue la línea
auth-user-pass
Una vez completada esta configuración, puede probar.
Eliminamos el certificado de usuario.
Ahora tenemos autorización a través del dominio y el certificado de usuario es inútil, abandonarlo parece una decisión lógica. Pero los clientes móviles tienen problemas con esto, simplemente no aceptan dicha configuración, y las de escritorio, aunque funcionan, están maldiciendo maliciosamente. Primero, reconfiguraremos el servidor para que ya no requiera un certificado.
verify-client-cert none
A continuación, agregamos a la configuración del cliente
setenv CLIENT_CERT 0
Eso es todo, ahora los clientes no jurarán por un certificado. Es curioso que esta opción esté oculta en la sección de
preguntas y respuestas para iOS . No lo he probado en iOS, pero Android, así como MacOS (
cliente beta ) y Windows aceptan estas configuraciones con una explosión. Solo un
cliente OpenVPN de terceros en Android aún no puede hacer esto (para cuando se escribió este artículo, ya podrían solucionarlo).