terça-feira, 17 de agosto de 2010

Integrando o FreeRadius ao AD com Centos 5.4 (PEAP + MSCHAP)

Olá comunidade,

Nesse post vou mostrar como integrar o FreeRadius ao AD a fim de autenticar clientes M$ windows XP de forma transparente ao usuário.

Utilizando-se um switch compatível com 802.1X e o servidor FreeRadius é possível realizar o controle de acesso às portas do switch mediante autenticação no AD, dessa forma apenas máquinas e usuários pertencentes ao domínio terão acesso à rede.

Para permitir a autenticação no AD devemos ter instalado o servidor Samba e o suporte a Kerberos, ao se instalar o Centos no modo server já temos os mesmos instalados. Para instalar o servidor freeradius devemos proceder conforme abaixo:

yum install freeradius2.i386 freeradius2-utils.i386 freeradius2-krb5.i386

Agora passamos a configuração de nosso ambiente.

Kerberos

Para configurar o kerberos devemos editar o arquivo /etc/krb5.conf conforme abaixo:

[libdefaults]
default_realm = SEUDOMINIO.COM.BR
dns_lookup_realm = false
dns_lookup_kdc = false
ticket_lifetime = 24h

# The following krb5.conf variables are only for MIT Kerberos.
krb4_config = /etc/krb.conf
krb4_realms = /etc/krb.realms
kdc_timesync = 1
ccache_type = 4
forwardable = true
proxiable = true
# The following libdefaults parameters are only for Heimdal Kerberos.
v4_instance_resolve = false
v4_name_convert = {
host = {
rcmd = host
ftp = ftp
}
plain = {
something = something-else
}
}
fcc-mit-ticketflags = true

[logging]
default = FILE:/var/log/krb5libs.log
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log

[realms]
SEUDOMINIO.COM.BR = {
kdc = seu_servidor:88
admin_server = seu_servidor:749
default_domain = seudominio.com.br
}

[domain_realm]
.seudominio.com.br = SEUDOMINIO.COM.BR
seudominio.com.br = SEUDOMINIO.COM.BR

[appdefaults]
pam = {
debug = false
ticket_lifetime = 36000
renew_lifetime = 36000
forwardable = true
krb4_convert = false
}

[login]
krb4_convert = true
krb4_get_tickets = false


Logo após configuramos o servidor Samba através do arquivo /etc/samba/smb.conf para que fique parecido com o descrito abaixo:

[global]
workgroup = SEUDOMINIO.COM.BR
netbios name = NOME_DO_SERVIDOR
password server = SEU_SERVIDOR_ACTIVE_DIRECTORY
realm = SEUDOMINIO.COM.BR
server string = Samba Server Version %v
log file = /var/log/samba/log.%m
max log size = 50
security = ads
encrypt passwords = true
domain master = no
preferred master = no
dns proxy = no
interfaces = lo eth0
bind interfaces only = yes
template shell = /bin/false
idmap uid = 16777216-33554431
idmap gid = 16777216-33554431
auth methods = winbind
winbind use default domain = yes
winbind nested groups = Yes
winbind enum users=yes
winbind enum groups=yes
log level=winbind:10


Concluída a configuração do Samba devemos editar o arquivo /etc/nsswitch.conf alterando as linhas conforme abaixo:

DE
passwd: files
group: files


PARA
passwd: files winbind
group: files winbind


Concluído este passo devemos realizar testes para verificar a comunicação entre o servidor e o AD. Primeiramente testamos o Kerberos com o comando:

kinit seu_usuario@SEUDOMINIO.COM.BR

Será solicitada a senha do usuário, se tudo estiver funcionando perfeitamente entre com o comando "klist", o resultado deve exibir um tícket gerado conforme abaixo:

Ticket cache: FILE:/tmp/krb5cc_0
Default principal: seu_usuario@SEUDOMINIO.COM.BR

Valid starting Expires Service principal
08/17/10 15:47:26 08/18/10 01:47:30 krbtgt/SEUDOMINIO.COM.BR@SEUDOMINIO.COM.BR
renew until 08/18/10 15:47:26


OBS: Para que haja a comunicação entre os servidores Kerberos é necessário que o horário de ambos esteja sincronizado, verifique a hora do servidor realize ajustes se necessário.

Verificado o funcionamento do Kerberos é a vez de testar o Samba adicionando o servidor ao AD.

Para tal reinicialize o servidor Samba e o Winbind.

/etc/init.d/samba restart
/etc/init.d /winbind restart


Logo após adicione o servidor ao AD com o comando:

net ads join -U seu_usuario -S SEUDOMINIO.COM.BR

Após a inserção no domínio podemos testar a comunicação do servidor com o AD com o comando abaixo:

wbinfo -t

O resultado esperado para este comando é:

checking the trust secret via RPC calls succeeded

Outro testes interessante é autenticar com um usuário válido conforme abaixo:

wbinfo -a usuario

A senha será solicitada por duas vezes.

Enter usuario's password:
plaintext password authentication succeeded
Enter usuario's password:
challenge/response password authentication succeeded


Ainda a título de testes podemos listar também os grupos e os usuários do domínio conforme abaixo:

wbinfo -g
wbinfo -u


Passamos agora para a configuração do servidor Freeradius. Para realizar a autenticação no domínio o módulo MSCHAP do Freeradius utiliza o utilitário ntlm_auth que faz parte do samba para realizar a autenticação. Vamos testar o mesmo com o comando abaixo:

ntlm_auth --request-nt-key --domain=SEUDOMINIO --username=usuario --password=senha

O resultado esperado para este comando é:

NT_STATUS_OK: Success (0x0)

Partimos agora para a configuração dos arquivos do servidor Freeradius.

/etc/raddb/clients.conf

client ip_do_switch {
secret = testing123
}

/etc/raddb/users

DEFAULT Auth-Type = MS-CHAP

/etc/raddb/eap.conf

eap {
default_eap_type = peap
timer_expire = 60
ignore_unknown_eap_types = no
cisco_accounting_username_bug = no
max_sessions = 2048

md5 {
}

leap {
}

gtc {

auth_type = PAP
}

tls {
certdir = ${confdir}/certs
cadir = ${confdir}/certs
private_key_password = whatever
private_key_file = ${certdir}/server.pem
certificate_file = ${certdir}/server.pem
CA_file = ${cadir}/ca.pem
dh_file = ${certdir}/dh
random_file = ${certdir}/random
cipher_list = "DEFAULT"
make_cert_command = "${certdir}/bootstrap"

cache {
enable = no
max_entries = 255
}
}

ttls {
default_eap_type = md5
copy_request_to_tunnel = no
use_tunneled_reply = no
virtual_server = "inner-tunnel"
}


peap {
default_eap_type = mschapv2
}

mschapv2 {
}
}


Para finalizar devemos configurar o módulo de autenticação do Freeradius.

/etc/raddb/modules/mschap

mschap {
use_mppe = yes
require_encryption = yes
require_strong = yes
with_ntdomain_hack = yes
ntlm_auth = "/usr/bin/ntlm_auth --request-nt-key --username=%{mschap:User-Name} --domain=%{mschap:NT-Domain} --challenge=%{mschap:Challenge:-00} --nt-response=%{mschap:NT-Response:-00}"
}


OBS:Devemos nos certificar de que o usuário radiusd possua acesso ao diretório /var/cache/samba/winbindd_privileged caso contrário será exibida a mensagem de erro abaixo:

winbind client not authorized to use winbindd_pam_auth_crap Ensure permissions on /var/cache/samba/winbindd_privileged are set correctly

Adicionamos o usuários radiusd ao grupo squid que possui os privilégios necessários com o comando:

usermod -a -G squid radiusd

Após definida a permissão de acesso devemos configurar o Switch para acessar o servidor. A configuração dos switches não será abordada neste post e varia de acordo com o fabricante e modelo dos mesmos. Antes de comprar seu equipamento verifique se o mesmo possui suporte 802.1X

O próximo passo é configurar as estações com o Windows XP. O windows XP deve estar com pelo menos o SP2 instalado.

Selecione as propriedades de sua interface de rede conforme abaixo:



No Windows XP com o SP2 instalado a guia autenticação estará disponível, clique sobre a guia autenticação e configure a mesma conforme abaixo:



Agora clique em configurações e desmarque as opções default deixando sua configuração conforme abaixo:



Para finalizar clique em configurar e desmarque a opção "Usar meu nome e minha senha de logon do windows automaticamente" conforme abaixo:


Pronto, agora para se ter acesso a rede será preciso fornecer usuário e senha para liberação do acesso às portas do switch. O que achei particularmente interessante é que as estações windows ao serem inicializadas realizam login no servidor Freeradius com suas contas de máquina para ter acesso a rede, o que é útil para o acesso remoto do administrador, mas quando o usuário realiza o login as credenciais do usuário são novamente enviadas ao Freeradius e caso o mesmo não pertença ao domínio a estação não terá a porta do switch liberada para acesso.

É isso ai galera. Quaisquer erros neste post, dúvidas ou esclarecimentos estou a disposição.

Para a realização deste post os links abaixo foram utilizados como base:


Um grande abraço a todos.