FreeRadius

De Wiki
Ir para: navegação, pesquisa

FreeRADIUS

Objetivo

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.

Ambiente Proposto

O ambiente vai possuir as seguintes ferramentas e equipamentos:

  • Servidor rodando Debian Squeeze 6.0/FreeBSD 8.1 - IP: 200.129.192.94
  • FreeRADIUS 2.1.10
  • OpenLDAP 2.4.23
  • AP 3COM 7760 (com suporte a IAPP e até 4 VLANs) - IP: 200.129.202.132
  • Domínio: exemplo.com.br

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.

Configuração dos APs

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:

Ap3com-sistema.png

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:

Ap3com-ssid-profile.png

As informações que importam nesta tela de configuração são:

  • SSID: AP-RADIUS
  • Security: WPA2-Mixed
  • Cipher Type: AES
  • RADIUS Server: 200.129.192.94
  • RADIUS Port: 1812 (padrão)
  • RADIUS Secret: senha_definida_no_servidor_radius
  • IP de comunicação: 200.129.202.132

uma vez que os APs foram configurados, só precisamos trabalhar nas configurações do servidor.

Configurando o IAPP nos APs

Para configurar a migração automática entre os APs é necessário que você:

  • Utilize o mesmo SSID nos vários APs
  • Saiba o BSSID de cada AP para configurar usando o IAPP
  • Saiba o IP de cada AP que vai fazer parte da migração do IAPP
  • As mesmas configurações gerais (WPA2-Mixed Enterprise usando AES e o 802.1x com RADIUS para autenticação)

Com essas informações, configure cada AP com as informações dos outros APs como na tela abaixo:

Iapp.png

feito isso, basta migrar entre os APs e tudo vai funcionar corretamente.

Debian Squeeze 6.0

Instalando os Pacotes necessários

Primeiro vamos instalar os pacotes necessários do FreeRADIUS no servidor:

# apt-get install freeradius freeradius-ldap

serão instaladas algumas dependências adicionais.

Configurações Básicas

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.

Autenticando no OpenLDAP

É 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.

Utilizando Usuários com VLAN Dinâmica

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:

  • Ruckus ZoneDirector 1000
  • Ruckus ZoneFlex 7363

Vamos supor que temos 2 usuários na rede:

  • Usuário: diretor
    • VLAN: 10
    • Rede: 192.168.0.0/24
  • Usuário: secretaria
    • VLAN: 172
    • Rede: 10.0.1.0/24

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.

Configurando os atributos de VLAN no OpenLDAP

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.

Regerando Certificados por Compatibilidade

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:

  • ca.cnf
  • server.cnf

e opcionalmente o terceiro arquivo, que é a chave do usuário ou computador:

  • client.cnf

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.

Configurando o Proxy para uma Federação

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.

Accounting PostgreSQL

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:

  • admin.sql
  • schema.sql
  • counter.conf

e o arquivo em /etc/freeradius:

  • sql.conf

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:

Novo banco.png

e depois adicionar as entradas do script SQL no banco:

Execucao-script-sql.png

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.

Erros Comuns

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.

FreeBSD 8.2

Instalando os Pacotes necessários

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):

  • perl
  • python26
  • libiconv
  • m4
  • openldap-client (2.4.23)

Pronto, o FreeRADIUS foi instalado com sucesso.

Configurações Básicas

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.

Autenticando no OpenLDAP

É 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.

Configuração dos Clientes

Clientes Suportados

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
Google 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.

Windows XP SP3

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:

<videoflash>TNtFPTHheFY|425|349</videoflash>

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:

Ap-conn.png

Edite as conexões de rede sem fio:

Conn-rede.png

clicando em propriedades, devemos definir o método de autenticação para Protected EAP (PEAP):

Prop-con.png

Depois volte e edite as configurações avançadas, agora devemos desmarcar Validar certificado do servidor:

Val-cert.png

e depois configurar o MSCHAPv2, desmarcando o logon automático de rede:

Prop-eap.png

com isso, ao tentar conectar ao AP-RADIUS, você será questionado, como na figura, pela sua autenticação:

Cred-winxp.png

seu Windows XP deve autenticar e conectar normalmente.

Windows Vista

Veja o vídeo de configuração do Windows Vista:

<videoflash>UjHGaL8eABE|420|315</videoflash>

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:

Wv-wifi-lista.png

O Windows vai informar que é necessário inserir dados de autenticação:

Wv-user-enter.png

Insira os dados de usuário e senha, mas não precisa inserir o Domínio de Logon:

Wv-user-insert.png

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):

Wv-user-accept-cer.png

Aceite o certificado e a conexão será finalizada com sucesso:

Wv-user-save-network.png

Confirmando, vai estar funcionando corretamente.

Windows 7

Veja o video de configurações do Windows 7 para conectar na rede WIFI EDUROAM:

<videoflash>GTX_HSQ8Pdk|425|349</videoflash>

Vamos agora ao passo a passo com imagens. Primeiro vamos selecionar a rede EDUROAM (que está vinculado ao servidor FreeRADIUS):

Redes-wifi.png

Ao tentar realizar a conexão o Windows 7 vai detectar a necessidade de um usuário e senha:

Selecao-usuario.png


TODO: refazer

Problemas conhecidos do Windows Vista e 7

Problema na interprestação do SSL

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:

  1. Importar a chave da AC criada (no caso a chave com extensão .pem, altere a extensão para .der);
  2. Criar a entrada de conexão WIFI manualmente e informar para ignorar a checagem de certificado.

Isso vai resolver o problema de certificado auto-assinado.

Problema na ordem de checagem das chaves geradas pelo OpenSSL

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:

  1. Abra o gpedit.msc
  2. Navegue para: Configurações do Computador\Templates Administrativos\Rede\Definições de configuração de SSL
  3. Abra no painel direito: Ordem do Conjunto de Codificação de SSL
  4. Ative-o
  5. Reinicie o computador

Isso vai resolver o problema de chaves.

MacOSX Snow Leopard

A configuração do MacOSX Snow Leopard foi tão simples quanto a do iOS da Apple, basta selecionar a rede AP-RADIUS:

Osx-snow-wifi.png

Inserir o usuário e senha de autenticação (deixe o MacOSX escolher a melhor forma de 802.1x possível):

Osx-snow-login.png

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:

Osx-snow-cert.png

você será requisitado a inserir a senha do usuário administrador do computador e pronto, a autenticação deve concluir com sucesso.

iOS 4.2 (iPhone/iPad)

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:

Ipad-wifi.PNG

Selecione o AP-RADIUS, você será questionado sobre o usuário e senha:

Ipad-user-pw.PNG

antes de autenticar o usuário, ele vai mostrar as informações do certificado instalado no servidor:

Ipad-cert-accept.PNG

aceite o certificado e a conexão será concluída com sucesso.

Debian Squeeze/Ubuntu 10.04 LTS

Veja o video de configurações do Ubuntu 10.04 LTS para conectar na rede WIFI EDUROAM:

<videoflash>FMorUk9rVk0|425|349</videoflash>

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:

Nm-lin-conect.png

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):

Nm-nocert-ca.png

Você vai receber a mensagem de conexão estabelecida com sucesso:

Nm-conn-stablish.png

Pronto, conexão estabelecida.

Google Android

Infelizmente as imagens não ficaram na melhor qualidade, mas as configurações para o Android foram simples, primeiro selecione a rede AP-RADIUS:

Android2-wifi-list.png

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):

Android2-wifi-conf.png

Depois basta inserir o usuário e senha (deixe em branco o campo de autenticação anonima e os campos de certificado):

Android2-wifi-pass.png

Pronto, você vai ver que a conexão vai estabelecer corretamente.

Gerando o hash NT para testes

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)