You are here:
Foswiki
>
Wiki Web
>
HowtoOpenLDAP
(revision 3) (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> ---+++ 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> ---+++ 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 [[https://portal.rnp.br/web/servicos/especificacao-tecnica][Federação CAFe]]. Além disso, é importante também importar o schema *schac.schema* (SCHema for ACademia), que é o [[https://wiki.refeds.org/display/STAN/SCHAC+Releases][schema utilizado para a Rede de Inter-Federações]]. 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> Para baixar os schemas do SCHAC: <verbatim> wget https://wiki.refeds.org/download/attachments/1606048/schac-20150413-1.5.0.schema.txt -O /etc/ldap/schema/schac.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 include /etc/ldap/schema/schac.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 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 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: <verbatim> modulepath /usr/lib/ldap moduleload refint moduleload memberof </verbatim> 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. <verbatim> ################ ## 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 </verbatim> Vamos criar índices para os atributos do overlay memberof. Para isso devemos editar o arquivo =/etc/ldap/slapd.conf= conforme abaixo: <verbatim> # Indexing options for database #1 ... index member eq index memberOf eq </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_, é 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> 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: <verbatim> # 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 </verbatim> Nesse exemplo ficitício, poderíamos depois listar os membros do grupo owncloud-users, com uma busca como: <verbatim> 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)' </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> ---+++ 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: r3 - 06 Jul 2017, italovalcy
Wiki
Toolbox
Create New Topic
Index
Search
Changes
Notifications
RSS Feed
Statistics
Preferences
<span class=
No permission to view
System.WebBottomBarExample