¿Cómo habilitar la autenticación de 2 factores usando Google Authenticator para el acceso openVPN basado en archivos .ovpn?

11

Tengo una configuración de openVPN donde los usuarios no tienen cuentas de shell en la máquina virtual Debian que ejecuta openVPN. Todos los artículos que encontré mientras busqué en Google tienen instrucciones de configurar Google Authenticator para un usuario clásico * nix (por ejemplo, necesita ejecutar el binario Authenticator en el directorio de inicio del usuario).

¿Existe un documento que explique cómo integrar Google Authenticator para servidores openvpn que se autentican basándose únicamente en los .ovpnarchivos utilizados en el lado del cliente?

Miré https://github.com/evgeny-gridasov/openvpn-otp , pero aún requiere la configuración de Google Authenticator.

Animesh
fuente
¿El problema es la inscripción del autenticador de Google o la necesidad de ingresar una contraseña?
cornelinux

Respuestas:

4

No. Por supuesto que no puedes hacer eso. Esto derrotaría el propósito mismo de 2FA. Su servidor debe tener una forma de verificar las credenciales del usuario, y esta información no debe enviarse a través de la red (es decir, no puede usar únicamente el archivo client.ovpn).

Si bien no necesariamente tiene que crear usuarios de Unix, debe permitir que sus usuarios instalen sus códigos de verificación en el servidor. Puede usar sftp con usuarios virtuales utilizando su certificado ya emitido, https con autorización del lado del cliente (mutuo), CIFS (samba), o bien viejo ftp con extensión TLS o cualquier otra forma que le permita al servidor conocer los códigos de verificación creados por los usuarios . El canal de comunicación debe ser seguro (cifrado || local).

Naturalmente, si sus usuarios cargan sus propios archivos, no puede usar las credenciales basadas en archivos agregados que usa openvpn-otp. Afortunadamente, tenemos otra opción (y mucho mejor) mediante el uso de linux excelente módulo de seguridad pam.

En primer lugar, debe recopilar los archivos de usuario creados por google-authenticator en un directorio mediante uno de los métodos mencionados anteriormente. En nuestro caso será / etc / google-auth.

Usted debe cumplir sola identificación de usuario para todos los archivos aquí, porque no tiene usuarios reales. Deja que sea abierto . Los permisos deben ser 0400 (-r --------). A Pam no le gustan las credenciales legibles del mundo / grupo (ciertamente). Puede aplicar esto fácilmente con samba, apache, ftp o, en el peor de los casos, utilizando una pestaña cron (no recomendado).

Para fines de prueba, solo haga esto:

mkdir /etc/google-auth
apt-get install libpam-google-authenticator
google-authenticator
# set up as you wish, save image and/or codes
mv ~/.google_authenticator /etc/google-auth/some_username
chown -R openvpn /etc/google-auth

Después de eso, le pide a openvpn que se autentique contra libpam, que tiene su propio módulo de autenticación de google. Agregue esto a su archivo de servidor openvpn:

plugin /usr/lib/openvpn/openvpn-plugin-auth-pam.so openvpn

Esto dice que usaremos el método de autenticación de pam con la identificación de pam auth openvpn .

Ahora, cree la configuración de pam para openvpn. Edite /etc/pam.d/openvpn:

auth    requisite       /lib/security/pam_google_authenticator.so secret=/etc/google-auth/${USER}  user=openvpn
account    required     pam_permit.so

Aquí decimos que sin una autenticación exitosa de Google fallamos de inmediato (requisito), estamos usando un archivo secreto especial en lugar del predeterminado $ HOME / .google_authenticator (secret =) y accedemos a los archivos como usuario openvpn ya que no hay un usuario real asociado con nuestros usuarios En la siguiente línea, solo decimos que permitimos que todos se conecten después de una autenticación exitosa. Por supuesto, debe implementar su propia política de permisos aquí. Puede controlar los usuarios permitidos por archivo, mysql db o ldap con los respectivos módulos pam.

Agregue esto a su archivo de cliente openvpn

   auth-user-pass
   auth-nocache
   reneg-sec 0

Usamos auth-user-pass para permitir que el cliente openvpn solicite nombre de usuario y contraseña. No nos gusta el almacenamiento en caché ("contraseña" está cambiando) y la renegociación periódica es mala para nosotros por la misma razón.

Después de eso, debería poder conectarse sin openvpn-otp. Tenga en cuenta que este es un método mucho más flexible, ya que puede implementar reglas muy complejas en los archivos de control de pam si lo desea. Puede habilitar / deshabilitar usuarios basados ​​en su directorio mysql o ldap sin tocar esos certificados, por ejemplo.

goteguru
fuente
1

Configuración: Servidor OpenVPN con 2FA (Google Authenticator) en Ubuntu Server 18.04.4 LTS para Raspberry Pi Hardware: Raspberry Pi 3 Modelo B + Rev 1.3

  • tiene que iniciar sesión con un usuario de Linux sin una configuración de inicio de sesión 2FA activa (mi caso es alguien)
  • ingrese los siguientes comandos
sudo apt install libqrencode3 libpam-google-authenticator
google-authenticator
sudo mv /home/someuser/.google_authenticator /etc/google-auth/someuser
sudo chown -R root /etc/google-auth
  • agregue el siguiente archivo al archivo de configuración de openvpn (en mi caso /etc/openvpn/server/server.conf)
plugin /usr/lib/aarch64-linux-gnu/openvpn/plugins/openvpn-plugin-auth-pam.so  openvpn
  • cree el archivo /etc/pam.d/openvpn y complételo con el siguiente contenido
# Google Authenticator
auth    requisite       /lib/aarch64-linux-gnu/security/pam_google_authenticator.so secret=/etc/google-auth/someuser user=root
account    required     pam_permit.so
  • agregue las siguientes 3 líneas a su archivo de cliente openvpn
auth-user-pass
auth-nocache
reneg-sec 0
  • reinicie el servicio openvpn y ejecute una prueba
systemctl restart openvpn@server
  • cuando se conecta con el cliente OpenVPN (en Windows 10) obtiene un inicio de sesión adicional (Usuario: usuario / Contraseña: 'OTP de Google Authenticator')
Wolfgang Reidlinger
fuente