You are here: Foswiki>Wiki Web>HowtoOpenLDAP (revision 2)EditAttach

Howto OpenLDAP

Objetivo

Esse documento mostrará dicas gerais para instalação e configuração de um servidor OpenLDAP. Para isso vamos suporte um ambiente de exemplo conforme abaixo:
  • Domínio: foobar.br
  • Base: dc=foobar,dc=br
  • Hostname do servidor LDAP: ldap.foobar.org

Descrição das etapas

Instalação básica do servidor OpenLDAP

Antes de proceder com a instalação do servidor OpenLDAP cabe uma breve discussão sobre o modo on-line configuration e slapd.conf. Historicamente o servidor OpenLDAP era configurado através de um arquivo de configuração (/etc/ldap/slapd.conf) e qualquer alteração necessitava de uma reinicialização do serviço. Embora o processo de restart da base seja rápido, em bases grandes ou com muitas requisições de autenticação, a interrupção do serviço pode causar transtornos significativos. A partir da versão 2.3, o OpenLDAP passou a suportar sua configuração também no formato LDAP em uma DIT específica, chamada on-line configuration (OLC), cujo DN é cn=config. Esse modo de configuração permite zero downtime para alterações nas configurações da base! Algumas distribuições passaram, então, a usar o modo OLC por padrão nas versões mais recentes. No entanto, a complexidade de manutenção da base torna-se um pouco maior com OLC e não existem ferramentas de gerenciamento consolidadas ainda para facilitar seu gerenciamento. Dessa forma, nesse documento vamos mostrar a utilização do modelo antigo, baseado no slapd.conf.

Antes de iniciar a instalação, vamos criar a configuração slapd.conf manualmente:

 cp /usr/share/slapd/slapd.conf /etc/ldap/slapd.conf
sed -i "s/@BACKEND@/hdb/" /etc/ldap/slapd.conf
sed -i "s/@SUFFIX@/dc=foobar,dc=br/" /etc/ldap/slapd.conf
sed -ri "s/# rootdn *\"cn=admin/rootdn \"cn=gerente-ldap/" /etc/ldap/slapd.conf
sed -i '/@ADMIN@/d' /etc/ldap/slapd.conf
sed -i 's/dbconfig/# dbconfig/g' /etc/ldap/slapd.conf

Na configuração acima, atente-se para:
  • Altere o domínio e a base para a sua realidade
  • Tipo do backend: HDB (HDB é bem parecida com a Berkeley DB, com exceção que implementa a base de forma hierárquica e suporta fazer renomeação na hierarquia)
  • Como boa prática de segurança, alteramos a conta do administrador da base para um padrão interno, em particular cn=gerente-ldap.

Agora deve-se informar ao DPKG para ignorar as perguntas de configuração no DEBCONF:

debconf-set-selections <<-EOF
slapd slapd/no_configuration boolean true
EOF

O próximo passo é realizar a instalação do servidor LDAP, com o seguinte comando:

aptitude install slapd ldap-utils

Após realizar a configuração inicial do LDAP, vamos modificar o DN do admin a fim de evitar tentativas de brute-force com esse usuário (nome padrão: cn=admin). Para isso execute o seguinte comando (informe a senha criada acima):

ldapmodrdn -x -h localhost -D cn=admin,dc=foobar,dc=br -W cn=admin,dc=foobar,dc=br cn=gerente-ldap

Os passos acima farão com que a configuração do LDAP seja realizada através do método Online Configuration (as configurações ficam também na base LDAP, no dn: cn=config). Vamos migrar para a configuração no modelo antigo, através do arquivo slapd.conf. Para isso, execute os seguintes comandos:

invoke-rc.d slapd stop
rm -rf /etc/ldap/slapd.d/
cp /usr/share/slapd/slapd.conf /etc/ldap/
sed -i "s/@BACKEND@/mdb/" /etc/ldap/slapd.conf
sed -i "s/@SUFFIX@/dc=foobar,dc=br/" /etc/ldap/slapd.conf
sed -ri "s/# rootdn *\"cn=admin/rootdn \"cn=gerente-ldap/" /etc/ldap/slapd.conf
sed -i '/@ADMIN@/d' /etc/ldap/slapd.conf
sed -i 's/dbconfig/# dbconfig/g' /etc/ldap/slapd.conf
invoke-rc.d slapd start

Design da base LDAP

A base LDAP é formada por vários OUs (Organization Units), cada um com os usuários (pessoas) de cada entidade envolvida nas atividades e serviços. A configuração de design proposta para a sua organização leva em consideração diferentes subárvores para usuários, grupos e aplicações. Para implementar essa estrutura, crie o arquivo LDIF abaixo (/root/design-ldap-foobar.ldif):

# people, foobar.br
dn: ou=people,dc=foobar,dc=br
objectClass: organizationalUnit
objectClass: top
ou: people

# groups, foobar.br
dn: ou=groups,dc=foobar,dc=br
objectClass: organizationalUnit
objectClass: top
ou: groups

# apps, foobar.br
dn: ou=apps,dc=foobar,dc=br
objectClass: organizationalUnit
objectClass: top
ou: apps

Em seguida, atualize a base LDAP para incluir essa nova estrutura:

ldapadd -x -h localhost -D cn=gerente-ldap,dc=foobar,dc=br -W -f base-ldap-foobar.ldif

Criação de aplicações de leitura da base

Como mecanismo de segurança, a base LDAP não permitirá leitura de login anonimo. Para isso, desativaremos esse tipo de consulta e criaremos usuários específicos para cada consulta. Devemos, portanto, alterar privilégios para evitar bind anonimo com leitura (apenas autenticado pode ler), alterando o seguinte trecho do arquivo /etc/ldap/slapd.conf:

# The admin dn has full write access, everyone else
# need to authenticate to read anything
access to *
        by users read
        by anonymous auth
        by * none

Em seguida, vamos criar um usuário de leitura de uma aplicação genérica XPTO, que será usado futuramente para autenticação de usuários ou buscas na base:

cat > leitor-xpto.ldif <<EOF
dn: cn=leitor-xpto,ou=apps,dc=foobar,dc=br
objectClass: organizationalRole
objectClass: simpleSecurityObject
cn: leitor-xpto
description: Leitor XPTO
userPassword: {SSHA}xxxx
EOF

A senha pode ser gerada com o aplicativo slappasswd.

Agora é preciso inserir essa nova conta:

ldapadd -x -h localhost -D cn=gerente-ldap,dc=foobar,dc=br -W -f leitor-xpto.ldif

Habilitar schemas adicionais

Abaixo vamos mostrar como adicionar esquemas LDAP adicionais à sua base. Os esquemas LDAP agregam novos atributos e classes de objetos, expandindo a capacidade de armazenamento da sua base. No exemplo a seguir vamos mostrar a inserção de atributos necessários pela CAFe/RNP - Comunidade Acadêmica Federada.

Para importar a base de dados é necessário antes adicionar os schemas misc.schema, eduPerson e brEduPerson, que serão utilizados para prover atributos da Federação CAFe.

Para isso é necessário baixar os schemas do CAFe:

wget https://svn.rnp.br/repos/CAFe/schemas/openldap/eduperson.schema -O /etc/ldap/schema/eduperson.schema --no-check-certificate
wget https://svn.rnp.br/repos/CAFe/schemas/openldap/breduperson.0.0.6.schema -O /etc/ldap/schema/breduperson.schema --no-check-certificate

Em seguida, devemos editar o arquivo /etc/ldap/slapd.conf e acrescentar os seguintes schemas na configuração:

...
include         /etc/ldap/schema/misc.schema
include         /etc/ldap/schema/eduperson.schema
include         /etc/ldap/schema/breduperson.schema
...

Em seguida faça um teste na configuração do slapd:

slapd -Tt

E caso o retorno seja config file testing succeeded, faça o restart do daemon:

invoke-rc.d slapd restart

Limite de respostas

Também é necessário tirar o limite das respostas através de consultas LDAP do servidor slapd, para isto basta editar o arquivo /etc/ldap/slapd.conf conforme abaixo:
 # The maximum number of entries that is returned for a search operation
-sizelimit 500
+sizelimit unlimited

Logging

É importante habilitar o logging para auditoria das requisições de autenticação (bind), consultas, operações de modificação, etc. Para isso, edite o arquivo de configuração do OpenLDAP (slapd.conf) conforme abaixo:

diff --git a/ldap/slapd.conf b/ldap/slapd.conf
index db3f82f..4e38c3f 100644
--- a/ldap/slapd.conf
+++ b/ldap/slapd.conf
@@ -30,7 +30,7 @@ pidfile         /var/run/slapd/slapd.pid
 argsfile        /var/run/slapd/slapd.args
 
 # Read slapd.conf(5) for possible values
-loglevel        1
+loglevel        256
 
 # Where the dynamically loaded modules are stored
 modulepath     /usr/lib/ldap

Índices

Para otimizar o desempenho das consultas no LDAP é importante criar índices que irão criar referencias em memória para os atributos mais acessados. Para isso devemos editar o arquivo /etc/ldap/slapd.conf conforme abaixo:

# Indexing options for database #1
index   objectClass             eq
index   cn                      eq
index   mail                    eq
index   dc                      eq
index   uid                     pres,sub,eq
index   brEduAffiliation        pres
index   brEntranceDate          pres
index   brExitDate              pres

Agora é preciso recriar os índices e reiniciar o daemon:

invoke-rc.d slapd stop
slapindex
chown -R openldap:openldap /var/lib/ldap
invoke-rc.d slapd start

Habilitar SSL/TLS

Nesse ambiente vamos criar uma autoridade certificadora específica para emitir os certificados SSL/TLS do LDAP. Para isso vamos criar uma CA com o comando abaixo (utilize a senha conforme SUSSEG):

mkdir /etc/ldap/ssl
cd /etc/ldap/ssl
openssl genrsa -des3 -out ldap-ca.key 2048

Em seguida vamos criar um certificado para a nossa CA:

openssl req -new -x509 -days 36500 -key ldap-ca.key -out ldap-ca.crt 

Responda as seguintes perguntas:
  • Country Name: BR
  • State: Bahia
  • Locality: Salvador
  • Organization Name: FOOBAR
  • Organization Unit: SetorTI
  • Common Name: CA LDAP FOOBAR
  • Email Address:

Agora vamos criar o certificado do servidor LDAP, assinado pela CA criada acima. Primeiro vamos gerar uma requisição de certificado:

openssl req -nodes -new -keyout ldap.key -out ldap.csr 

Responda as seguintes perguntas:
  • Country Name: BR
  • State: Bahia
  • Locality: Salvador
  • Organization Name: FOOBAR
  • Organization Unit: STI
  • Common Name: ldap.foobar.br
  • Email Address:
  • A challenge password:
  • An optional company name:

Em seguida assinaremos a requisição de certificado com a chave da CA:

openssl x509 -req -in ldap.csr -out ldap.crt -sha1 -CA ldap-ca.crt -CAkey ldap-ca.key -CAcreateserial -days 36500 

Modificaremos a permissão dos arquivos:

chown openldap:openldap ldap.key
chmod 640 ldap.key

Agora devemos configurar no LDAP para utilizar os certificados SSL criados acima. Para isso edite o arquivo /etc/ldap/slapd.conf e insira as seguintes informações (logo no começo antes dos includes):

################
# Global Directives:

# SSL/TLS certificates
TLSCACertificateFile  /etc/ldap/ssl/ldap-ca.crt
TLSCertificateFile    /etc/ldap/ssl/ldap.crt
TLSCertificateKeyFile /etc/ldap/ssl/ldap.key

Alteraremos também o arquivo /etc/default/slapd conforme abaixo:

-SLAPD_SERVICES="ldap:/// ldapi:///"
+SLAPD_SERVICES="ldap:/// ldapi:/// ldaps:///"

Em seguida faça um teste na configuração do slapd:

slapd -Tt

E caso o retorno seja config file testing succeeded, faça o restart do daemon:

invoke-rc.d slapd restart

Configurar o /etc/ldap/ldap.conf (parametros do cliente):

BASE   dc=foobar,dc=br
URI   ldap://localhost
TLS_CACERT   /etc/ldap/ssl/ldap-ca.crt

Alterar o arquivo /etc/hosts e acrescentar um alias para ldap.foobar.br:

diff --git a/hosts b/hosts
index 2dc3692..16c502b 100644
--- a/hosts
+++ b/hosts
@@ -1,5 +1,5 @@
 127.0.0.1      localhost
-127.0.1.1      debian.foobar.br debian
+127.0.1.1      debian.foobar.br debian  ldap.foobar.br
 
 # The following lines are desirable for IPv6 capable hosts
 ::1     localhost ip6-localhost ip6-loopback

Habilitar overlay de reverse group mapping

O overlay de grupo reverso é importante para que, ao inserir um usuário em um grupo, o OpenLDAP insira também um atributo no objeto do usuário informando o DN do grupo que ele pertence. Dessa forma, é possível implementar filtros por atributos que na verdade representam o grupo (exemplo de filtro: (memberOf=cn=helpdesk-admin,ou=groups,dc=foobar,dc=br)), pois algumas ferramentas não suportam fazer controle de acesso por grupo.

O primeiro passo é editar a configuração do servidor LDAP (/etc/ldap/slapd.conf) e garantir a existência das seguintes configurações, que devem ficar antes das definições dos backends:
modulepath      /usr/lib/ldap
moduleload      refint
moduleload      memberof

O módulo memberof irá prover a funcionalidade de mapeamento reverso de grupos, enquanto que o módulo refint será usado para garantir integridade dos atributos de mapeamento reverso quando da remoção de um grupo.

Em seguida, devemos editar novamente a configuração do SLAPD (/etc/ldap/slapd.conf) e incluir a configuração do módulo memberof na base que desejamos habilitá-lo. Nesse momento é importante salientar que a configuração deve vir após a definição do backend da base e antes da definição de outra base.
################
## overlay memberof
################
overlay memberof
# determina se alteracoes nos objetos (ex: novo DN) serao replicadas
# para os grupos aos quais ele eh "member of", garantindo a integridade
# referencial (refint)
memberof-refint true
# nome do objectClass que eh usado para disparar mapeamento reverso de grupos
memberof-group-oc groupOfNames
# atributo que armazena o DN dos membros de um grupo
memberof-member-ad member
# atributo que armazena o(s) DN(s) do(s) grupo(s) de um usuario
memberof-memberof-ad memberOf

Vamos criar índices para os atributos do overlay memberof. Para isso devemos editar o arquivo /etc/ldap/slapd.conf conforme abaixo:
# Indexing options for database #1
...
index   member                  eq
index   memberOf                eq

Em seguida faça um teste na configuração do slapd:
slapd -Tt

E caso o retorno seja config file testing succeeded, é preciso recriar os índices e reiniciar o daemon:
invoke-rc.d slapd stop
slapindex
chown -R openldap:openldap /var/lib/ldap
invoke-rc.d slapd start

Abaixo um exemplo de criação de grupo com mapeamento reverso pode ser visto no LDIF abaixo, onde o usuário fulano, beltrano e cicrano foram inseridos no grupo:
# owncloud-users, groups, foobar.br
dn: cn=owncloud-users,ou=groups,dc=foobar,dc=br
objectClass: groupOfNames
cn: owncloud-users
description: Grupo de usuarios com acesso ao owncloud
member: uid=fulano,ou=people,dc=foobar,dc=br
member: uid=beltrano,ou=people,dc=foobar,dc=br
member: uid=cicrano,ou=people,dc=foobar,dc=br

Nesse exemplo ficitício, poderíamos depois listar os membros do grupo owncloud-users, com uma busca como:
ldapsearch -x -h localhost -D cn=gerente-ldap,dc=foobar,dc=br -W -b dc=foobar,dc=br '(memberOf=cn=owncloud-users,ou=groups,dc=foobar,dc=br)'

Habilitar overlay de last bind

O overlay de lastbind é interessante para armazenar o timestamp do último logon do usuário, facilitando assim a identificação de usuários inativos.

O primeiro passo é editar a configuração do servidor LDAP (/etc/ldap/slapd.conf) e garantir a existência das seguintes configurações, que devem ficar antes das definições dos backends:

modulepath      /usr/lib/ldap
moduleload      lastbind

Em seguida, devemos editar novamente a configuração do SLAPD (/etc/ldap/slapd.conf) e incluir a configuração do módulo lastbind na base que desejamos habilitá-lo. Nesse momento é importante salientar que a configuração deve vir após a definição do backend da base e antes da definição de outra base.

###################################################
## overlay lastbind
###################################################
overlay lastbind
# tempo maximo (seg) que o authTimestamp pode ficar desatualizado por questoes 
# de desempenho. Caso seja omitido, sera atualizado a cada bind com sucesso
lastbind-precision 86400

Em seguida faça um teste na configuração do slapd:

slapd -Tt

E caso o retorno seja config file testing succeeded, faça o restart do daemon:

invoke-rc.d slapd restart

Integração entre o OpenLDAP e AD

Para permitir a integração das bases OpenLDAP e AD, será utilizado o framework de autenticação SASL. Essa integração é importante pois o AD não permite exportar as senhas dos usuários, dessa forma a base LDAP irá conter os atributos gerais do usuário (nome, login, e-mail etc) mas a senha continuará sendo armazenada no AD.

O primeiro passo é instalar o daemon do SASL:

aptitude install sasl2-bin 

Em seguida é necessário efetuar algumas configurações dos parâmetros do daemon (/etc/default/saslauthd):

diff --git a/default/saslauthd b/default/saslauthd
index a60eaa1..c40583d 100644
--- a/default/saslauthd
+++ b/default/saslauthd
@@ -4,7 +4,7 @@
 #
 
 # Should saslauthd run automatically on startup? (default: no)
-START=no
+START=yes
 
 # Description of this saslauthd instance. Recommended.
 # (suggestion: SASL Authentication Daemon)
@@ -29,7 +29,7 @@ NAME="saslauthd"
 # for more information.
 #
 # Example: MECHANISMS="pam"
-MECHANISMS="pam"
+MECHANISMS="ldap"
 
 # Additional options for this mechanism. (default: none)
 # See the saslauthd man page for information about mech-specific options.
@@ -59,4 +59,4 @@ THREADS=5
 # then your Postfix is running in a chroot.
 # If it has the line "smtp inet n - n - - smtpd" then your Postfix is NOT
 # running in a chroot.
-OPTIONS="-c -m /var/run/saslauthd"
+OPTIONS="-c -m /var/run/saslauthd -O /etc/saslauthd.conf"

Deve-se, ainda, criar arquivo de configuração do SASLAUTHD em /etc/saslauthd.conf (atente-se para configurar a senha do usuário cafernp-sync-rw conforme SUSSEG):

ldap_servers: ldap://ldap-ad.intranet.foobar.br
ldap_search_base: dc=mydomain,dc=foobar,dc=br
ldap_timeout: 10
ldap_filter: sAMAccountName=%U
ldap_bind_dn: leitor-ad@mydomain.foobar.br
ldap_password: XXXXXX
ldap_deref: never
ldap_restart: yes
ldap_scope: sub
ldap_use_sasl: no
ldap_start_tls: no
ldap_version: 3
ldap_auth_method: bind

É preciso agora fazer a ligação entre o daemon do OpenLDAP e do SASL. Para isso utilizaremos um socket do tipo MUTEX, configurado da seguinte maneira:

cat > /usr/lib/sasl2/slapd.conf <<EOF
pwcheck_method: saslauthd
saslauthd_path: /var/run/saslauthd/mux
EOF

É precisso adicionar o usuário do OpenLDAP ao grupo do SASL:

adduser openldap sasl

Habilitar os parametros de autenticação SASL no OpenLDAP:

diff --git a/ldap/slapd.conf b/ldap/slapd.conf
index c58060b..bb67edf 100644
--- a/ldap/slapd.conf
+++ b/ldap/slapd.conf
@@ -44,6 +44,10 @@ sizelimit unlimited
 # for indexing.
 tool-threads 1
 
+# SASL authentication parameters
+sasl-host       localhost
+sasl-secprops   none
+
 #######################################################################
 # Specific Backend Directives for hdb:
 # Backend specific directives apply to this backend until another

Reiniciar o daemon do OpenLDAP e do SASL:

invoke-rc.d slapd restart 
/etc/init.d/saslauthd restart

TODO: documentar tunning de performance, tamanho do cache, etc.

Performance LDAP - OpenLDAP

http://www.openldap.org/faq/data/cache/1075.html

http://www.openldap.org/faq/data/cache/1076.html

Limpeza de logs de transação

O OpenLDAP faz log de transação quanto às modificações na base. Para isso, crie a tarefa no CRON (/etc/cron.d/openldap) para remover arquivos de logs antigos:

# cron for cleanup openldap logs
# m h dom mon dow user command
0 0 * * * root find /var/lib/ldap -name 'log.*' -mtime +15 -delete

Próximos passos

* Interface de gerenciamento do LDAP (phpldapadmi, LAM) * Interface de alteração de senha e aplicação de política de senha

Referências

-- ItaloValcy - 14 Jul 2016
Edit | Attach | Print version | History: r4 < r3 < r2 < r1 | Backlinks | View wiki text | Edit WikiText | More topic actions...
Topic revision: r2 - 14 Jul 2016, italovalcy
 
  • <span class=
No permission to view System.WebBottomBarExample