Como configurar o OpenVPN para autenticar com LinOTP
TL;DR
Use LinOTP como backend de OTP para adicionar autenticação de dois fatores ao OpenVPN. Instale o módulo PAM Python (pam_py_linotp) e libpam-python no servidor OpenVPN, configure um arquivo PAM empilhável (common-linotp) apontando para a API do LinOTP e inclua esse arquivo em /etc/pam.d/openvpn. Combine isso com certificados de cliente no OpenVPN para autenticação máquina+usuário.
Introdução
Este guia mostra passo a passo como configurar o OpenVPN para autenticar usuários contra o backend LinOTP. Resultado: sua VPN exige um token OTP (One-Time Password) gerenciado pelo LinOTP — ideal para cenários com vários tipos de tokens e gestão centralizada.
Definições rápidas:
- LinOTP: um servidor de gestão de tokens OTP e API de validação.
- PAM: Pluggable Authentication Modules, sistema de autenticação do Linux.
Important: se você só tem poucos usuários e usa o smartphone como token, soluções mais simples podem bastar. Este guia foca em ambientes com vários usuários/tokens.
Pré-requisitos
- Acesso root ou sudo no servidor OpenVPN (onde ficará o PAM).
- OpenVPN instalado e funcional.
- LinOTP instalado em um servidor acessível (pode ser o mesmo que o OpenVPN).
- Certificados TLS/SSL para OpenVPN (CA, server.crt, server.key).
- Ferramentas: pip, tar, apt/yum dependendo da distribuição.
Instalar e configurar o LinOTP
Você pode instalar LinOTP via pacotes (Debian/Ubuntu) ou pelo Python Package Index para um rápido ambiente de teste. Siga a documentação oficial do projeto para instalação e inicialização do serviço; aqui assumimos que o endpoint de validação ficou disponível em http(s)://seu-linotp:porta/validate/check.
Nota: se instalar LinOTP no mesmo host do OpenVPN, a URL pode usar https://localhost/validate/check.
Configurar PAM para usar LinOTP
Há várias formas de autenticar contra LinOTP: Web API, RADIUS ou PAM. Aqui usamos um módulo PAM em Python: pam_py_linotp.
Passos resumidos para instalar pam_py_linotp:
- Se tiver o tarball:
tar -ztf pam_py_linotp-0.1.tar.gz
cd pam_py_linotp-0.1/
sudo python setup.py install
- Ou instale via pip (mais rápido):
sudo pip install pam_py_linotp
- Alternativa: copie o módulo Python diretamente para /lib/security:
cd pam_py_linotp-0.1/
cp src/ pam_linotp.py /lib/security
Para permitir que o PAM carregue módulos Python, instale libpam-python:
sudo apt-get install libpam-python
# ou
yum install libpam-python
Criamos um arquivo PAM empilhável chamado common-linotp para reutilizar em serviços como ssh, gdm, kdm e openvpn. Exemplo:
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 importantes:
- O primeiro parâmetro após pam_python.so é o módulo Python (/lib/security/pam_linotp.py).
- Ajuste a URL para o endpoint de validação do LinOTP (http ou https e porta).
- Mantenha a política de sucesso/falha conforme suas necessidades de segurança.
Configurar o OpenVPN para usar PAM
No cliente, um arquivo client.ovpn mínimo pode ser:
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
Adapte servername e nomes de certificado.
No servidor OpenVPN, um server.conf típico:
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
Ajuste nomes de certificados, rota/IP pool e caminho do plugin conforme a sua distribuição (p.ex. /usr/lib64/… em alguns sistemas).
Integrar o PAM do OpenVPN
Edite /etc/pam.d/openvpn para incluir o arquivo common-linotp criado:
@include common-linotp
session sufficient pam_permit.so
account sufficient pam_permit.so
Aqui usamos pam_permit.so para sessão e conta, evitando a necessidade de criar contas locais para cada usuário VPN. A autenticação principal fica a cargo do PAM que chama o LinOTP.
Passo a passo rápido (Playbook)
- Instale LinOTP e confirme que o endpoint de validação responde.
- No servidor OpenVPN, instale libpam-python.
- Instale pam_py_linotp (pip ou setup.py).
- Crie /etc/pam.d/common-linotp apontando para o endpoint de LinOTP.
- Atualize /etc/pam.d/openvpn para incluir common-linotp.
- Configure OpenVPN para usar openvpn-auth-pam.so.
- Teste com um cliente: verifique certificado + OTP.
Checklist por função
Administrador:
- LinOTP em serviço e acessível pela rede.
- Certificados (CA, server, client) válidos e distribuídos.
- libpam-python e pam_py_linotp instalados no servidor OpenVPN.
- /etc/pam.d/common-linotp configurado corretamente.
- /etc/pam.d/openvpn inclui common-linotp.
- openvpn-auth-pam.so configurado no server.conf.
Usuário VPN:
- Cliente OpenVPN configurado com client.crt/key e auth-user-pass ativado.
- Token OTP ativo no LinOTP (ou app para smartphone configurado).
- Sabe informar PIN + OTP se sua política exigir PIN + token.
Depuração e solução de problemas
- Verifique logs do OpenVPN (openvpn-status.log e syslog/journal):
- sudo journalctl -u openvpn
- grep openvpn /var/log/syslog
- Ative mais verbosidade no OpenVPN (verb 5-6) temporariamente.
- Teste o endpoint LinOTP diretamente (curl) para validar resposta:
curl -k -X POST 'https://localhost/validate/check' -d 'user=alice&otp=123456'
- Erros comuns:
- Módulo pam_python não encontrado -> verifique libpam-python e caminho do módulo.
- URL de validação errada -> cheque protocolo, host e porta.
- Permissões incorretas em /lib/security/pam_linotp.py -> ajuste ownership e modo (root:root, 644).
Important: aumente logging no módulo pam_py_linotp (se suportado) apenas durante diagnóstico e reverta depois para evitar logs excessivos de credenciais.
Fluxo de decisão (visão rápida)
flowchart TD
A[Cliente inicia conexão] --> B{Certificado do cliente válido?}
B -- Não --> Z[Conexão rejeitada]
B -- Sim --> C[OpenVPN solicita usuário/senha]
C --> D[PAM chama pam_py_linotp]
D --> E{LinOTP valida OTP}
E -- Não --> Z
E -- Sim --> F[OpenVPN estabelece túnel]
F --> G[Fim]
Critérios de aceitação
- O cliente estabelece túnel apenas se: certificado válido + OTP válido.
- Não é necessário criar contas Unix locais para cada usuário VPN (uso de pam_permit para sessão/conta).
- Resposta de validação do LinOTP em tempo aceitável (latência de autenticação adequada à política interna).
Glossário (1 linha cada)
- OTP: senha usada uma vez, gerada por token físico ou app.
- PAM: mecanismo modular de autenticação do Linux.
- LinOTP: servidor que gerencia tokens OTP e expõe API de validação.
Segurança e boas práticas
- Use HTTPS entre servidor OpenVPN e LinOTP.
- Proteja o acesso ao diretório /lib/security e aos módulos PAM.
- Monitore tentativas de autenticação falhas e bloqueie conforme política.
- Mantenha LinOTP e OpenVPN atualizados.
Resumo
Implementar LinOTP com OpenVPN via pam_py_linotp fornece autenticação multifator robusta: é preciso que a máquina possua o certificado correto e que o usuário apresente o OTP válido. Use certificados para autenticação do dispositivo e LinOTP para autenticidade do usuário. Teste cada parte isoladamente (certificados, endpoint LinOTP, PAM) antes de colocar em produção.
Notas finais
Se sua infraestrutura exige maior escalabilidade ou integração com serviços de diretório, considere usar RADIUS entre OpenVPN e LinOTP ou integrar LinOTP a um identity provider. Para ambientes menores, avaliar soluções baseadas em aplicativos de autenticação pode reduzir complexidade.
Materiais semelhantes

Como ver posts curtidos no Instagram

Recuperar conta do Facebook invadida

Corrigir erro 0x80070718 no Windows 10

CoinDCX: comprar e vender cripto na Índia
