Guía de tecnologías

Configurar OpenVPN para autenticar con LinOTP

6 min read Seguridad VPN Actualizado 02 Oct 2025
OpenVPN con LinOTP: guía de autenticación OTP
OpenVPN con LinOTP: guía de autenticación OTP

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

  1. Instalar y configurar LinOTP (backend de OTP).
  2. Instalar un módulo PAM que hable con LinOTP (pam_py_linotp).
  3. Configurar OpenVPN para usar autenticación PAM.
  4. 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.

Autor
Edición

Materiales similares

Ver publicaciones que te gustaron en Instagram
Redes sociales

Ver publicaciones que te gustaron en Instagram

Recuperar una cuenta de Facebook hackeada
Ciberseguridad

Recuperar una cuenta de Facebook hackeada

Error 0x80070718 en Windows 10 — Guía de solución
Soporte técnico

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

Cómo usar CoinDCX: comprar y vender criptomonedas
Criptomonedas

Cómo usar CoinDCX: comprar y vender criptomonedas

Ver publicaciones que te gustaron en Instagram
Redes sociales

Ver publicaciones que te gustaron en Instagram

OpenVPN con LinOTP: guía de autenticación OTP
Seguridad VPN

OpenVPN con LinOTP: guía de autenticación OTP