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:
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:
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
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
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 <
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
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
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
É 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
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
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:
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:
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
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)'
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
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
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 <
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
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 <
É 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
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
* Interface de gerenciamento do LDAP (phpldapadmi, LAM) * Interface de alteração de senha e aplicação de política de senha
-- ItaloValcy - 14 Jul 2016