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