You are here:
Foswiki
>
Wiki Web
>
HowtoOpenLDAP
(revision 1) (raw view)
Edit
Attach
---+!! Howto !OpenLDAP %TOC% ---++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: <verbatim> 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 </verbatim> 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: <verbatim> debconf-set-selections <<-EOF slapd slapd/no_configuration boolean true EOF </verbatim> O próximo passo é realizar a instalação do servidor LDAP, com o seguinte comando: <verbatim> aptitude install slapd ldap-utils </verbatim> 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): <verbatim> ldapmodrdn -x -h localhost -D cn=admin,dc=foobar,dc=br -W cn=admin,dc=foobar,dc=br cn=gerente-ldap </verbatim> 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: <verbatim> 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 </verbatim> ---+++ 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 [[https://portal.rnp.br/web/servicos/especificacao-tecnica][Federação CAFe]]. Para isso é necessário baixar os schemas do CAFe: <verbatim> 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 </verbatim> Em seguida, devemos editar o arquivo =/etc/ldap/slapd.conf= e acrescentar os seguintes schemas na configuração: <verbatim> ... include /etc/ldap/schema/misc.schema include /etc/ldap/schema/eduperson.schema include /etc/ldap/schema/breduperson.schema ... </verbatim> Em seguida faça um teste na configuração do slapd: <verbatim> slapd -Tt </verbatim> E caso o retorno seja _config file testing succeeded_, faça o restart do daemon: <verbatim> invoke-rc.d slapd restart </verbatim> ---+++ 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: <verbatim> # The maximum number of entries that is returned for a search operation -sizelimit 500 +sizelimit unlimited </verbatim> ---+++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: <verbatim> 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 </verbatim> ---+++ Í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: <verbatim> # 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 </verbatim> Agora é preciso recriar os índices e reiniciar o daemon: <verbatim> invoke-rc.d slapd stop slapindex chown -R openldap:openldap /var/lib/ldap invoke-rc.d slapd start </verbatim> ---+++ 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): <verbatim> mkdir /etc/ldap/ssl cd /etc/ldap/ssl openssl genrsa -des3 -out ldap-ca.key 2048 </verbatim> Em seguida vamos criar um certificado para a nossa CA: <verbatim> openssl req -new -x509 -days 36500 -key ldap-ca.key -out ldap-ca.crt </verbatim> 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: <verbatim> openssl req -nodes -new -keyout ldap.key -out ldap.csr </verbatim> 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: <verbatim> openssl x509 -req -in ldap.csr -out ldap.crt -sha1 -CA ldap-ca.crt -CAkey ldap-ca.key -CAcreateserial -days 36500 </verbatim> Modificaremos a permissão dos arquivos: <verbatim> chown openldap:openldap ldap.key chmod 640 ldap.key </verbatim> 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): <verbatim> ################ # Global Directives: # SSL/TLS certificates TLSCACertificateFile /etc/ldap/ssl/ldap-ca.crt TLSCertificateFile /etc/ldap/ssl/ldap.crt TLSCertificateKeyFile /etc/ldap/ssl/ldap.key </verbatim> Alteraremos também o arquivo =/etc/default/slapd= conforme abaixo: <verbatim> -SLAPD_SERVICES="ldap:/// ldapi:///" +SLAPD_SERVICES="ldap:/// ldapi:/// ldaps:///" </verbatim> Em seguida faça um teste na configuração do slapd: <verbatim> slapd -Tt </verbatim> E caso o retorno seja _config file testing succeeded_, faça o restart do daemon: <verbatim> invoke-rc.d slapd restart </verbatim> Configurar o /etc/ldap/ldap.conf (parametros do cliente): <verbatim> BASE dc=foobar,dc=br URI ldap://localhost TLS_CACERT /etc/ldap/ssl/ldap-ca.crt </verbatim> Alterar o arquivo =/etc/hosts= e acrescentar um alias para ldap.foobar.br: <verbatim> 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 </verbatim> ---+++ 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: <verbatim> modulepath /usr/lib/ldap moduleload lastbind </verbatim> 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. <verbatim> ################################################### ## 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 </verbatim> Em seguida faça um teste na configuração do slapd: <verbatim> slapd -Tt </verbatim> E caso o retorno seja _config file testing succeeded_, faça o restart do daemon: <verbatim> invoke-rc.d slapd restart </verbatim> ---+++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=): <verbatim> # 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 </verbatim> Em seguida, atualize a base LDAP para incluir essa nova estrutura: <verbatim> ldapadd -x -h localhost -D cn=gerente-ldap,dc=foobar,dc=br -W -f base-ldap-foobar.ldif </verbatim> ---+++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=: <verbatim> # 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 </verbatim> 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: <verbatim> 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 </verbatim> A senha pode ser gerada com o aplicativo slappasswd. Agora é preciso inserir essa nova conta: <verbatim> ldapadd -x -h localhost -D cn=gerente-ldap,dc=foobar,dc=br -W -f leitor-xpto.ldif </verbatim> ---+++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: <verbatim> aptitude install sasl2-bin </verbatim> Em seguida é necessário efetuar algumas configurações dos parâmetros do daemon (=/etc/default/saslauthd=): <verbatim> 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" </verbatim> 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): <verbatim> 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 </verbatim> É 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: <verbatim> cat > /usr/lib/sasl2/slapd.conf <<EOF pwcheck_method: saslauthd saslauthd_path: /var/run/saslauthd/mux EOF </verbatim> É precisso adicionar o usuário do !OpenLDAP ao grupo do SASL: <verbatim> adduser openldap sasl </verbatim> Habilitar os parametros de autenticação SASL no !OpenLDAP: <verbatim> 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 </verbatim> Reiniciar o daemon do !OpenLDAP e do SASL: <verbatim> invoke-rc.d slapd restart /etc/init.d/saslauthd restart </verbatim> 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: <verbatim> # cron for cleanup openldap logs # m h dom mon dow user command 0 0 * * * root find /var/lib/ldap -name 'log.*' -mtime +15 -delete </verbatim> ---++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 * [[http://www.zytrax.com/books/ldap/ch6/slapd-config.html][OpenLDAP Book, Chapter 6.1.1: OpenLDAP using OLC (cn=config)]] * [[https://wiki.debian.org/LDAP/OpenLDAPSetup][Setting up an LDAP server with OpenLDAP]] -- Main.ItaloValcy - 14 Jul 2016
Edit
|
Attach
|
P
rint version
|
H
istory
:
r4
<
r3
<
r2
<
r1
|
B
acklinks
|
V
iew topic
|
Edit WikiText
|
More topic actions...
Topic revision: r1 - 14 Jul 2016, italovalcy
Wiki
Toolbox
Create New Topic
Index
Search
Changes
Notifications
RSS Feed
Statistics
Preferences
<span class=
No permission to view
System.WebBottomBarExample