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