Integrando o OpenLDAP com AD usando o Kerberos

Share

Escrito por Tom Oliveira

No Kerberos, os clientes podem ser usuários, servidores ou programas, e são conhecidos como principals (ou “principais”). O KDC armazena a base de dados de principais e suas chaves, que são utilizadas para autenticação. O funcionamento do Kerberos se dá, basicamente, da seguinte forma: um cliente envia uma solicitação ao KDC e o KDC procura esse principal na sua base de dados.
Se é encontrado, o KDC cria um TGT (Ticket-Granting Ticket – ticket para obter ticket) para o cliente, criptografa o TGT usando a senha do cliente como chave e envia o TGT criptografado para o cliente. O cliente tenta descriptografar o TGT, usando sua própria chave (computada a partir da sua senha). Se o cliente consegue descriptografar o TGT, este é mantido em cache na máquina do cliente para futuras provas de identidade perante qualquer serviço “kerberizado”, uma vez que, obtido o TGT, não é mais necessário informar a senha novamente até que o TGT expire ou que o usuário efetue novo logon. Instalação O Kerberos requer que os horários das máquinas da rede estejam sincronizados entre si.

 

Instalação

# aptitude install ntp
Vamos instalar o kerberos:
# aptitude install krb5-admin-server krb5-clients krb5-kdc-ldap libpam-krb5

Vamos agora editar o principal arquivo de configuração do kerberos, o krb5.conf, mas vamos editar uma arquivo do zero.
# mv /etc/krb5.conf /etc/krb5.conf.old
# vim /etc/krb5.conf

 

Configuração

[libdefaults]
default_realm = SEUNOME.COM.BR
[realms]
SEUNOME.COM.BR = {
kdc = kerberos.seunome.com.br:88
admin_server = kerberos.seunome.com.br:749
default_domain = seunome.com.br
}
[domain_realm]
seunome.com.br = SEUNOME.COM.BR
.seunome.com.br = SEUNOME.COM.BR
[logging]
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmin.log
default = FILE:/var/log/krb5lib.log
Edite o arquivo /etc/krb5kdc/kdc.conf:
# vim /etc/krb5kdc/kdc.conf

[kdcdefaults]
kdc_ports = 750,88
[realms]
SEUNOME.COM.BR = {
database_name = /var/lib/krb5kdc/principal
admin_keytab = FILE:/etc/krb5kdc/kadm5.keytab
acl_file = /etc/krb5kdc/kadm5.acl
key_stash_file = /etc/krb5kdc/stash
kdc_ports = 750,88
max_life = 10h 0m 0s
max_renewable_life = 7d 0h 0m 0s
master_key_type = des3-hmac-sha1
supported_enctypes = aes256-cts:normal arcfour-hmac:normal des3-hmac-sha1:normal des-cbc-crc:normal des:normal des:v4 des:norealm des:onlyrealm des:afs3
default_principal_flags = +preauth
}

A configuração do Kerberos exigirá a execução de alguns comandos e criação de alguns usuários.
# kdb5_util create -r SEUNOME.COM.BR -s
Crie o arquivo “/etc/krb5kdc/kadm5.acl” e adicione o seguinte conteúdo:
# vim /etc/krb5kdc/kadm5.acl
*/admin@SEUNOME.COM.BR *
Crie um usuário administrativo:
#kadmin.local -q”addprinc admin/admin@SEUNOME.COM.BR”
Reinicie os daemons para que as configurações, feitas até o momento,tenha efeito:
# /etc/init.d/krb5-kdc restart
# /etc/init.d/krb5-admin-server restart

Nosso servidor, neste momento, também é um cliente Kerberos. Para que este cliente seja capaz de utilizar o serviço, será
necessário criar as chaves de encriptação.
# kadmin -p admin/admin@SEUNOME.COM.BR -q “addprinc-randkey host/ldap01.seunome.com.br”
# kadmin -p admin/admin@SEUNOME.COM.BR -q “ktadd host/ldap01.seunome.com.br”

Localmente será necessário criar o arquivo “keytab” do “realm”. Este arquivo contém um “dump” da chave pública da encriptação
utilizada para proteger os “tickets” gerados.
# kadmin.local -q “ktadd -k /etc/krb5kdc/kadm5.keytab kadmin/admin kadmin/changepw”

Vamos reiniciar os daemons para que as configurações, feitas até o momento, tenham efeito.
# /etc/init.d/krb5-kdc restart
# /etc/init.d/krb5-admin-server restart

Vamos criar um usuário chamado “kerberos” para testar nossa autenticação local utilizando o servidor Kerberos.
# kadmin.local -q “addprinc kerberos@SEUNOME.COM.BR”

 

Configurando o OpenLDAP

Uma vez que o Kerberos esteja devidamente configurado, faz-se necessário configurar o OpenLDAP. Essa configuração trata-se
da adição de um novo schema contendo uma série de novos atributos.
Baixe o arquivo schema:

# wget http://www.bayour.com/openldap/schemas/krb5-kdc.schema

Vamos incluir no arquivo do OpenLDAP o novo schema:
# vim /etc/ldap/slapd.conf
include /etc/ldap/schema/krb5-kdc.schema

# /etc/init.d/slapd restart

Criar um arquivo chamado “kerberos_user.ldif” com o seguinte conteúdo:
# vim kerberos_user.ldif

dn: cn=kerberos,ou=Usuarios,dc=seunome,dc=com,dc=br
uid: kerberos
cn: kerberos
givenName: kerberos
sn: kerberos
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
objectClass: krb5Principal
Configurando o OpenLDAP
shadowLastChange: 14333
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/sh
uidNumber: 2011
gidNumber: 2011
homeDirectory: /home/kerberos
gecos: kerberos
krb5PrincipalName: kerberos@SEUNOME.COM.BR
userPassword: {KERBEROS}kerberos@SEUNOME.COM.BR

Adicione no OpenLDAP:
# ldapadd -f kerberos_user.ldif -x -D “cn=admin,dc=seunome,dc=com,dc=br” -W
# ldapasearch -x -D “cn=admin,dc=seunome,dc=com,dc=br”

 

 

Configurando o PAM

Esta é uma configuração bem simples. Ela consiste, apenas, da instalação da biblioteca de suporte ao Kerberos e de sua
ativação nos arquivos de configuração.
# aptitude install libpam-krb5

Edite o arquivo “/etc/pam.d/common-auth” e adicione o seguinte conteúdo antes de todas as linhas existentes:
# vim /etc/pam.d/common-auth

auth
sufficient
pam_krb5.so use_first_pass forwardable

Edite o arquivo “/etc/pam.d/common-password” e adicione o seguinte conteúdo antes de todas as linhas existentes:
# vim /etc/pam.d/common-password

password required pam_krb5.so use_first_pass

 

Edite o arquivo “/etc/pam.d/common-session” e adicione o seguinte conteúdo antes de todas as linhas existentes:
# /etc/pam.d/common-session

session sufficient pam_krb5.so
Testando a autenticação

 

Com a configuração do PAM podemos criar o ambiente do usuário e testar a autenticação do mesmo.

Crie o diretório HOME do usuário kerberos:
# mkdir /home/kerberos

Corrija o permissionamento do diretório:
# chown kerberos: /home/kerberos

Reinicie o serviço “nscd” para evitar problemas de cache:
# /etc/init.d/nscd restart

 

 

Instalando e ativando o SASL
O SASL é um projeto desenvolvido pela mesma equipe do servidor IMAP/POP Cyrus. E seu ponto forte é oferecer a centralização do mecanismo de autenticação, pois ele permite conexão a diversos servidores e bases de dados diferentes.
# aptitude install sasl2-bin

Para ativar o SASL altere no arquivo “/etc/default/saslauthd”.

para que a opção “START” fique assim:
START=yes

Reinicie o serviço SASL
# /etc/init.d/saslauthd restart

 

Instalando e ativando o SASL
O SASL traz consigo um comando para testes. Use-o como descrito abaixo:
# testsaslauthd -u kerberos -p senha

O resultado esperado é algo parecido com:
0: OK “Success.”

 

 

Integrando com Active Directory
A única forma de integrar com Active Directory é ter um Servidor Windows com esse serviço configurado e ativado. Para que o servidor Kerberos saiba onde irá realizar as novas consultas, será necessário criar um “realm” com o mesmo nome do domínio do Active Directory em nosso servidor Kerberos. Para isso execute:

# kdb5_util create -r DOMINIO.COM.BR -s

 

O nosso servidor Kerberos precisa ser informado de que o “realm” que será utilizado é outro. Para isso precisaremos alterar o arquivo de configuração “/etc/krb5.conf”.

# vim /etc/krb5.conf

 

Altere o arquivo para que fique assim:
[logging]
default = FILE:/var/log/libs.log
kdc = FILE:/var/log/kdc.log
admin_server = FILE:/var/log/admin.log
[libdefaults]
ticket_lifetime = 24000
default_realm = DOMINIO.COM.BR
default_tgs_enctypes = rc4-hmac des-cbc-crc des-cbc-md5
default_tkt_enctypes = rc4-hmac des-cbc-crc des-cbc-md5
forwardable = true
proxiable = true
dns_lookup_realm = no
Integrando com Active Directory
dns_lookup_kdc = no
[realms]
DOMINIO.COM.BR = {
kdc = server.dominio.com.br
default_domain = dominio.com.br
}
[domain_realm]
.dominio.com.br = DOMINIO.COM.BR
dominio.com.br = DOMINIO.COM.BR

 

Altere o /etc/hosts:
192.168.0.X server.dominio.com.br server

Reinicie os daemons para que as configurações, feitas até o momento, tenhas efeito:
# /etc/init.d/krb5-kdc restart
# /etc/init.d/krb5-admin-server restart

 

Entendendo a integração entre o Active Directory e o OpenLDAP
Perceba que a integração dos dois Servidores LDAP se dará pela autenticação de um usuário que existirá no Active Directory com sua senha lá, e de um usuário igual criado no OpenLDAP que buscará a senha no Active Directory. Integrando com Active Directory. No windows crie um usuário chamado “janela” definindo uma senha válida e desmarque a exigência de alteração de senha no primeiro login. A senha será: jan_1010 Crie um arquivo chamado “windows_user.ldif” com o seguinte conteúdo:

# vim windows_user.ldif
dn: cn=janela,ou=Usuarios,dc=seunome,dc=com,dc=br
uid: janela
cn: janela
givenName: janela
sn: janela
objectClass: person
objectClass: organizationalPerson
Integrando com Active Directory
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
objectClass: krb5Principal
shadowLastChange: 14333
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/sh
uidNumber: 1012
gidNumber: 1012
homeDirectory: /home/janela
gecos: janela
krb5PrincipalName: janela@WINDOWS.COM
userPassword: {KERBEROS}janela@WINDOWS.COM

Vamos adicionar o conteúdo na base:
# ldapadd -f windows_user.ldif -x -D “cn=admin,dc=seunome,dc=com,dc=br -W

O teste de integração será feito com o auxílio do serviço de autenticação SASL. Assim:

# testsaslauthd -u janela -p jan_1010

O resultado esperado é algo parecido com:
0: OK “Success.”