Tabela de conteúdo |
O objetivo de utilizar esta ferramenta é criar um repositório de informações e principalmente, para autenticação centralizada de usuários. O OpenLDAP segue o protocolo X.500 e possui diversos schemas que podem ser utilizados para sua configuração.
Primeiro vamos instalar o OpenLDAP no servidor:
# apt-get install slapd ldap-utils
Você será questionado sobre a senha do administrador do OpenLDAP, coloque uma senha segura neste passo (você precisará digitar a senha duas vezes, a segunda como confirmação da primeira). Ao final deste processo você verá as linhas de inicialização do OpenLDAP:
Creating new user openldap... done. Creating initial configuration... done. Creating LDAP directory... done. Starting OpenLDAP: slapd.
A configuração padrão, apenas para constar é a seguinte:
# cat /usr/share/doc/slapd/examples/slapd.conf
include /etc/ldap/schema/core.schema
include /etc/ldap/schema/cosine.schema
include /etc/ldap/schema/nis.schema
include /etc/ldap/schema/inetorgperson.schema
pidfile /var/run/slapd/slapd.pid
argsfile /var/run/slapd/slapd.args
loglevel none
modulepath /usr/lib/ldap
moduleload back_@BACKEND@
sizelimit 500
tool-threads 1
backend @BACKEND@
database @BACKEND@
suffix "@SUFFIX@"
directory "/var/lib/ldap"
dbconfig set_cachesize 0 2097152 0
dbconfig set_lk_max_objects 1500
dbconfig set_lk_max_locks 1500
dbconfig set_lk_max_lockers 1500
index objectClass eq
lastmod on
checkpoint 512 30
access to attrs=userPassword,shadowLastChange
by dn="@ADMIN@" write
by anonymous auth
by self write
by * none
access to dn.base="" by * read
access to *
by dn="@ADMIN@" write
by * read
Em cima desta configuração padrão, o OpenLDAP estará executando com uma base mínima, neste momento já temos nosso servidor OpenLDAP executando. Um detalhe importante, a base OpenLDAP criada vai estar diretamente vinculada ao domínio configurado na instalação do seu servidor, se não era isso que você queria, execute o comando:
# dpkg-reconfigure slapd
e você poderá editar todos os principais detalhes do seu servidor OpenLDAP. Uma observação, no nosso exemplo o domínio utilizado foi: exemplo.com.br, então a base esperada deve ficar: dc=exemplo,dc=com,dc=br.
A base padrão criada, caso você precise criar manualmente pode ser gerada da seguinte forma:
# vim base.ldif dn: dc=exemplo,dc=com,dc=br objectClass: top objectClass: dcObject objectClass: organization o: exemplo.com.br dc: exemplo structuralObjectClass: organization dn: cn=admin,dc=exemplo,dc=com,dc=br objectClass: simpleSecurityObject objectClass: organizationalRole cn: admin description: LDAP administrator userPassword:: e1NTSEF9SHVBVHJ5K3Bwc0diemVqVERXUzU5YVcvWVB4a1hveUo= structuralObjectClass: organizationalRole
esta é a base mínima para o domínio exemplo.com.br, com isso podemos inicializar o uso básico do OpenLDAP.
Se você precisar utilizar usuários com hashes NT/LM, será necessário inserir o schema do Samba. Vamos proveitar e adicionar pelo menos um usuário no sistema, como exemplo.
É hora de modificar o OpenLDAP para armazenar as senhas com hash criptográfico (por questões de segurança, embora o hash NT sejá quase tão fraco quanto ter senha em ClearText, a nossa maior garantia será quando ativarmos a comunicação FreeRadius com o OpenLDAP com TLS). A versão anterior do OpenLDAP utilizava arquivos .schema, agora as configurações são totalmente on-the-fly, e as coisas mudaram um pouco, por isso, para modificar o formato .schema para o novo padrão, precisamos realizar alguns passos. Primeiro vamos baixar o samba.schema:
# apt-get install samba-doc
o arquivo samba.schema.gz, que queremos, vai estar em /usr/share/doc/samba-doc/examples/LDAP/. Agora precisamos convertê-lo para o novo padrão do OpenLDAP, primeiro vamos copiar este esquema para dentro do OpenLDAP:
# zcat /usr/share/doc/samba-doc/examples/LDAP/samba.schema.gz > /etc/ldap/schema/samba.schema
criar um arquivo que será utilizado como pivot para a conversão:
# vim /tmp/schema_convert.conf include /etc/ldap/schema/core.schema include /etc/ldap/schema/collective.schema include /etc/ldap/schema/corba.schema include /etc/ldap/schema/cosine.schema include /etc/ldap/schema/duaconf.schema include /etc/ldap/schema/dyngroup.schema include /etc/ldap/schema/inetorgperson.schema include /etc/ldap/schema/java.schema include /etc/ldap/schema/misc.schema include /etc/ldap/schema/nis.schema include /etc/ldap/schema/openldap.schema include /etc/ldap/schema/pmi.schema include /etc/ldap/schema/ppolicy.schema include /etc/ldap/schema/samba.schema
criar um diretório de saída para a configuração:
# mkdir /tmp/ldif_output
e agora vamos usar o comando slaptest para converter os schemas:
# cd /tmp # slaptest -f schema_convert.conf -F /tmp/ldif_output/ config file testing succeeded
ele vai gerar vários arquivos .ldif dentro de /tmp/ldif_output/cn=config/cn=schema, o que nos interessa é o do Samba, por isso, vamos editar apenas ele (cn={13}samba.ldif), e vamos retirar as informações desnecessárias. Ao abrir o arquivo você vai ver algo como:
dn: cn={13}samba
objectClass: olcSchemaConfig
cn: {13}samba
...
altere por:
dn: cn=samba,cn=schema,cn=config objectClass: olcSchemaConfig cn: samba ...
e no final do arquivo, você deve remover as entradas:
structuralObjectClass: olcSchemaConfig entryUUID: 3a14cf38-c77b-102f-97af-e37d8ac36f95 creatorsName: cn=config createTimestamp: 20110208025944Z entryCSN: 20110208025944.971133Z#000000#000#000000 modifiersName: cn=config modifyTimestamp: 20110208025944Z
pronto, nosso schema do Samba foi alterado para o padrão atual (para facilitar, aqui está o arquivo convertido: samba.ldif.gz). Vamos adicionar o novo schema no OpenLDAP.
Primeiro precisamos definir uma senha para o administrador de configurações, então edite o arquivo:
# vim /etc/ldap/slapd.d/cn=config/olcDatabase\=\{0\}config.ldif
e adicione a linha abaixo depois do atributo olcRootDN::
olcRootPW: senha1
Você poderia, por questões de segurança, gerar um hash usando o comando slappasswd, ao invés de colocar a senha em texto plano. Reinicialize o OpenLDAP:
# /etc/init.d/slapd restart
Agora vamos adicionar o schema do Samba na base do OpenLDAP, lembrando que a senha abaixo é a senha que adicionamos na configuração do OpenLDAP:
# ldapadd -x -W -D cn=admin,cn=config -f /tmp/ldif_output/cn\=config/cn\=schema/cn\=\{13\}samba.ldif
Enter LDAP Password:
o resultado será a seguinte linha:
adding new entry "cn=samba,cn=schema,cn=config"
pronto, o schema do Samba foi adicionado corretamente.
Agora que o OpenLDAP está instalado e configurado com o .schema do Samba, falta ativarmos o conexão segura com TLS e depois deste passo, ativar a configuração de TLS no módulo ldap do FreeRADIUS.
Nós geramos os certificados para o FreeRADIUS usando o OpenSSL, mas na versão do OpenLDAP que vem acompanhando o Debian Squeeze, não é mais utilizado o TLS do OpenSSL e sim o GnuTLS, então primeiro vamos instalar o pacote do GnuTLS:
# apt-get install gnutls-bin
Neste ambiente, vamos utilizar chaves auto assinadas, embora conceitualmente menos seguras, são mais práticas e simples de criar. Primeiro vamos criar a chave privada do servidor:
# cd /etc/ldap/certs # certtool --generate-privkey --outfile ca.key
vamos auto-assinar o certificado gerado para a CA:
# certtool --generate-self-signed --load-privkey ca.key --outfile ca.pem Generating a self signed certificate... Please enter the details of the certificate's distinguished name. Just press enter to ignore a field. Country name (2 chars): BR Organization name: Empresa Organizational unit name: Empresa Locality name: Campo Grande State or province name: MS Common name: radius.exemplo.com.br UID: This field should not be used in new certificates. E-mail: admin@exemplo.com.br Enter the certificate's serial number in decimal (default: 1297288933): Activation/Expiration time. The certificate will expire in (days): 3650 Extensions. Does the certificate belong to an authority? (y/N): N Is this a TLS web client certificate? (y/N): N Is this also a TLS web server certificate? (y/N): N Enter the e-mail of the subject of the certificate: Will the certificate be used for signing (required for TLS)? (y/N): N Will the certificate be used for encryption (not required for TLS)? (y/N): N ... Other Information: Public Key Id: 7003739b2b787b52ea19ae958d76e05c9d004ad7 Is the above information ok? (Y/N): y Signing certificate...
Pronto, agora nós temos uma CA para assinar a chave para o nosso servidor, vamos gerar a chave que será utilizada pelo servidor:
# certtool --generate-privkey --outfile server.key
depois de gerar a chave, precisamos criar o certificado desta chave baseado nas informações da nossa CA:
# certtool --generate-certificate --load-privkey server.key --outfile server.pem --load-ca-certificate ca.pem --load-ca-privkey ca.key Generating a signed certificate... Please enter the details of the certificate's distinguished name. Just press enter to ignore a field. Country name (2 chars): BR Organization name: Empresa Organizational unit name: Empresa Locality name: Campo Grande State or province name: MS Common name: radius.exemplo.com.br UID: This field should not be used in new certificates. E-mail: admin@exemplo.com.br Enter the certificate's serial number in decimal (default: 1297289690): Activation/Expiration time. The certificate will expire in (days): 3650 Extensions. Does the certificate belong to an authority? (y/N): N Is this a TLS web client certificate? (y/N): N Is this also a TLS web server certificate? (y/N): N Enter the e-mail of the subject of the certificate: Will the certificate be used for signing (required for TLS)? (y/N): N Will the certificate be used for encryption (not required for TLS)? (y/N): N ... Other Information: Public Key Id: 6738123e78f3c3ee2c183a860e2c8ac7c79a18ce Is the above information ok? (Y/N): y Signing certificate...
Se você não corrigir as permissões e grupos, o OpenLDAP vai retornar um erro ao tentar inicializar, por isso, vamos ajustar as permissões, dono e grupo dos certificados:
# chmod 600 /etc/ldap/certs/* # chown openldap:openldap /etc/ldap/certs/*
Para modificar o OpenLDAP e adicionar o suporte ao TLS, é necessário informar que agora ele possui informações de chaves e certificados, por isso, vamos criar um arquivo tls_ldap.ldif com as modificações que desejamos:
# vim tls_ldap.ldif dn: cn=config add: olcTLSCACertificateFile olcTLSCACertificateFile: /etc/ldap/certs/ca.pem - add: olcTLSCertificateFile olcTLSCertificateFile: /etc/ldap/certs/server.pem - add: olcTLSCertificateKeyFile olcTLSCertificateKeyFile: /etc/ldap/certs/server.key
e inserir estas novas informações no OpenLDAP:
# ldapmodify -f tls_ldap.ldif -x -W -D "cn=admin,cn=config" Enter LDAP Password:
A senha é a do administrador de configurações, não a da base do OpenLDAP em si, se for bem sucedido, você verá a mensagem:
modifying entry "cn=config"
Se você quiser utilizar o LDAPS (que passa a utilizar também a porta 636 além da porta padrão 389), edite o arquivo /etc/default/slapd:
# vim /etc/default/slapd
e altere a linha:
... SLAPD_SERVICES="ldap:/// ldapi:///" ...
adicionando a informação para conexões seguras:
... SLAPD_SERVICES="ldap:/// ldaps:/// ldapi:///" ...
Depois de realizar estas modificações, reinicialize o OpenLDAP:
# /etc/init.d/slapd restart
Pronto, seu servidor OpenLDAP agora suporta conexões TLS.
Vamos adicionar um usuário que será utilizado nos testes com o FreeRADIUS autenticando no OpenLDAP:
# vim user.ldif
dn: uid=teste,dc=exemplo,dc=com,dc=br
sn: do Teste
cn: Teste do Teste
uid: teste
objectClass: person
objectClass: inetOrgPerson
objectClass: sambaSamAccount
userPassword: {SSHA}gWRX6IuyiGw+0xvPN3JhaGEcvuLJqmlB
sambaNTPassword: 1E39A9A92F2B08A0E69B4D5ADA7E5332
sambaSID: 1
a senha deste usuário é senha1. Vamos adicioná-lo na base do OpenLDAP:
# ldapadd -x -W -D "cn=admin,dc=exemplo,dc=com,dc=br" -f user.ldif
se o usuário foi adicionado com sucesso a seguinte mensagem vai aparecer:
adding new entry "uid=teste,dc=exemplo,dc=com,dc=br"
pronto, temos nosso usuário de testes.
O hash NT é considerado por muitos como um hash tão ClearText, como o próprio ClearText, de acordo com um respeitado desenvolvedor de Software Livre, com 5Gb de disco e 30s, 90% dos hashes NT podem ser quebrados. Então não devemos deixar qualquer um ler este hash na nossa base OpenLDAP.
Vamos adicionar uma ACL no OpenLDAP para limitar a leitura do campo sambaNTPassword:
# vim /etc/ldap/slapd.d/cn\=config/olcDatabase\=\{1\}hdb.ldif
...
olcAccess: {3}to attrs=SambaLMPassword,SambaNTPassword by dn="cn=reader,dc=exemplo,dc=com,dc=br" read by * none
...
salve e reinicialize o OpenLDAP:
# /etc/init.d/slapd restart
Vamos procurar o port mais recente do FreeRADIUS:
# cd /usr/ports # make search name=openldap display=name,path Port: openldap-server-2.4.23 Path: /usr/ports/net/openldap24-server
entre no diretório do openLDAP:
# cd /usr/ports/net/openldap24-server
para o OpenLDAP as configurações padrões são suficientes (aceite as configurações padrões),
vamos compilá-lo:
# make install clean
Uma vez instalado, precisamos criar a base mínima... Diferente do OpenLDAP do Debian, a versão do FreeBSD vem integrada com o OpenSSL, mas não vem com configuração padrão, então são necessários algumas etapas adicionais.
Vamos adicionar um usuário que será utilizado nos testes com o FreeRADIUS autenticando no OpenLDAP:
# ee user.ldif
dn: uid=teste,dc=exemplo,dc=com,dc=br
sn: do Teste
cn: Teste do Teste
uid: teste
objectClass: person
objectClass: inetOrgPerson
objectClass: sambaSamAccount
userPassword: {SSHA}gWRX6IuyiGw+0xvPN3JhaGEcvuLJqmlB
sambaNTPassword: 1E39A9A92F2B08A0E69B4D5ADA7E5332
sambaSID: 1
a senha deste usuário é senha1. Vamos adicioná-lo na base do OpenLDAP:
# ldapadd -x -W -D "cn=admin,dc=exemplo,dc=com,dc=br" -f user.ldif
se o usuário foi adicionado com sucesso a seguinte mensagem vai aparecer:
adding new entry "uid=teste,dc=exemplo,dc=com,dc=br"
pronto, temos nosso usuário de testes.
--Brivaldo 18h57min de 15 de fevereiro de 2011 (AMST)