FreeRadius - Tutorial e Dicas
Pra que serve um servidor Radius e o software FreeRadius?
Um servidor Radius é o coração da autenticação, autorização e auditoria (AAA) para sistemas próximos à camada de rede, ele é o padrão, de facto standard para armazenar e gerenciar usuários nesses cenários. O que seriam esses sistemas? Entram como sistemas próximos a camada de rede os Captive Portals e Wi-Fi com autenticação WPA-Enterprise (padrão 802.1x). Mas além disso, o Radius também fornece essa funcionalidade para autenticação de usuários UNIX e Linux, por exemplo.
De forma resumida, um servidor Radius serve para:
- armazenar credenciais (logins e senha) de usuários #autenticação #authentication de forma centralizada, em um só lugar;
- armazenar dados de permissão para os usuários, seus IPs na rede e outros metadados #authorization #autorização centralizados, em um só lugar;
- armazenar e gerenciar a quantidade de logins que um usuário fez #accounting #auditoria;
Um sistema Radius em funcionamento ocorre entre as seguintes partes.

Quais os usos de um servidor Radius como o FreeRadius?
- Armazenar e verificar senhas para uma rede Wireless WPA-Enterprise 802.1x
- Armazenar e verificar senhas para um Captive Portal
- Armazenar e verificar senhas para redes discadas dial-up PPP
- Armazenar e verificar senhas para uma VPN (OpenVPN)
- Armazenar e verificar senhas para usuários de um firewall (como o pfSense)
- Armazenar e verificar senhas para uma rede física implementada com o protocolo 802.1x
Quais Protocolos o FreeRadius suporta na comunicação Usuário x Cliente Radius (NAS)?
Baseadas em login e senha
- PAP
- CHAP
- Digest
- MS-CHAP
Baseadas em EAP
- PEAP
- EAP-MSCHAPv2
- Cisco LEAP
- EAP-GTC
- EAP-MD5
- EAP-PWD
De que forma o FreeRadius armazena as senhas dos usuários?
- Clear-text
- NT hash (ntlm_auth)
- MD5 hash
- Salted MD5 hash
- SHA1 hash
- Salted SHA1 hash
- Unix Crypt
Dependendo do protocolo escolhido na comunicação usuário x cliente radius (NAS), se é obrigado a armazenar a senha de uma forma específica. Essa tabela mostra a relação:
Clear-text | NT hash (ntlm_auth) | MD5 hash | Salted MD5 hash | SHA1 hash | Salted SHA1 hash | Unix Crypt | |
PAP | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
CHAP | ✓ | x | x | x | x | x | x |
Digest | ✓ | x | x | x | x | x | x |
MS-CHAP | ✓ | ✓ | x | x | x | x | x |
PEAP | ✓ | ✓ | x | x | x | x | x |
EAP-MSCHAPv2 | ✓ | ✓ | x | x | x | x | x |
Cisco LEAP | ✓ | ✓ | x | x | x | x | x |
EAP-GTC | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
EAP-MD5 | ✓ | x | x | x | x | x | x |
EAP-PWD | ✓ | x | x | x | x | ✓ | ✓ |
Radius como um Authentication Oracle
O Radius pode agir apenas como um conversor de protocolos, mas buscar os usuários de um sistema externo como o módulo PAM do Linux, um servidor LDAP ou ntlm_auth.
Quando operando desse modo, o FreeRadius passa a ter as seguintes limitações de uso de protocolos:
PAM | LDAP "bind as user" | ntlm_auth | |
PAP | √ | √ | √ |
CHAP | x | x | x |
Digest | x | x | x |
MS-CHAP | x | x | √ |
PEAP | x | x | √ |
EAP-MSCHAPv2 | x | x | √ |
Cisco LEAP | x | x | x |
EAP-GTC | x | x | x |
EAP-MD5 | x | x | x |
EAP-PWD | x | x | x |
Armazenando senhas no FreeRadius
O FreeRadius pode guardar senhas de diferentes formas em seu banco de dados interno ou num banco de dados externo. Dependendo da escolha da forma de guardar senhas, você precisa usar um protocolo específico de comunicação.
Esse artigo com uma ótima tabela explica quais formas e protocolos são compatíveis com os tipos de hash:
http://deployingradius.com/documents/protocols/compatibility.html
Atualmente quase todos os métodos de hashing de senhas no FreeRadius não são recomendados. O único que se salva é o UnixCrypt:
https://security.stackexchange.com/questions/211/how-to-securely-hash-passwords/31846#31846
Formatos de hashing suportados (e como configurá-los) segundo a documentação oficial:
https://freeradius.org/radiusd/man/rlm_pap.html
Na documentação do FreeRadius também vemos alguns tipos formas de armazenamento de senhas:
https://freeradius.org/radiusd/man/rlm_pap.txt
Utilizando o FreeRadius como servidor de autenticação do PostgreSQL
Adicionar uma linha no arquivo pg_hba.conf, informando o IP do servidor Radius, o shared secret, etc... Um exemplo de configuração
[code]<br>hostssl             all        all        0.0.0.0/0         radius  radiusserver=127.0.0.1 radiussecret=your-super-secret-shared-secred radiusport=1812<br>[/code]
radiusserver é o IP ou DNS do(s) servidor(es) Radius.
radiussecret é a senha que é usada para criar uma conexão segura entre o Radius e o PostgreSQL.
radiusport é a porta de autenticação do Radius (1812 por padrão).
Referências
Tutorial para integrar PostgreSQL com diversos sistemas de autenticação
https://severalnines.com/blog/integrating-postgresql-authentication-systems
Documentação do pg_hba.conf
https://www.postgresql.org/docs/9.3/auth-pg-hba-conf.html
Multi Factor Authentication no FreeRadius
O FreeRadius suporta multi factor authentication MFA com Google Authenticator.
Opções de protocolos para usar no Radius
Explicação oficial do FreeRadius sobre os protocolos EAP suportados
https://wiki.freeradius.org/protocol/EAP
Uma explicação breve sobre vários protocolos
https://netscout.desk.com/customer/en/portal/articles/2333967-linkrunner-at-802-1x-authentication-eap-types?b_id=1807
Explicação de 2011 sobre PAP, CHAP e MS-CHAP
https://hub.packtpub.com/freeradius-working-authentication-methods/