Tabela de conteúdo
|
Montar um ambiente de autenticação utilizando o protocolo 802.1x, com servidor FreeRADIUS e base de autenticação com OpenLDAP. A idéia é não utilizar um supplicant de terceiros, por este motivo vamos utilizar o protocolo MSCHAPv2, compatível com Windows, Linux, FreeBSD e MacOSX. Já adiantando, só existem duas possibilidades deste ambiente funcionar com o OpenLDAP, ou a senha dos usuários estar em texto plano, ou usar o hash NT, ou seja, MD5, SHA1, CRYPT, ou qualquer outro hash simplesmente não vai funcionar.
O ambiente vai possuir as seguintes ferramentas e equipamentos:
Os usuários irão se conectar ao AP, que vai utilizar criptografia WPA2 Enterprise com um servidor Radius de autenticação, utilizando 802.1x para autenticação e o protocolo PEAP/MSCHAPv2 como canal com o FreeRADIUS. O mais recomendado seria utilizar um Supplicant com EAPTTLS/PAP, mas nem sempre isso é tão simples para o usuário, por isso, vamos utilizar o PEAP/MSCHAPv2.
Nossos usuários estarão em uma base OpenLDAP, que receberá conexões do FreeRADIUS utilizando um canal seguro com TLS. O outro ponto importante neste artigo é a questão da mobilidade entre APs usando IAPP (802.11f), onde um usuário será transferido para o AP com sinal mais forte sem a necessidade de renegociação ou nova autenticação.
Primeiro é necessário configurar o AP para apontar para o seu servidor FreeRADIUS (no nosso caso o servidor está no DNS como: radius.exemplo.com.br e IP 200.129.192.94/25), veja abaixo a tela de configuração do AP. Nesta primeira tela temos as informações das 4 possíveis VLANs e suas configurações:
Vamos ativar somente o primeiro, e nele vamos adicionar as informações necessárias para que o AP se comunique com o nosso servidor de autenticação Radius:
As informações que importam nesta tela de configuração são:
uma vez que os APs foram configurados, só precisamos trabalhar nas configurações do servidor.
Para configurar a migração automática entre os APs é necessário que você:
Com essas informações, configure cada AP com as informações dos outros APs como na tela abaixo:
feito isso, basta migrar entre os APs e tudo vai funcionar corretamente.
Primeiro vamos instalar os pacotes necessários do FreeRADIUS no servidor:
# apt-get install freeradius freeradius-ldap
serão instaladas algumas dependências adicionais.
Vamos agora configurar nosso servidor FreeRADIUS para aceitar as autenticações que tiverem origem nos APs que configuramos. Primeiro vamos editar o arquivo clients.conf em /etc/freeradius. Neste arquivo devemos ter em mente que é possível definir inumeros parâmetros de configuração, vamos nos concentrar em um ambiente que funcione de forma simples (podemos especificar uma subrede ou um host diretamente, lembrando que a melhor opção vai ser o que vai "casar", ou seja, a menor rede possível):
# vim /etc/freeradius/clients.conf
client localhost {
ipaddr = 127.0.0.1
secret = testing123
require_message_authenticator = no
nastype = other # localhost isn't usually a NAS...
}
client 200.129.202.132 {
secret = senha_definida_no_servidor_radius
shortname = ap-radius
}
a nossa adição foi apenas do AP (que é o cliente para o FreeRADIUS), as senhas cadastradas aqui são apenas para criação do ambiente e é desencorajado utilizá-las em ambientes de produção, como sugestão para criação de senhas fortes, utilizem o comando makepasswd.
Uma vez que já temos um cliente que pode se autenticar no FreeRADIUS, vamos agora fazer com que o FreeRADIUS consiga de fato autenticar um usuário, para isso, vamos criar primeiro um usuário simples que autentique usando o próprio FreeRADIUS e depois faremos as modificações para autenticação no OpenLDAP.
Para criar um usuário simples com autenticação em texto plano (ClearText), insira a seguinte linha no arquivo /etc/freeradius/users:
# vim /etc/freeradius/users
...
"John Doe" Cleartext-Password := "hello"
Reply-Message = "Hello, %{User-Name}"
este é o exemplo sugerido no próprio FreeRADIUS, neste caso o usuário é John Doe e a senha é 'hello', vamos testar:
# radtest -t pap "John Doe" "hello" localhost 1812 testing123
você irá ver algo como:
Sending Access-Request of id 64 to 127.0.0.1 port 1812 User-Name = "John Doe" User-Password = "hello" NAS-IP-Address = 200.129.192.94 NAS-Port = 1812 rad_recv: Access-Accept packet from host 127.0.0.1 port 1812, id=64, length=37 Reply-Message = "Hello, John Doe"
que foi o que definimos no users. Agora para ter certeza que o usuário foi autenticado corretamente, podemos executar o FreeRADIUS em modo de depuração, em um outro console, primeiro pare o FreeRADIUS:
# /etc/init.d/freeradius stop
depois execute-o em modo de depuração:
# freeradius -X
execute agora o teste de autenticação com o radtest e você verá várias linhas do log, em especial as seguintes:
[pap] login attempt with password "hello" [pap] Using clear text password "hello" [pap] User authenticated successfully
neste caso, estamos usando PAP e o usuário foi autenticado corretamente.
É necessário primeiro instalar o OpenLDAP em um servidor, depois de instalado, se tudo funcionou até agora, você está no caminho certo, devemos configurar o FreeRADIUS para autenticar no OpenLDAP, primeiro vamos editar o módulo do OpenLDAP:
# vim /etc/freeradius/modules/ldap
ldap {
server = "ldap.your.domain"
basedn = "o=My Org,c=UA"
#identity = "cn=admin,o=My Org,c=UA"
#password = mypass
filter = "(uid=%{%{Stripped-User-Name}:-%{User-Name}})"
ldap_connections_number = 5
timeout = 4
timelimit = 3
net_timeout = 1
tls {
start_tls = no
# cacertfile = /path/to/cacert.pem
# cacertdir = /path/to/ca/dir/
# certfile = /path/to/radius.crt
# keyfile = /path/to/radius.key
# randfile = /path/to/rnd
# require_cert = "demand"
}
dictionary_mapping = ${confdir}/ldap.attrmap
edir_account_policy_check = no
#set_auth_type = yes
}
este é o arquivo padrão, você deve substituir os campos pelas informações do seu servidor OpenLDAP (dentre as configurações fique atento a de comunicação com TLS, caso seu servidor armazene as senhas em texto plano). Neste caso anterior a configuração do TLS, nosso arquivo vai ficar da seguinte forma:
# vim /etc/freeradius/modules/ldap
ldap {
server = "ldap.exemplo.com.br"
basedn = "dc=exemplo,dc=com,dc=br"
identity = "cn=reader,dc=exemplo,dc=com,dc=br"
password = senha_do_leitor_da_base_ldap
filter = "(uid=%{%{Stripped-User-Name}:-%{User-Name}})"
ldap_connections_number = 5
timeout = 4
timelimit = 3
net_timeout = 1
tls {
start_tls = no
}
dictionary_mapping = ${confdir}/ldap.attrmap
edir_account_policy_check = no
set_auth_type = no
}
quando você já tiver ativado o TLS com o OpenLDAP, você pode ativar sua utilização no FreerRADIUS:
# vim /etc/freeradius/modules/ldap
ldap {
server = "ldap.exemplo.com.br"
basedn = "dc=exemplo,dc=com,dc=br"
identity = "cn=reader,dc=exemplo,dc=com,dc=br"
password = senha_do_leitor_da_base_ldap
filter = "(uid=%{%{Stripped-User-Name}:-%{User-Name}})"
ldap_connections_number = 5
timeout = 4
timelimit = 3
net_timeout = 1
tls {
start_tls = yes
require_cert = "allow"
}
dictionary_mapping = ${confdir}/ldap.attrmap
edir_account_policy_check = no
}
ao executar o FreeRADIUS em modo debug, você deve ver a seguinte linha, para ter certeza que o TLS está funcionando:
[ldap] attempting LDAP reconnection [ldap] (re)connect to ldap.exemplo.com.br:389, authentication 0 [ldap] starting TLS
pronto, nossa comunicação com o OpenLDAP está configurada. O próximo passo é ativar o ldap como método de autenticação nos sites, edite o arquivo:
# vim /etc/freeradius/sites-enabled/default
authorize {
...
ldap
...
}
authenticate {
...
Auth-Type LDAP {
ldap
}
...
}
a priori o que interessa é que em authorize, você descomente a linha que contém o ldap e em authenticate, a parte que fala sobre o tipo de autenticação LDAP. Faça o mesmo no arquivo inner-tunnel:
# vim /etc/freeradius/sites-enabled/inner-tunnel
authorize {
...
ldap
...
}
authenticate {
...
Auth-Type LDAP {
ldap
}
...
}
deixe as outras configurações intocadas (não precisa alterar). Vamos agora testar para ter certeza que está tudo funcionando até agora:
# radtest -t mschap teste senha1 localhost 1812 testing123
onde teste, é o nosso usuário da base OpenLDAP, se a reposta for parecida com:
Sending Access-Request of id 151 to 127.0.0.1 port 1812 User-Name = "teste" NAS-IP-Address = 200.129.192.94 NAS-Port = 1812 MS-CHAP-Challenge = 0x2ff26066cb1a2416 MS-CHAP-Response = 0x00010000000000000000000000000000000000000000000000006f252f352fd4c0af86d8c3737866243af03519ca1458866f rad_recv: Access-Accept packet from host 127.0.0.1 port 1812, id=151, length=84 MS-CHAP-MPPE-Keys = 0x00000000000000005610a3a37fcccde5c7d37764aa0b97930000000000000000 MS-MPPE-Encryption-Policy = 0x00000001 MS-MPPE-Encryption-Types = 0x00000006
seu usuário foi autenticado corretamente.
O FreeRADIUS suporta a utilização de VLANs por usuário de forma dinâmica. Em um ambiente mais complexo, podemos ter por exemplo usuários da diretoria que terão acesso a uma VLAN específica (por exemplo 10) e usuários das secretarias com acesso a outra VLAN (por exemplo 172). Esta divisão só faz sentido se a sua rede possuir roteadores e switches com suporte a VLANs e esta topologia estiver configurada corretamente na rede. Outro detalhe importante é que os equipamentos que faram uso das configurações dinâmicas de VLAN devem ter suporte a esta tecnologia e o AP sugerido no início deste documento não suporta VLANs Dinâmicas. Nesta fase de configurações foram utilizados os equipamentos:
Vamos supor que temos 2 usuários na rede:
Primeiro temos que configurar o FreeRadius para tunelar as respostas para o equipamento que está autenticando. Vamos editar o arquivo:
# vim /etc/freeradius/eap.conf
...
eap {
...
ttls {
...
use_tunneled_reply = yes
...
}
peap {
...
use_tunneled_reply = yes
...
}
...
}
com a resposta tunelada configurada, é necessário alterar as configurações dos usuários. Vamos testar fazendo as alterações diretamente no arquivo de configurações e depois vamos ajustar para funcionar com o OpenLDAP. Vamos criar a entrada dos dois usuários:
# vim /etc/freeradius/users
...
# VLAN 10
"diretor" Cleartext-Password := "senhadiretor"
Tunnel-Type = VLAN,
Tunnel-Medium-Type = IEEE-802,
Tunnel-Private-Group-Id = 0010,
# VLAN 172
"secretaria" Cleartext-Password := "senhasecretaria"
Tunnel-Type = VLAN,
Tunnel-Medium-Type = IEEE-802,
Tunnel-Private-Group-Id = 0172,
Reinicialize o FreeRadius:
# /etc/init.d/freeradius restart
feito isso, tente autenticar-se com o usuário diretor, no log do FreeRadius você deve ver algo como:
... Login OK: [diretor] (from client ap-radius port 0 via TLS tunnel) [peap] Got tunneled reply code 2 Tunnel-Private-Group-Id:0 = "0010" Tunnel-Medium-Type:0 = IEEE-802 Tunnel-Type:0 = VLAN MS-MPPE-Encryption-Policy = 0x00000002 MS-MPPE-Encryption-Types = 0x00000004 MS-MPPE-Send-Key = 0x23de18930fa5e072c58131dd709d5e1b MS-MPPE-Recv-Key = 0xcfe3c04c7178fa79515fb46aff47ce4b EAP-Message = 0x03080004 Message-Authenticator = 0x00000000000000000000000000000000 User-Name = "diretor" [peap] Got tunneled reply RADIUS code 2 Tunnel-Private-Group-Id:0 = "0010" Tunnel-Medium-Type:0 = IEEE-802 Tunnel-Type:0 = VLAN MS-MPPE-Encryption-Policy = 0x00000002 MS-MPPE-Encryption-Types = 0x00000004 MS-MPPE-Send-Key = 0x23de18930fa5e072c58131dd709d5e1b MS-MPPE-Recv-Key = 0xcfe3c04c7178fa79515fb46aff47ce4b EAP-Message = 0x03080004 Message-Authenticator = 0x00000000000000000000000000000000 User-Name = "diretor" [peap] Tunneled authentication was successful. [peap] SUCCESS ...
Se os dados da VLAN apareceram como neste log é porque foram enviados os dados corretamente para o equipamento que requisitou a autenticação. Se este equipamento suportar VLANs dinâmicas, o usuário diretor será atribuído a VLAN 10. O teste é análogo para o usuário secretaria.
Com os usuários funcionando corretamente com o esquema de VLANs Dinâmicas configurado diretamente no arquivo users, agora vamos migrar esta configuração para os usuários que estão na base do OpenLDAP. Primeiro é necessário copiar o esquema do FreeRadius para dentro do OpenLDAP:
# cp /usr/share/doc/freeradius/examples/openldap.schema /etc/ldap/schema/
depois é necessário adicionar no arquivo de configuração a entrada deste novo schema e convertê-lo da mesma forma como foi feito com o schema do Samba. Uma vez que o schema já está configurado devem ser adicionados os campos dentro do ldif do usuário. Abaixo vai um exemplo completo do ldif do usuário diretor:
# vim diretor.ldif
dn: uid=diretor,dc=exemplo,dc=com,dc=br
sn: da Direção
cn: Diretor da Direção
uid: diretor
objectClass: person
objectClass: inetOrgPerson
objectClass: sambaSamAccount
objectClass: radiusprofile
radiusTunnelType: VLAN
radiusTunnelMediumType: IEEE-802
radiusTunnelPrivateGroupId: 0010
userPassword: {SSHA}gWRX6IuyiGw+0xvPN3JhaGEcvuLJqmlB
sambaNTPassword: 1E39A9A22F2D08A0B69C4A5ACA7E5332
sambaSID: 1
Notem que existe um objeto novo: radiusprofile e as configurações de VLAN já estão corretamente ajustadas. Não esqueça de remover a entrada do diretor que está inserida diretamente dentro do arquivo users do FreeRadius.
Este passo é recomendado se você vai (e com certeza vai) usar o Windows Vista/7 para se conectar ao seu ambiente, o FreeRADIUS utiliza ao ser instalado as chaves criptográficas geradas quando o sistema foi instalado (conhecida como snake-oil) e por isso ela não possui atributos de CA que o Windows Vista/7 precisam, para acreditar que o seu servidor é de fato assinado digitalmente. Por isso vamos regerar as chaves do servidor para que este problema acabe.
Se você viu nos logs algo como: ...Unknown CA.., você deve regerar as chaves do seu servidor da seguinte forma:
# cd /usr/share/doc/freeradius/examples/certs
dentro deste diretório tem um script chamado bootstrap que é utilizado para gerar todos os certificados de forma correta, mas antes de gerar de fato, é necessário que 3 arquivos sejam editados:
e opcionalmente o terceiro arquivo, que é a chave do usuário ou computador:
Estes arquivos possuem as seguintes estruturas respectivamente:
# vim /usr/share/doc/freeradius/examples/certs/ca.cnf ... [ req ] prompt = no distinguished_name = certificate_authority default_bits = 2048 input_password = whatever #esta senha é a mesma que está no arquivo de configuração do FreeRADIUS na parte de chaves output_password = whatever x509_extensions = v3_ca [certificate_authority] countryName = FR stateOrProvinceName = Radius localityName = Somewhere organizationName = Example Inc. emailAddress = admin@example.com commonName = "Example Certificate Authority" ...
omitimos as partes que não interessam, mas no geral, vocês devem alterar as informações com campo em negrito. No nosso caso, podemos deixar a configuração da seguinte forma:
# vim /usr/share/doc/freeradius/examples/certs/ca.cnf ... [ req ] prompt = no distinguished_name = certificate_authority default_bits = 2048 input_password = whatever output_password = whatever x509_extensions = v3_ca [certificate_authority] countryName = BR stateOrProvinceName = MS localityName = Campo Grande organizationName = Empresa emailAddress = admin@exemplo.com.br commonName = radius.exemplo.com.br ...
um detalhe importante é que o commonName deve ser sempre o nome FQND do servidor que você está utilizando, ou em outros ambientes, do servidor CA de chaves.
O próximo a ser editado é o server.cnf, as configurações alteradas serão as mesmas:
# vim /usr/share/doc/freeradius/examples/certs/server.cnf ... [ req ] prompt = no distinguished_name = certificate_authority default_bits = 2048 input_password = whatever output_password = whatever x509_extensions = v3_ca [certificate_authority] countryName = BR stateOrProvinceName = MS localityName = Campo Grande organizationName = Empresa emailAddress = admin@exemplo.com.br commonName = radius.exemplo.com.br ...
mas neste caso o commonName deve ser explicitamente o FQND do servidor que vai possuir essa chave, no nosso caso, o próprio servidor FreeRADIUS.
E por último as configurações da chave do usuário:
# vim /usr/share/doc/freeradius/examples/certs/client.cnf ... [ req ] prompt = no distinguished_name = client default_bits = 2048 input_password = whatever output_password = whatever [client] countryName = BR stateOrProvinceName = MS localityName = Campo Grande organizationName = Empresa emailAddress = usuario@exemplo.com.br commonName = usuario@exemplo.com.br ...
a diferença mais importante é que o campo de emailAddress e commonName, são o email do usuário.
Com estas alterações feitas, vamos executar então o script de bootstrap:
# cd /usr/share/doc/freeradius/examples/certs/
# ./bootstrap
Generating DH parameters, 1024 bit long safe prime, generator 2
This is going to take a long time
Generating a 2048 bit RSA private key
.....................................+++
..+++
writing new private key to 'server.key'
-----
Generating a 2048 bit RSA private key
............................+++
.+++
writing new private key to 'ca.key'
-----
Using configuration from ./server.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number: 1 (0x1)
Validity
Not Before: Feb 9 00:54:26 2011 GMT
Not After : Feb 9 00:54:26 2012 GMT
Subject:
countryName = BR
stateOrProvinceName = MS
organizationName = UFMS
commonName = radius.exemplo.com.br
emailAddress = admin@exemplo.com.br
X509v3 extensions:
X509v3 Extended Key Usage:
TLS Web Server Authentication
Certificate is to be certified until Feb 9 00:54:26 2012 GMT (365 days)
Write out database with 1 new entries
Data Base Updated
MAC verified OK
Agora vamos copiar as novas chaves dentro do FreeRADIUS:
# rm /etc/freeradius/certs/*.pem rm: remover ligação simbólica "/etc/freeradius/certs/ca.pem"? y rm: remover ligação simbólica "/etc/freeradius/certs/server.pem"? y
# rm /etc/freeradius/certs/*.key rm: remover ligação simbólica "/etc/freeradius/certs/server.key"? y
# rm /etc/freeradius/certs/dh rm: remover arquivo comum "/etc/freeradius/certs/dh"? y
e copiar as novas chaves geradas:
# cp ca.pem dh server.key server.pem /etc/freeradius/certs/
Só para garantir, verifique se a senha whatever, que você colocou nas suas chaves, também está corretamente configurado no FreeRADIUS:
# vim /etc/freeradius/eap.conf
tls {
...
private_key_password = whatever
...
}
pronto, suas chaves foram recriadas corretamente.
Para utilizar uma federação para autenticação, vamos configurar o arquivo proxy.conf
# vim/etc/freeradius/proxy.conf
proxy server {
default_fallback = no
}
home_server federacao-br {
type = auth+acct
ipaddr = IP_DA_FEDERACAO
port = 1812
secret = SENHA
require_message_authenticator = yes
response_window = 20
zombie_period = 40
revive_interval = 120
status_check = status-server
check_interval = 30
num_answers_to_alive = 3
coa {
irt = 2
mrt = 16
mrc = 5
mrd = 30
}
}
home_server_pool federacao-server-failover {
type = fail-over
home_server = federacao-br
}
realm DEFAULT {
auth_pool = federacao-server-failover
nostrip
}
realm exemplo.com.br {
}
realm LOCAL {
}
realm NULL {
secret = SENHA
}
com isso todas as requisições para fora do domínio local serão enviadas para a Federação.
Nosso ambiente já está corretamente autenticando os usuários no OpenLDAP, o próximo passo agora é fazer a contabilização de uso dos nossos usuários, para isso é necessário a utilização de um banco de dados, que pode ser tanto o PostgreSQL quanto o MySQL. Por questões de robustez e pelo nosso ambiente ser grande, vamos utilizar o PostgreSQL.
No Debian já temos o pacote que possui as informações e SQLs necessários para utilização deste banco no pacote, vamos instalá-lo:
# apt-get install freeradius-postgresql
Algumas informações importantes antes de começarmos. Se o seu objetivo é apenas accounting, como é o nosso, você precisa ficar atendo aos seguintes arquivos em /etc/freeradius/sql/postgresql:
e o arquivo em /etc/freeradius:
neste último possui as configurações gerais de bancos de dados, como por exemplo, qual você está usando (MySQL/PostgreSQL), informações de usuário e senha e outros.
Vamos supor que você já possua o PostgreSQL configurado no seu ambiente, então o primeiro passo é criar um banco de dados chamado 'radius e injetar as tabelas do arquivo schema.sql dentro dele com na foto abaixo:
e depois adicionar as entradas do script SQL no banco:
Depois de adicionar o schema no banco, é necessário ajustar o usuário que vai conectar ao banco, e estas configurações já estão no arquivo admin.sql, o que precisamos fazer é modificar a senha e o host (caso seu banco esteja em um servidor remoto), veja o arquivo:
# vim /etc/freeradius/sql/postgresql/admin.sql
CREATE USER radius WITH PASSWORD 'radpass';
GRANT ALL ON radcheck TO radius;
GRANT ALL ON radreply TO radius;
GRANT ALL ON radgroupcheck TO radius;
GRANT ALL ON radgroupreply TO radius;
GRANT ALL ON radusergroup TO radius;
para geração de senhas, recomendo o comando makepasswd, ele gera senhas aleatórias fortes. Execute este SQL no banco, você deve ter um retorno parecido com:
Consulta executada com sucesso sem resultados em 31 ms.
Depois que o banco foi configurado, precisamos ajustar as configurações do FreeRADIUS para ler corretamente o banco:
# vim /etc/freeradius/sql.conf
sql {
database = "postgresql "
driver = "rlm_sql_${database}"
server = "localhost"
login = "radius"
password = "radpass"
radius_db = "radius"
acct_table1 = "radacct"
acct_table2 = "radacct"
postauth_table = "radpostauth"
authcheck_table = "radcheck"
authreply_table = "radreply"
groupcheck_table = "radgroupcheck"
groupreply_table = "radgroupreply"
usergroup_table = "radusergroup"
deletestalesessions = yes
sqltrace = no
sqltracefile = ${logdir}/sqltrace.sql
num_sql_socks = 5
connect_failure_retry_delay = 60
lifetime = 0
max_queries = 0
#nas_table = "nas" #pois, no nosso caso, usamos as definições de NAS direto no arquivo de configuração
$INCLUDE sql/${database}/dialup.conf
}
onde está localhost, modifique para o seu servidor de banco de dados (endereço), e no lugar da senha, coloque a senha que você utilizou no script SQL do schema.
Agora para que tudo funcione corretamente, você precisa habilitar o accounting nos sites-enabled do FreeRadius:
# vim /etc/freeradius/sites-enabled/default
...
accounting {
detail
daily
unix
radutmp
sql
exec
attr_filter.accounting_response
}
...
A única diferença foi que descomentamos no accounting o módulo sql para usar o banco de dados. O outro arquivo que deve ser modificado é o radiusd.conf, para incluir nosso arquivo sql.conf:
# vim /etc/freeradius/radiusd.conf
...
modules {
$INCLUDE ${confdir}/modules/
$INCLUDE eap.conf
$INCLUDE sql.conf
}
...
descomente a linha que inclui o sql.conf. Feito isso, vamos testar em modo debug o FreeRadius (não esqueça de verificar se existe uma entrada no pg_hba.conf do seu servidor FreeRadius no PostgreSQL, senão ele vai negar as requisições):
# freeradius -X
...
rlm_sql (sql): Driver rlm_sql_postgresql (module rlm_sql_postgresql) loaded and linked
rlm_sql (sql): Attempting to connect to radius@pgsql.exemplo.com.br:/radius
rlm_sql (sql): starting 0
rlm_sql (sql): Attempting to connect rlm_sql_postgresql #0
rlm_sql (sql): Connected new DB handle, #0
rlm_sql (sql): starting 1
rlm_sql (sql): Attempting to connect rlm_sql_postgresql #1
Module: Checking preacct {...} for more modules to load
Module: Linked to module rlm_acct_unique
Module: Instantiating module "acct_unique" from file /etc/freeradius/modules/acct_unique
acct_unique {
key = "User-Name, Acct-Session-Id, NAS-IP-Address, Client-IP-Address, NAS-Port"
}
...
Se você quiser controlar também o número de sessões que um usuário pode usar no seu FreeRadius, é necessário descomentar algumas linhas a mais:
# vim /etc/freeradius/sites-enabled/default
...
session {
radutmp
sql
}
...
e depois contabilizar a quantidade de logins no dialup.conf:
# vim /etc/freeradius/sql/postgresql/dialup.conf
...
simul_count_query = "SELECT COUNT(*) FROM ${acct_table1} WHERE UserName='%{SQL-User-Name}' AND AcctStopTime IS NULL"
simul_verify_query = "SELECT RadAcctId, AcctSessionId, UserName, NASIPAddress, NASPortId, FramedIPAddress, CallingStationId, FramedProtocol FROM ${acct_table1} WHERE UserName='%{SQL-User-Name}' AND AcctStopTime IS NULL"
...
basta reinicializar o servidor que vai funcionar:
# /etc/init.d/freeradius restart
um bom teste é executar no banco de dados o comando no banco do radius:
> select * from radpostauth; 1;"brivaldo.junior";"Chap-Password";"Access-Accept";"";"";"2011-08-05 14:43:04.713033-04" 2;"brivaldo.junior";"Chap-Password";"Access-Accept";"";"";"2011-08-05 14:43:04.742037-04" 3;"brivaldo.junior";"Chap-Password";"Access-Accept";"";"";"2011-08-05 14:44:19.117368-04" ...
se você ver essas informações no banco ao conectar com sucesso no radius, está tudo funcionando.
Se você estiver vendo erros como:
rlm_sql (sql) in sql_postauth: query is INSERT INTO radpostauth (username, pass, reply, authdate) VALUES ('usuario', 'Chap-Password', 'Access-Accept', NOW())
rlm_sql (sql): Reserving sql socket id: 2
rlm_sql_postgresql: Status: PGRES_FATAL_ERROR
rlm_sql_postgresql: Error permissão negada para relação radpostauth
rlm_sql_postgresql: Postgresql Fatal Error: [42501: INSUFFICIENT PRIVILEGE] Occurred!!
rlm_sql (sql) in sql_postauth: Database query error - ERRO: permissão negada para relação radpostauth
rlm_sql (sql): Released sql socket id: 2
++[sql] returns fail
tenha certeza que as tabelas no banco tem como dono o usuário criado radius.
Vamos procurar o port mais recente do FreeRADIUS:
# cd /usr/ports # make search name=freeradius display=name,path Port: freeradius-2.1.10_2 Path: /usr/ports/net/freeradius2
entre no diretório do FreeRADIUS:
# cd /usr/ports/net/freeradius2
o primeiro passo é configurar o FreeRADIUS com o que queremos que ele suporte.
# make config
na tela de configuração, marque a opção de suporte ao LDAP:
[X] LDAP With LDAP database support
pronto, vamos compilar e instalar o pacote:
# make install clean
como nosso sistema esta limpo, todas as dependências necessárias serão compiladas também, mantenha as configurações padrões (aceite o padrão) quando for questionado (este passo vai demorar um pouco, pois necessita baixar códigos e compilá-los):
Pronto, o FreeRADIUS foi instalado com sucesso.
Vamos apenas realizar as configurações no servidor. Depois que ele terminou de instalar os softwares necessários, vamos configurar o FreeRADIUS para começar autenticando um usuário de forma simples:
# cd /usr/local/etc/raddb
dentro deste diretório estarão todas as configurações do FreeRADIUS, vamos editar o arquivo clients.conf:
# ee /usr/local/etc/raddb/clients.conf
client localhost {
ipaddr = 127.0.0.1
secret = testing123
require_message_authenticator = no
nastype = other # localhost isn't usually a NAS...
}
client 200.129.202.132 {
secret = senha_definida_no_servidor_radius
shortname = ap-radius
}
esta configuração serve para que o servidor FreeRADIUS aceite consultas originadas por este IP. Para testarmos nosso servidor sem a necessidade de um AP físico, podemos usar a ferramenta radtest, para isso vamos criar um usuário:
# ee /usr/local/etc/raddb/users
...
"John Doe" Cleartext-Password := "hello"
Reply-Message = "Hello, %{User-Name}"
este é o exemplo sugerido no próprio FreeRADIUS, neste caso o usuário é John Doe e a senha é 'hello', vamos testar:
# radtest -t pap "John Doe" "hello" localhost 1812 testing123
você irá ver algo como:
Sending Access-Request of id 116 to 127.0.0.1 port 1812
User-Name = "John Doe"
User-Password = "hello"
NAS-IP-Address = 127.0.0.1
NAS-Port = 1812
rad_recv: Access-Accept packet from host 127.0.0.1 port 1812, id=116, length=37
Reply-Message = "Hello, John Doe"
execute agora o teste de autenticação com o radtest e você verá várias linhas do log, em especial as seguintes:
[pap] login attempt with password "hello" [pap] Using clear text password "hello" [pap] User authenticated successfully
notem que o resultado foi (e deveria ser) igual ao resultado visto no ambiente usando Debian.
Para que o FreeRADIUS inicialize automaticamente, é necessário adicionar sua entrada no rc.conf:
# /usr/local/etc/rc.d/radiusd rcvar >> /etc/rc.conf
e alterar a entrada do radiusd_enable de:
# ee /etc/rc.conf ... radiusd_enable="NO" ...
para:
radiusd_enable="YES"
pronto, o FreerRADIUS agora vai inicializar corretamente.
É necessário primeiro instalar o OpenLDAP em um servidor, depois de instalado, se tudo funcionou até agora, você está no caminho certo, devemos configurar o FreeRADIUS para autenticar no OpenLDAP, primeiro vamos editar o módulo do OpenLDAP:
# ee /usr/local/etc/raddb/modules/ldap
ldap {
server = "openldap.ufms.br"
basedn = "dc=ufms,dc=br"
identity = "cn=user_for_read,dc=ufms,dc=br"
password = password_of_reader_on_ldap
filter = "(uid=%{%{Stripped-User-Name}:-%{User-Name}})"
ldap_connections_number = 5
timeout = 4
timelimit = 3
net_timeout = 1
tls {
start_tls = yes
require_cert = "allow"
}
dictionary_mapping = ${confdir}/ldap.attrmap
edir_account_policy_check = no
}
Ative o TLS somente se o seu OpenLDAP estiver com o suporte ativado, mas você pode testar a conexão sem usar TLS, basta atribuir no para o start_tls. Usando o modo de debug do radius você verá algo como:
[ldap] attempting LDAP reconnection [ldap] (re)connect to ldap.ufms.br:389, authentication 0 [ldap] starting TLS
Com isso teremos certeza que o FreeRADIUS realizou a conexão com sucesso com o OpenLDAP usando TLS. Não esqueça de ter certeza que o usuário criado tenha os campos de senha na formatação correta, ou o campo userPassword com senha em ClearText ou o campo sambaNTPassword contendo o hash em em NT, neste caso você pode usar o exemplo sugerido para gerar o hash em python.
As configurações realizadas foram feitas de tal forma a suportar conexões usando MSCHAPv2 para realizar a menor quantidade de configurações possíveis nos sistemas. Abaixo vai uma tabela de quais sistemas são suportados neste ambiente:
| Fornecedor | ||||
|---|---|---|---|---|
| Microsoft | Windows XP SP3 | Windows Vista | Windows 7 | |
| Apple | MacOSX Snow Leopard | MacOSX Lion | iOS 4.3 | iOS 5.0 |
| Linux | Debian Squeeze | Ubuntu 10.04 LTS | CentOS 5.5 | |
| BSD | FreeBSD 7.3 | FreeBSD 8.1 | PCBSD 8.2 | |
| Android 2.1 | Android 2.2 | Android 2.3 | Android 3.0 |
A cor cinza representa um sistema ainda não testado, a verde, sistemas que foram testados e funcionaram, a amarela, para sistemas que conseguiram conectar mas falharam ao finalizar e a vermelha, sistemas que não funcionaram. Os próximos passos representam as configurações para o ambiente criado, com o único detalhe no SSID que foi modificado para EDUROAM.
A configuração no Windows XP SP3 é bem tranquila, o maior problema é que ele automaticamente vai tentar utilizar uma chave local do sistema ou a autenticação de rede (Logon do Windows) para autenticar no FreeRADIUS, por isso, depois de conectar e falhar, devemos editar a conexão ao AP para suportar a autenticação PEAP.
Abaixo segue o video demonstrativo da configuração:
Ou você pode acompanhar o passo a passo com imagens abaixo. Primeiro é criada a conexão com o AP-RADIUS, depois que ela falhar, é necessário ir em Alterar configurações avançadas:
Edite as conexões de rede sem fio:
clicando em propriedades, devemos definir o método de autenticação para Protected EAP (PEAP):
Depois volte e edite as configurações avançadas, agora devemos desmarcar Validar certificado do servidor:
e depois configurar o MSCHAPv2, desmarcando o logon automático de rede:
com isso, ao tentar conectar ao AP-RADIUS, você será questionado, como na figura, pela sua autenticação:
seu Windows XP deve autenticar e conectar normalmente.
Veja o vídeo de configuração do Windows Vista:
Caso não seja possível ver o vídeo, veja o passo a passo com fotos. Vamos tentar se conectar ao AP-RADIUS (que está vinculado ao FreeRADIUS) agora:
O Windows vai informar que é necessário inserir dados de autenticação:
Insira os dados de usuário e senha, mas não precisa inserir o Domínio de Logon:
Neste momento ele vai voltar para a janela informando a necessidade de inserir usuário e senha, clique para "inserir o usuário" (como se fosse fazer o procedimento novamente), note que agora vai aparecer a janela de certificado (que antes não aparecia):
Aceite o certificado e a conexão será finalizada com sucesso:
Confirmando, vai estar funcionando corretamente.
Veja o video de configurações do Windows 7 para conectar na rede WIFI EDUROAM:
Vamos agora ao passo a passo com imagens. Primeiro vamos selecionar a rede EDUROAM (que está vinculado ao servidor FreeRADIUS):
Ao tentar realizar a conexão o Windows 7 vai detectar a necessidade de um usuário e senha:
TODO: refazer
Se nos logs do servidor FreeRADIUS estiverem aparecendo mensagens como a abaixo:
Mon Feb 14 14:47:34 2011 : Error: TLS Alert read:fatal:unknown CA Mon Feb 14 14:47:34 2011 : Error: TLS_accept: failed in SSLv3 read client certificate A Mon Feb 14 14:47:34 2011 : Error: rlm_eap: SSL error error:14094418:SSL routines:SSL3_READ_BYTES:tlsv1 alert unknown ca Mon Feb 14 14:47:34 2011 : Error: SSL: SSL_read failed inside of TLS (-1), TLS session fails.
Tenha certeza de ter seguido os passos para regerar a senha com os campos corretos para reconhecimento do Windows. Se este for o erro nos logs do FreeRADIUS e você já gerou as novas chaves como explicamos, então você deve seguir um dos procedimentos abaixo:
Isso vai resolver o problema de certificado auto-assinado.
Para resolver o problema com as chaves geradas pelo OpenSSL (e a sua ordem de checagem no Windows), primeiro precisamos utilizar uma ferramenta chamada: gpedit.msc, e seguir os seguintes passos:
Isso vai resolver o problema de chaves.
A configuração do MacOSX Snow Leopard foi tão simples quanto a do iOS da Apple, basta selecionar a rede AP-RADIUS:
Inserir o usuário e senha de autenticação (deixe o MacOSX escolher a melhor forma de 802.1x possível):
e aceitar o certificado, o MacOSX vai reclamar que ele foi assinado por uma AC não confiável (isso era esperado uma vez que o certificado é auto-assinado), basta clicar em Continuar:
você será requisitado a inserir a senha do usuário administrador do computador e pronto, a autenticação deve concluir com sucesso.
Configurar o iOS4.2 foi realmente muito simples, o único detalhe, é que como temos certificados auto-assinados no FreeRADIUS, ele vai reclamar disso. Para configurar, entre no menu de Ajustes e em Wi-Fi:
Selecione o AP-RADIUS, você será questionado sobre o usuário e senha:
antes de autenticar o usuário, ele vai mostrar as informações do certificado instalado no servidor:
aceite o certificado e a conexão será concluída com sucesso.
Veja o video de configurações do Ubuntu 10.04 LTS para conectar na rede WIFI EDUROAM:
Ou veja as imagens de configuração. A conexão usando o NetworkManager no Linux é bem tranquila, basta buscar pelo AP-RADIUS e ao tentar se conectar nele você vai ver a seguinte janela:
nela você deve preencher os campos de usuário e senha (como não estamos publicando o certificado do servidor, ele vai reclamar disso, basta ignorar):
Você vai receber a mensagem de conexão estabelecida com sucesso:
Pronto, conexão estabelecida.
Infelizmente as imagens não ficaram na melhor qualidade, mas as configurações para o Android foram simples, primeiro selecione a rede AP-RADIUS:
ao clicar na rede selecionada você precisará informar alguns dados adicionais, como por exemplo, qual o método de autenticação de fase 2 (escolha MSCHAPv2):
Depois basta inserir o usuário e senha (deixe em branco o campo de autenticação anonima e os campos de certificado):
Pronto, você vai ver que a conexão vai estabelecer corretamente.
Se você precisar gerar o hash NT sem necessariamente instalar o Samba nem configurá-lo com o OpenLDAP, você pode utilizar este script simples em Python:
#!/usr/bin/env python
import hashlib,binascii
hash = hashlib.new('md4', "SENHA_EM_TEXTO_PLANO".encode('utf-16le')).digest()
print binascii.hexlify(hash)
com este script, basta você executá-lo com a senha desejada e o hash NT será gerado.
--Brivaldo 14h52min de 5 de agosto de 2011 (AMT)