Servidor OpenLDAP

LDAP significa Lightweight Directory Access Protocol (Protocolo Peso-leve de Acesso a Diretórios) e é uma versão simplificada do protocolo X500. A configuração de diretório nesta sessão será usada para autenticação. Apesar disso, um diretório LDAP pode ser usado de diversas formas: autenticação, compartilhamento de diretório (para clientes de email), em qualquer tipo de aplicações. LDAP é um padrão largamente utilizado.

Para descrever rapidamente um LDAP, todas as informações são guardadas em um árvore. Você deve determinar por si mesmo a arborescência do diretório (a Arvore de Informação de Diretório: o DIT, do inglês Directory Information Tree). Vamos começar com uma árvore básica com dois nodos acima da raiz:

Você deve determinar primeiramente qual será a raizdo seu LDAP. Por padrão, sua árvore será determinada pelo seu domínio de internet. Se o seu domínio é example.com (nós iremos usar este nos exemplos) sua raiz será dc=example,dc=com.

Instalação

Primeiramente instale o daemon do servidor ldap (slapd) no servidor; instale os seguintes pacotes: slapd e ldap-utils.

Entre seu domínio e a senha que você deseja para o administrados de diretório.

Apenas poucas mudanças serão feitas na configuração padrão. Primeiramente defina a senha do root no arquivo de configuração (ao invés de no diretório) editando o arquivo /etc/ldap/slapd.conf.

Nunca use a senha como um texto limpo. Para gerar uma senha criptografada use, primeiro, slappasswd suasenha

$ slappasswd
New password:
Re-enter password:
{SSHA}d2BamRTgBuhC6SxC0vFGWol31ki8iq5m

Esse exemplo mostra o que acontece quando você usa a palavra "secret" com senha. (Pela natureza do esquema de encriptação SSHA, seu resultado pode variar.)

Agora edite /etc/ldap/slapd.conf e copie e cole a palavra gerada.

# Make sure you edit or add these directives after the first 'database' directive.

suffix "dc=example,dc=com"
directory "/var/lib/ldap"
rootdn "cn=admin,dc=example,dc=com"
rootpw {SSHA}d2BamRTgBuhC6SxC0vFGWol31ki8iq5m

Populando o LDAP

O diretório foi criado na instalação, agora é hora de populá-lo. Ele será populado com uma entrada "clássica" que será compatível com diretório (um diretório compartilhado, por exemplo), com contas clássicas (para uma aplicação web) e com contas Unix (posix).

O diretório LDAP pode ser preenchido com um arquivo ldif (ldif significa formato para intercâmbio de diretórios do ldap, do inglês ldap directory interchange format). Gere este arquivo exemplo de arquivo de texto init.ldif em qualquer lugar do seu sistema:

dn: dc=example,dc=com
objectClass: dcObject
objectClass: organizationalUnit
dc: example
ou: Example Dot Com

dn: ou=people,dc=example,dc=com
objectClass: organizationalUnit
ou: people

dn: ou=groups,dc=example,dc=com
objectClass: organizationalUnit
ou: groups

dn: uid=john,ou=people,dc=example,dc=com
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: john
sn: Doe
givenName: John
cn: John Doe
displayName: John Doe
uidNumber: 1000
gidNumber: 10000
userPassword: password
gecos: John Doe
loginShell: /bin/bash
homeDirectory: /home/john
shadowExpire: -1
shadowFlag: 0
shadowWarning: 7
shadowMin: 8
shadowMax: 999999
shadowLastChange: 10877
mail: john.doe@example.com
postalCode: 31000
l: Toulouse
o: Example
mobile: +33 (0)6 xx xx xx xx
homePhone: +33 (0)5 xx xx xx xx
title: System Administrator
postalAddress: 
initials: JD

dn: cn=example,ou=groups,dc=example,dc=com
objectClass: posixGroup
cn: example
gidNumber: 10000

No exemplo anterior a estrutura de diretórios, um usuário e um grupo foram configurados. Em outro exemplo você deve ver o objectClass: top adicionado em toda entrada mas este é o comportamento padrão, então você não precisa adicioná-los explicitamente.

Agora, adicione suas entradas ao LDAP:

  • pare o deamon LDAP: sudo /etc/init.d/slapd stop

  • apague o conteúdo que foi adicionado automaticamente na instalação: sudo rm -rf /var/lib/ldap/*

  • adicione o conteúdo sudo slapadd -l init.ldif

  • inicie o daemon LDAP: sudo /etc/init.d/slapd start

Nós podemos verificar que o conteúdo foi adicionado corretamente com as ferramentas do pacote ldap-utils. Para executar uma busca em um diretório LDAP:

ldapsearch -xLLL -b "dc=example,dc=com" uid=john sn givenName cn
dn: uid=john,ou=people,dc=example,dc=com
cn: John Doe
sn: Doe
givenName: John

Apenas uma explicação rápida

  • -x é porque nós não usamos o método de autenticação SASL (por padrão)

  • -LLL desabilita impressão de informações LDIF

Configurando ACL

A autenticação requer acesso a um campo senha, que não deve ser acessível por padrão. Outra característica é que durante a troca de senha usando passwd, shadowLastChange precisa estar acessível. O código a seguir mostra um exemplo de configuração de uma Lista de Controle de Acesso (ACL, do inglês Access Control List) que permite acesso ao shadowLastChange:

access to attr=shadowLastChange
        by dn="cn=manager,dc=example,dc=com" write
        by self write
        by * read

Replicação LDAP

O servico LDAP freqüentemente se torna, em pouco tempo, um serviço altamente crítico em um sistema de informação: tudo está dependendo do LDAP: autenticação, autorização, sistema de email, etc. É uma boa idéia configurar um sistema redundante. Isso é fácil de fazer e aqui está um rápido howto.

A replicação será aqui baseada em uma relação de mestre-escravo. Antes de implementar a replicação do LDAP considere os seguintes passos:

  1. Pare o daemon slapd do servidor mestre

  2. Reconfigure o slapd.conf do servidor mestre para habilitar replicação para o novo servidor escravo.

  3. Exporte a base de dados do servidor mestre.

  4. Configure o slapd.conf do servidor de replica.

  5. Importe a base de dados do servidor mestre para o servidor escravo.

  6. Re/Inicie o processo slapd do servidor de réplica

  7. Re/Inicie o processo slapd do servidor mestre.

Você deve lembrar que essas modificações devem ser SEMPRE feitas no servidor mestre. Se você modificar o escravo, elas serão perdidas.

Mestre LDAP

No mestre você deve modificar a sessão base de dados (database) do arquivo /etc/ldap/slapd.conf para adicionar uma instrução de réplica. O exemplo seguinte mostra uma réplica em ldap-2.example.com com o usuário Gerenciador com secret como senha. O arquivo de log de replicação é o lugar onde as modificações são guardadas antes de serem mandadas para o LDAP escravo.

replica uri=ldap://ldap-2.examplo.com:389 binddn="cn=Manager,dc=examplo,dc=com" bindmethod=simple credentials=secret

replogfile      /var/lib/ldap/replog

Exporte a base de dados do mestre usando slapcat. Então copie master.ldif para o escravo usando scp ou outras ferramentas.

usuario@mestrer:~$ sudo slapcat -l master.ldif

Escravo LDAP

No escravo, você deve autorizar seu mestre para atualizar a base de dados LDAP. Adicione as seguintes linhas ao seu arquivo /etc/ldap/slapd.conf, na sessão de base de dados (database):

updatedn        cn=Manager,dc=examplo,dc=com
updateref       ldap://ldap-1.examplo.com

Importe o master.ldif usando slapadd.

usuario@escravo:~$ sudo slapadd -c -l master.ldif

Reinicie o servidor mestre.

usuario@mestre:~$ sudo /etc/init.d/slapd start

Reinicie o servidor escravo.

usario@escravo:~$ sudo /etc/init.d/slapd start