OpenLDAP

De Biblioteca Unix

Conteúdo

OpenLDAP

Objetivo

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.

Debian Squeeze 6.0

Instalando os Pacotes necessários

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.

Configurações Básicas

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.

Adicionando o schema do Samba no 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.

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 -Y EXTERNAL -H ldapi:/// -f  /tmp/ldif_output/cn\=config/cn\=schema/cn\=\{13\}samba.ldif

o resultado será:

SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "cn=freeradius,cn=schema,cn=config"

pronto, o schema do Samba foi adicionado corretamente.

Ativando o TLS na comunicação com o OpenLDAP

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.

Criando um usuário para testes

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.

Segurança para os hashes NT no OpenLDAP

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

FreeBSD 8.1

Instalando os Pacotes necessários

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.

Configurações Básicas

Adicionando o schema do Samba no OpenLDAP

Ativando o TLS na comunicação com o OpenLDAP

Criando um usuário para testes

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.

Segurança para os hashes NT no OpenLDAP

--Brivaldo 18h57min de 15 de fevereiro de 2011 (AMST)

Ferramentas pessoais