Autenticação Multifator RADIUS para VPN e Wi-Fi: 2FA TOTP com o Servidor RADIUS do Casdoor
Para colocar autenticação multifator na frente de uma VPN com RADIUS, o gateway da VPN envia o nome de usuário e a senha para o servidor RADIUS usando PAP, o servidor verifica a senha e responde com um Access-Challenge, o cliente exibe um prompt e o usuário digita o código 2FA de um aplicativo autenticador em uma segunda solicitação. O Casdoor inclui um servidor RADIUS que faz exatamente isso para usuários que configuraram TOTP, então um gateway capaz de exibir um prompt Access-Challenge (o FortiGate SSL VPN é um cujo fabricante documenta isso) obtém uma senha mais um código 2FA sem nenhum software adicional. Wi-Fi com WPA2/WPA3-Enterprise é diferente: 802.1X roda sobre EAP, que não tem lugar para um código digitado, então o Casdoor tem uma opção para pular o código para esses clientes.
Se você quiser informações básicas sobre RADIUS e como ele se compara ao LDAP para dispositivos de rede, leia primeiro RADIUS vs LDAP. Este post trata da parte MFA: o que vai pela linha, quais clientes podem carregar um segundo fator e como ativá-lo no Casdoor.
Quais clientes podem fazer MFA RADIUS com o Casdoor
A tabela lista o que cada fabricante documenta. "Suporte a Challenge" significa que o cliente exibe o prompt Access-Challenge ao usuário e envia a resposta de volta. Onde a página do fabricante que verificamos não diz, a tabela diz isso em vez de adivinhar.
| Cliente | Método de autenticação RADIUS a usar com o Casdoor | Suporte a Access-Challenge | Notas |
|---|---|---|---|
| FortiGate SSL VPN | PAP (defina o método para PAP, ou deixe Default, que tenta PAP primeiro) | Sim, conforme a Fortinet | A Fortinet diz que o SSL VPN encaminha o challenge ao cliente e aguarda a resposta |
| FortiGate IPsec VPN (incluindo FortiClient) | PAP | Não encaminhado por padrão | A correção da Fortinet requer MS-CHAP no servidor RADIUS, que o Casdoor não suporta; use SSL VPN ou pule o MFA |
| Cisco ASA (AnyConnect / Secure Client) | PAP, o padrão do ASA para todos os tipos de conexão | Não declarado no guia de configuração RADIUS do ASA | Não habilite password-management no tunnel group: isso muda o ASA para MS-CHAPv2 |
| OpenVPN Access Server | PAP (ele também oferece CHAP e MS-CHAPv2) | Não declarado na página de configurações RADIUS | Accounting é um toggle separado, porta padrão 1813 |
| pfSense (servidor de autenticação RADIUS, usado pelo seu OpenVPN) | PAP (também MD5-CHAP, MS-CHAPv1, MS-CHAPv2) | Não declarado nos docs da Netgate | Os exemplos OTP da Netgate colocam o código dentro do campo de senha, que o Casdoor não aceita |
| WireGuard | Nenhum | Não aplicável | Peers autenticam apenas com chaves públicas, então não há login para o RADIUS verificar |
| Wi-Fi, WPA2/WPA3-Enterprise (802.1X) | EAP (PEAP, EAP-TTLS etc.) | Sem prompt de código digitado | O Casdoor não implementa EAP; veja a seção Wi-Fi |
Onde uma célula diz "não declarado", teste com o cliente VPN real antes de implantar, e verifique se o prompt aparece e se o código passa.
Por que apenas PAP pode transportar a senha que o Casdoor verifica
RADIUS tem várias formas de enviar uma senha, e elas decidem o que o servidor é capaz de verificar.
Com PAP, o cliente coloca a senha no atributo User-Password, oculta com um hash MD5 do segredo compartilhado e do autenticador da solicitação (RFC 2865, seção 5.2). O servidor reverte isso com o mesmo segredo, obtém a senha em texto claro e pode verificá-la contra um hash armazenado ou um bind LDAP. O Casdoor lê User-Password e executa a mesma verificação de senha que sua página de login.
Com CHAP, o cliente nunca envia a senha. Ele envia um hash da senha e um desafio aleatório. A RFC 2865 afirma claramente que o CHAP precisa da senha do usuário em texto claro no servidor para recalcular esse hash. O MS-CHAPv2 tem a mesma estrutura com um hash NT. Um provedor de identidade que armazena senhas como hashes unidirecionais (a organização integrada do Casdoor usa bcrypt) não consegue verificar nenhum dos dois. O servidor RADIUS do Casdoor só lê User-Password, então uma solicitação CHAP ou MS-CHAPv2 chega sem senha e é rejeitada.
Como a ocultação do PAP é apenas MD5 com o segredo compartilhado, use um segredo aleatório longo, mantenha o RADIUS em uma rede privada ou VPN entre o gateway e o Casdoor, e ative o atributo Message-Authenticator no cliente. O Casdoor verifica Message-Authenticator quando uma solicitação o contém e assina sua resposta nesse caso, o que é a mitigação para Blast-RADIUS (CVE-2024-3596). Os detalhes estão na documentação do servidor RADIUS.
Access-Challenge vs anexar o código à senha
Existem duas maneiras comuns de obter um código 2FA através do RADIUS.
- Access-Challenge. O servidor verifica a senha, depois responde com
Access-Challenge, um atributoStatee umReply-Message. O cliente mostra a mensagem, o usuário digita o código e o cliente envia uma novaAccess-Requestcom o código emUser-Passworde o mesmoState. A seção 4.4 da RFC 2865 também diz o que acontece em um cliente sem suporte a desafios: ele DEVE tratar oAccess-Challengecomo umAccess-Reject. - Código anexado à senha. O usuário digita
password123456no único campo de senha, e o servidor separa os últimos seis dígitos. Isso funciona com qualquer cliente, motivo pelo qual produtos criados para gateways mais antigos oferecem essa opção.
O Casdoor implementa apenas a primeira opção. Aqui está o fluxo no seu servidor RADIUS (radius/server.go):
- A primeira
Access-Requestdeve conter a senha correta. Um usuário com MFA ativada recebeAccess-Challenge, umStatealeatório e oReply-Messageplease enter OTP. - O
Stateé válido por 120 segundos e pode ser usado uma vez. Ele está vinculado à organização e ao nome de usuário da primeira solicitação. - A segunda
Access-Requestdeve conter aqueleStatee o código TOTP de seis dígitos do aplicativo autenticador do usuário emUser-Password. O Casdoor verifica o código contra o segredo TOTP do usuário e respondeAccess-AcceptouAccess-Reject. - Códigos incorretos contam para o limite de tentativas de login fracassadas da aplicação do usuário (5 tentativas e congelamento de 15 minutos por padrão), separadamente das senhas incorretas.
Duas consequências se seguem. Um cliente que só pode fazer "senha mais código em um campo" falhará, porque o Casdoor verifica toda a string como a senha. E apenas TOTP funciona via RADIUS: códigos SMS e e-mail exigem que o Casdoor envie uma mensagem após a etapa da senha, o que o servidor RADIUS não faz. Um usuário cujo único método MFA é SMS ou e-mail recebe o desafio e depois uma rejeição, então faça com que usuários RADIUS configurem um aplicativo autenticador.
Wi-Fi: 802.1X e WPA-Enterprise
Em Wi-Fi com WPA2-Enterprise ou WPA3-Enterprise, o ponto de acesso não coleta uma senha por si só. Ele retransmite uma conversa EAP entre o dispositivo (o supplicant) e o servidor RADIUS, e o RADIUS transporta os pacotes EAP em atributos EAP-Message. Nessa configuração, Access-Challenge já está em uso: cada ida e volta da troca EAP é um par Access-Request e Access-Challenge (RFC 3579). A RFC 3579 também diz que uma mensagem contendo EAP-Message não deve incluir Reply-Message, então não há campo para "please enter OTP" e nenhum diálogo no celular ou laptop para digitar um código.
Dois pontos práticos para o Casdoor:
- O servidor RADIUS do Casdoor não implementa EAP. Um ponto de acesso não pode falar diretamente com ele para WPA-Enterprise. Você precisa de um servidor EAP na frente que termine o túnel TLS e encaminhe uma solicitação PAP simples. O FreeRADIUS pode fazer isso com EAP-TTLS e PAP como método interno, encaminhando a solicitação interna para outro servidor RADIUS, e os dispositivos devem ser configurados para TTLS com PAP dentro. PEAP com MS-CHAPv2, o padrão em muitos dispositivos, não funcionará contra o Casdoor pela razão mencionada na seção PAP.
- Para esses usuários, ative Skip MFA for RADIUS na organização. O Casdoor então aceita usuários que têm MFA após a verificação da senha sozinha. A MFA na página de login web não é afetada.
Portas, segredo compartilhado e contabilização
A RFC 2865 atribui a porta UDP 1812 à autenticação RADIUS, e a RFC 2866 atribui a 1813 à contabilização. O Casdoor escuta em uma porta UDP, radiusServerPort, e trata tanto Access-Request quanto Accounting-Request lá. Portanto, aponte a contabilização do gateway para a mesma porta da autenticação (1812 por padrão), não para 1813, ou os pacotes de contabilização não chegarão a lugar nenhum. Se o Casdoor estiver rodando em um container, publique a porta como UDP, por exemplo -p 1812:1812/udp.
O segredo compartilhado é um valor para todos os clientes, radiusSecret. Todos os gateways que falam com o Casdoor usam-no.
Para a contabilização, o Casdoor registra mensagens Start, Interim-Update e Stop em seu banco de dados (tabela radius_accounting), com o ID da sessão, tempo de sessão, endereço NAS, IP enquadrado e contadores de bytes e pacotes. Ele só faz isso para organizações com RADIUS ativado.
Configurar o Casdoor
1. Configure as opções do RADIUS. Em conf/app.conf, ou como variáveis de ambiente com os mesmos nomes:
radiusServerPort = 1812
radiusDefaultOrganization = "my-company"
radiusSecret = "a-long-random-string-shared-with-the-gateway"
radiusDefaultOrganization é a organização que o Casdoor usa quando uma solicitação não tem o atributo Class. Se o seu gateway não puder adicionar um atributo Class às suas solicitações, essa configuração decide quais usuários da organização fazem login via RADIUS. Todas as chaves estão listadas na referência de configuração.
2. Ative o RADIUS para a organização. Na página de edição da organização, ative Enable RADIUS. Está desativado por padrão e apenas administradores globais podem alterá-lo. Enquanto estiver desativado, o Casdoor rejeita todas as Access-Request para essa organização e ignora sua contabilidade.
3. Decida sobre MFA para RADIUS. Deixe Skip MFA for RADIUS desativado para gateways VPN que suportam Access-Challenge. Ative-o para uma organização cujos clientes RADIUS não conseguem responder a um desafio, como Wi-Fi WPA-Enterprise.
4. Coloque os usuários no TOTP. Os usuários configuram um aplicativo autenticador em sua página de perfil, conforme descrito em autenticação multifator. Para torná-lo obrigatório, adicione o item TOTP com a regra Required nos itens MFA da organização. Observe a ordem: um usuário que ainda precisa configurar o MFA obrigatório ou alterar a senha primeiro é rejeitado via RADIUS até concluir isso na página de login do Casdoor.
5. Teste pela linha de comando. O radclient do FreeRADIUS envia solicitações PAP e imprime a resposta:
echo 'User-Name = "alice", User-Password = "her-password"' \
| radclient -x casdoor.example.com:1812 auth a-long-random-string-shared-with-the-gateway
Para um usuário com TOTP, você deve ver Access-Challenge com um State e o Reply-Message. Envie o código de volta com esse State dentro de 120 segundos:
echo 'User-Name = "alice", User-Password = "123456", State = 0x...' \
| radclient -x casdoor.example.com:1812 auth a-long-random-string-shared-with-the-gateway
Cole o valor State da primeira resposta no lugar de 0x.... Um Access-Accept significa que a configuração está correta, e o gateway é o próximo passo.
Se você também quiser que o Casdoor use um servidor RADIUS externo como segundo fator para seu próprio login web, isso é a direção oposta e é coberto pelo provedor MFA RADIUS.
Referências
- RFC 2865: Remote Authentication Dial In User Service (RADIUS)
- RFC 2866: RADIUS Accounting
- RFC 3579: RADIUS Support for EAP
- Fortinet: Difference in RADIUS Access-Challenge handling between SSL VPN and IPsec VPN
- FortiOS 7.6.5: Configuring a RADIUS server
- Cisco ASA 9.22: RADIUS servers for AAA
- OpenVPN Access Server: Authentication
- pfSense: RADIUS authentication servers
- WireGuard
- FreeRADIUS
inner-tunnelvirtual server - Servidor RADIUS do Casdoor