Configurar OpenVPN para autenticar con LinOTP
TL;DR
LinOTP puede aportar autenticación de dos factores (2FA) a OpenVPN usando PAM. Instalando pam_py_linotp y libpam-python en el servidor OpenVPN y configurando los archivos PAM y la configuración de OpenVPN, lograrás exigir tanto certificados de cliente como tokens OTP. Esta guía ofrece pasos detallados, alternativas, verificación y listas de comprobación para administradores.
Introducción
Este howto muestra cómo configurar OpenVPN para autenticar usuarios contra el backend de autenticación LinOTP. Así podrás levantar tu VPN usando autenticación de dos factores con distintos tipos de tokens OTP.
Si solo tienes unos pocos usuarios o dispositivos y usar el smartphone como token te conviene, quizá esta guía te sea suficiente. Si, en cambio, necesitas gestionar varios usuarios con distintos tokens físicos o virtuales, sigue leyendo.
Resumen del flujo
- Instalar y configurar LinOTP (backend de OTP).
- Instalar un módulo PAM que hable con LinOTP (pam_py_linotp).
- Configurar OpenVPN para usar autenticación PAM.
- Probar, endurecer y desplegar.
Requisitos previos
- Servidor Linux con privilegios sudo o root.
- OpenVPN ya instalado (servidor y clientes).
- Certificados CA, servidor y cliente generados.
- LinOTP instalado en la misma u otra máquina accesible por URL.
Importante: disponer de backups de tus archivos de configuración antes de modificar /etc/pam.d/ o /etc/openvpn/.
Instalación y puesta en marcha de LinOTP (breve)
LinOTP puede instalarse mediante paquetes Debian/Ubuntu o vía Python Package Index (pip). Para pruebas rápidas, usar pip puede ser más cómodo; en producción recomienda revisarse la guía oficial y empaquetado de la distribución.
Nota: puedes instalar LinOTP en la misma máquina que OpenVPN para simplificar la redación de la URL de validación (localhost), o alojarlo en un servidor separado por motivos de escalabilidad y seguridad.
Configurar PAM para LinOTP
Hay varias formas de autenticar contra LinOTP: Web API, RADIUS o un módulo PAM. LinOTP ofrece pam_linotp en C, pero compilar C y manejar dependencias puede ser incómodo. Por eso usamos pam_py_linotp, un módulo PAM en Python.
Instala el módulo pam_py_linotp en el servidor OpenVPN. Puedes descargar, descomprimir e instalar manualmente:
tar -ztf pam_py_linotp-0.1.tar.gz
cd pam_py_linotp-0.1/
sudo python setup.py install
Alternativamente, instala con pip (más rápido):
sudo pip install pam_py_linotp
O copia el módulo Python a una ubicación apropiada:
cd pam_py_linotp-0.1/
cp src/ pam_linotp.py /lib/security
Para usar este módulo necesitas libpam-python, que integra módulos Python en la pila PAM:
sudo apt-get install libpam-python
o en distribuciones basadas en RPM:
yum install libpam-python
Para facilitar la reutilización en otros servicios (ssh, gdm, kdm), crea un archivo de pila PAM apilable llamado common-linotp con este contenido:
auth [success=1 default=ignore] pam_python.so /lib/security/pam_linotp.py \
debug url=https://localhost/validate/check
auth requisite pam_deny.so
auth required pam_permit.so
Notas sobre common-linotp:
- El primer parámetro tras pam_python.so es el módulo Python que instalaste o copiaste.
- Ajusta la URL a donde esté el servidor LinOTP (protocolo https/http y puerto). Si LinOTP está en la misma máquina que OpenVPN, puedes usar https://localhost/validate/check.
Configurar OpenVPN para usar PAM
En el cliente, configura client.ovpn así (adapta nombres de servidor y certificados):
client
dev tun
proto udp
remote your.server.com 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert client.crt
key client.key
comp-lzo
verb 3
auth-user-pass
En el servidor, un ejemplo de server.conf (adapta certificados e IPs):
port 1194
proto udp
dev tun
ca ca.crt
cert server.crt
key server.key
dh dh2048.pem
server 192.168.42.0 255.255.255.0
ifconfig-pool-persist ipp.txt
keepalive 10 120
comp-lzo
persist-key
persist-tun
status openvpn-status.log
verb 3
plugin /usr/lib/openvpn/openvpn-auth-pam.so openvpn
Finalmente edita /etc/pam.d/openvpn para que incluya common-linotp y permita sesiones sin cuentas locales:
@include common-linotp
session sufficient pam_permit.so
account sufficient pam_permit.so
Explicación: session y account usan pam_permit.so para evitar tener que crear cuentas de usuario locales en el servidor OpenVPN. La autenticación primaria se realiza a través del módulo pam_py_linotp que consulta LinOTP.
Cuando el usuario introduce el OTP correcto (y PIN si se requiere), la sesión VPN se establece.
Importante: asegúrate de que openvpn-auth-pam.so apunte al archivo PAM correcto (nombre de servicio ‘openvpn’). El primer argumento de openvpn-auth-pam.so debe coincidir con el fichero PAM en /etc/pam.d/.
Endurecimiento y buenas prácticas de seguridad
- Requiere tanto certificado de cliente como OTP: mantiene control por dispositivo y por usuario.
- Usa tls-auth o tls-crypt para mitigar ataques UDP y reducir estado de sesión indeseado.
- Habilita cifrados modernos (ej.: AES-256-GCM) y deshabilita TLS < 1.2 si tu entorno lo permite.
- Mantén LinOTP y OpenVPN en máquinas separadas para mejorar aislamiento y escalabilidad cuando haya muchos usuarios.
- Restringe accesos al endpoint de LinOTP con firewall y canaliza tráfico por HTTPS con certificados válidos.
Alternativas y comparativa rápida
- RADIUS: integra LinOTP a través de un servidor RADIUS (freeradius). Ventaja: compatibilidad amplia con appliances y servicios.
- API Web: algunas integraciones usan directamente la API HTTP/HTTPS de LinOTP desde aplicaciones.
- pam_linotp en C: módulo nativo en C ofrecido por LinOTP — menor overhead pero requiere compilación.
Cuándo elegir cada opción:
- Pocos usuarios / smartphones: Web API o aplicación móvil.
- Infraestructura grande / appliances: RADIUS.
- Si prefieres evitar compilación y usar Python: pam_py_linotp.
Diagnóstico y solución de problemas comunes
- Error: “PAM: Authentication failure” → revisa /var/log/auth.log y logs de LinOTP. Verifica la URL y que LinOTP responde.
- OpenVPN no solicita credenciales → comprueba que la opción auth-user-pass está presente en el cliente y que openvpn-auth-pam.so está instalado en el servidor.
- Tiempo de espera / 504 → revisa conectividad entre OpenVPN y LinOTP (puerto, firewall).
- Token no válido → asegúrate de que el reloj del cliente/servidor esté sincronizado (NTP), sobre todo si se usan tokens TOTP.
Checklist por rol
Administrador de VPN:
- Respaldar /etc/pam.d/openvpn y /etc/openvpn/server.conf
- Instalar libpam-python y pam_py_linotp
- Verificar URL de LinOTP y certificados HTTPS
- Habilitar tls-auth/tls-crypt y cifrados fuertes
- Probar con usuario de laboratorio
Administrador de LinOTP:
- Registrar tokens de prueba y usuarios
- Comprobar logs de validación
- Configurar políticas de PIN y bloqueo de intentos
Usuario final:
- Tener instalado app/token físico o móvil
- Recibir instrucciones para primer acceso y PIN
Modelo mental y heurística rápida
Piensa en tres capas: identidad del dispositivo (certificado), identidad del usuario (cuenta), y prueba dinámica (OTP). Rechaza si cualquiera de las tres falla.
Glosario de una línea
- LinOTP: backend de gestión y verificación de tokens OTP.
- PAM: Pluggable Authentication Modules, sistema de autenticación modular en Linux.
- OTP: One-Time Password, contraseñas de un solo uso.
Cuándo esto podría fallar (contraejemplos)
- Usuarios sin token registrado no podrán autenticarse.
- Relojes desincronizados en tokens TOTP causarán rechazos frecuentes.
- Si el servidor LinOTP cae y no hay redundancia, la autenticación central falla.
Pruebas de aceptación (sencillas)
- Un cliente con certificado válido y OTP correcto establece la VPN.
- Un cliente con certificado válido pero OTP incorrecto no puede conectar.
- Un cliente sin certificado válido no puede establecer la conexión, incluso con OTP correcto.
Conclusión
Hemos configurado un servidor OpenVPN que autentica con tokens OTP gestionados por LinOTP, combinando la seguridad de certificados cliente y la verificación dinámica de usuario. Esta combinación mejora significativamente la seguridad de acceso remoto y permite gestionar múltiples tipos de tokens.
Resumen final: usa certs + OTP, mantén LinOTP accesible y seguro, monitorea fallos y considera RADIUS si necesitas compatibilidad empresarial amplia.
Materiales similares

Ver publicaciones que te gustaron en Instagram

Recuperar una cuenta de Facebook hackeada

Error 0x80070718 en Windows 10 — Guía de solución

Cómo usar CoinDCX: comprar y vender criptomonedas
