You are here: Foswiki>Wiki Web>HowtoOpenLDAP (revision 1)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

Habilitar schemas adicionais

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   member                  eq
index   memberOf                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 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

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

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: r1 - 14 Jul 2016, italovalcy
 
  • <span class=
No permission to view System.WebBottomBarExample