Product SiteDocumentation Site

11.7. Diretório LDAP

OpenLDAP é uma implementação do protocolo LDAP; em outras palavras, é um banco de dados com propósito especial desenvolvido para armazenar diretórios. No caso mais comum de uso, o uso de um servidor LDAP permite o gerenciamento centralizado de contas de usuários e permissões relacionadas. Além do mais, um banco de dados LDAP é facilmente replicável, o que permite configurar múltiplos servidores LDAP sincronizados. Quando a rede e a base de usuários cresce rapidamente, a carga pode então ser balanceada por entre vários servidores.
Os dados LDAP são estruturados e hierárquicos. A estrutura é definida por “schemas” que descrevem os tipos de objetos que o banco de dados pode armazenar, com uma lista de todos os seus possíveis atributos. A sintaxe usada para se referir a um objeto em particular no banco de dados é baseada em sua estrutura, o que explica sua complexidade.

11.7.1. Instalando

O pacote slapd contém o servidor OpenLDAP. O pacote ldap-utils inclui ferramentas de linha de comando para interação com os servidores LDAP.
Installing slapd usually asks only for the administrator's password and the resulting database is unlikely to suit your needs. Fortunately a simple dpkg-reconfigure slapd will let you reconfigure the LDAP database with more details:
  • Omitir a configuração do servidor OpenLDAP? Não, claro que não, nós queremos configurar esse serviço.
  • DNS nome de domínio: “falcot.com”.
  • Nome da organização: “Falcot Corp”.
  • Senhas administrativas precisam ser digitadas.
  • Banco de dados para utilizar: "MDB".
  • Você quer que o banco de dados seja removido quando o slapd é removido (purged)? Não. Não faz sentido arriscar a perda do banco de dados em caso de um engano.
  • Mover banco de dados antigo? Essa pergunta só é feita enquanto a configuração é feita e já existe um banco de dados. Só responda “sim” se você realmente querer iniciar a partir de um banco de dados limpo, por exemplo, se você rodar dpkg-reconfigure slapd logo após a instalação inicial.
Um base de dados miníma está configurada agora, como demonstrado pela seguinte consulta:
$ ldapsearch -x -b dc=falcot,dc=com
# extended LDIF
#
# LDAPv3
# base <dc=falcot,dc=com> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# falcot.com
dn: dc=falcot,dc=com
objectClass: top
objectClass: dcObject
objectClass: organization
o: Falcot Corp
dc: falcot

# admin, falcot.com
dn: cn=admin,dc=falcot,dc=com
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator

# search result
search: 2
result: 0 Success

# numResponses: 3
# numEntries: 2
A consulta retornour dois objetos: a organização em si, e o usuário administrativo.

11.7.2. Preenchendo o Diretório

Como um banco de dados vazio não é particularmente útil, nós vamos injetar nele todos os diretórios existentes; isso inclui os banco de dados de usuários, grupos, serviços e máquinas.
O pacote migrationtools provê um conjunto de scripts dedicados a extrair dados a partir dos diretórios padrões do Unix (/etc/passwd, /etc/group, /etc/services, /etc/hosts e mais), converter seus dados, e injetá-los em um banco de dados LDAP.
Uma vez que o pacote esteja instalado, o /etc/migrationtools/migrate_common.ph tem que ser editado; as opções IGNORE_UID_BELOW e IGNORE_GID_BELOW precisam ser habilitadas (descomentá-las é suficiente), e DEFAULT_MAIL_DOMAIN/DEFAULT_BASE precisa ser atualizada.
A real operação de migração é feita pelo comando migrate_all_online.sh, como a seguir:
# cd /usr/share/migrationtools
# LDAPADD="/usr/bin/ldapadd -c" ETC_ALIASES=/dev/null ./migrate_all_online.sh
migrate_all_online.sh faz algumas perguntas sobre o banco de dados LDAP para o qual os dados serão migrados. Tabela 11.1 resume as respostas dadas no caso da Falcot.

Tabela 11.1. Responda as perguntas feitas pelo script migrate_all_online.sh

QuestãoResposta
Contexto de nome X.500dc=falcot,dc=com
Nome do servidor LDAPlocalhost
Gerenciando o DNcn=admin,dc=falcot,dc=com
Credenciais Binda senha administrativa
Criar DUAConfigProfilenão
Nós ignoramos a migração do arquivo /etc/aliases deliberadamente, já que o schema padrão, como o fornecido pelo Debian não inclui as estruturas que esse script usa para descrever "email aliases". Se quisermos integrar esse dado no diretório, o arquivo /etc/ldap/schema/misc.schema deve ser adicionado ao schema padrão.
Note também o uso da opção -c do comando ldapadd; essa opção faz com que o processamento não pare em caso de erro. O uso dessa opção é necessário porque a conversão do /etc/services geralmente gera alguns erros que podem ser ignorados com segurança.

11.7.3. Gerenciando Contas com LDAP

Agora o banco de dados LDAP contém algumas informações úteis, chegou a hora de fazer uso desses dados. Essa sessão foca em como configurar um sistema Linux para que os vários sistemas de diretórios usem o banco de dados LDAP.

11.7.3.1. Configurando o NSS

O sistema NSS (Name Service Switch, see sidebar APROFUNDANDO NSS e banco de dados do sistema) é um sistema modular desenvolvido para definir ou obter informações para o sistema de diretórios. Para usar o LDAP como fonte de dados para o NSS requer a instalação do pacote libnss-ldap. Sua instalação faz algumas perguntas; as respostas estão resumidas em Tabela 11.2.

Tabela 11.2. Configurando o pacote libnss-ldap

QuestãoResposta
Servidor LDAP Uniform Resource Identifier ldapi://ldap.falcot.com
Nome distinto da base de pesquisadc=falcot,dc=com
Versão LDAP para usar3
Conta LDAP para rootcn=admin,dc=falcot,dc=com
A senha da conta de root do LDAPa senha administrativa
Allow LDAP admin account behave like local root? yes
O banco de dados LDAP precisa de um login?não
The /etc/nsswitch.conf file then needs to be modified, so as to configure NSS to use the freshly-installed ldap module. You can use the example provided in /usr/share/doc/libnss-ldap/examples/nsswitch.ldap or edit your existing configuration.

Exemplo 11.23. O arquivo /etc/nsswitch.conf

#ident $Id: nsswitch.ldap,v 2.4 2003/10/02 02:36:25 lukeh Exp $
#
# An example file that could be copied over to /etc/nsswitch.conf; it
# uses LDAP conjunction with files.
#
# "hosts:" and "services:" in this file are used only if the
# /etc/netconfig file has a "-" for nametoaddr_libs of "inet" transports.

# the following lines obviate the "+" entry in /etc/passwd and /etc/group.
passwd:                files ldap
shadow:                files ldap
group:                files ldap

# consult DNS first, we will need it to resolve the LDAP host. (If we
# can't resolve it, we're in infinite recursion, because libldap calls
# gethostbyname(). Careful!)
hosts:                dns ldap

# LDAP is nominally authoritative for the following maps.
services:   ldap [NOTFOUND=return] files
networks:   ldap [NOTFOUND=return] files
protocols:  ldap [NOTFOUND=return] files
rpc:        ldap [NOTFOUND=return] files
ethers:     ldap [NOTFOUND=return] files

# no support for netmasks, bootparams, publickey yet.
netmasks:   files
bootparams: files
publickey:  files
automount:  files

# I'm pretty sure nsswitch.conf is consulted directly by sendmail,
# here, so we can't do much here. Instead, use bbense's LDAP
# rules ofr sendmail.
aliases:    files
sendmailvars:   files

# Note: there is no support for netgroups on Solaris (yet)
netgroup:   ldap [NOTFOUND=return] files


O módulo ldap usualmente é inserido antes dos outros, e ele irá então ser consultado primeiro. A notável exceção é o serviço hosts já que contactar o servidor LDAP requer consultar o DNS primeiro (para resolver ldap.falcot.com). Sem essa exceção, uma consulta de hostname iria recair ao servidor LDAP; isso iria disparar uma resolução de nome ao servidor LDAP, e cairia em um loop infinito.
Se o servidor LDAP deve ser considerado autoritário (e os arquivos locais usados pelo módulo files desconsiderados), serviços podem ser configurados com a seguinte sintaxe:
serviço: ldap [NOTFOUND=return] files.
Se a entrada requisitada não existir no banco de dados LDAP, a consulta irá retornar uma resposta “não existe” mesmo que o recurso exista em um dos arquivos locais; esses arquivos locais irão apenas ser usados quando o serviço LDAP estiver parado.

11.7.3.2. Configurando o PAM

Essa seção descreve a configuração do PAM (see sidebar ATRÁS DAS CENAS /etc/environment e /etc/default/locale) que irá permitir as aplicações realizarem as autenticações necessárias no banco de dados LDAP.
O módulo LDAP para PAM é provido pelo pacote libpam-ldap. A instalação deste pacote realiza umas poucas perguntas muito parecidas "aquelas no pacote libnss-ldap; alguns parâmetros de configuração (como o URI do servidor LDAP) são inclusive compartilhados com o pacote libnss-ldap. As respostas são resumidas emTabela 11.3.

Tabela 11.3. Configuração do libpam-ldap

QuestãoResposta
Permitir a conta administrativa do LDAP se comportar como o root local?Sim. Isto permite usar o comando usual passwd para modificar as senhas armazenadas no banco de dados LDAP.
O banco de dados LDAP necessita estar logado?não
Conta LDAP para rootcn=admin,dc=falcot,dc=com
A senha da conta de root do LDAPA senha do banco de dados administrativo LDAP
Algorítimo de criptografia local para ser usado em senhascrypt
A instalação do libpam-ldap automaticamente adapta a configuração padrão do PAM definida nos arquivos /etc/pam.d/common-auth, /etc/pam.d/common-password e /etc/pam.d/common-account. Esse mecanismo usa a ferramenta dedicada pam-auth-update (fornecida pelo pacote libpam-runtime). Essa ferramenta pode também ser rodada pelo administrador caso ele queira habilitar ou desabilitar módulos PAM.

11.7.3.3. Protegendo a Troca de Dados do LDAP

Por padrão, o protocolo LDAP transita pela rede em texto puro; isso inclui as senhas (criptografadas). Como as senhas criptografadas podem ser extraídas da rede, elas pode ficar vulneráveis a ataques do tipo dicionário. Isso pode ser evitado usando um camada de criptografia extra; habilitar essa camada é o tópico desta seção.
11.7.3.3.1. Configurando o Servidor
The first step is to create a key pair (comprising a public key and a private key) for the LDAP server. The Falcot administrators reuse easy-rsa to generate it (see Seção 10.2.2, “Infraestrutura de Chaves Públicas: easy-rsa). Running ./easyrsa build-server-full ldap.falcot.com nopass will ask you about the “common name”. The answer to that question must be the fully-qualified hostname for the LDAP server; in our case, ldap.falcot.com.
This command creates a certificate in the pki/issued/ldap.falcot.com.crt file; the corresponding private key is stored in pki/private/ldap.falcot.com.key.
Agora essas chaves tem que ser instaladas em seu local padrão, e nós temos que garantir que o arquivo privado pode ser lido pelo servidor LDAP, o qual roda sob a identidade do usuário openldap:
# adduser openldap ssl-cert
Adding user `openldap' to group `ssl-cert' ...
Adding user openldap to group ssl-cert
Done.
# mv pki/private/ldap.falcot.com.key /etc/ssl/private/ldap.falcot.com.key
# chown root:ssl-cert /etc/ssl/private/ldap.falcot.com.key
# chmod 0640 /etc/ssl/private/ldap.falcot.com.key
# ./eassyrsa gen-dh

Note: using Easy-RSA configuration from: ./vars

Using SSL: openssl OpenSSL 1.1.1c  28 May 2019
Generating DH parameters, 2048 bit long safe prime, generator 2
This is going to take a long time
........................................................+..........................................................................+...............................................................................+............
[...]
DH parameters of size 2048 created at /home/roland/pki/dh.pem

# mv pki/dh.pem /etc/ssl/certs/ldap.falcot.com.pem
O daemon slapd também precisa ser informado para usar essas chaves para criptografia. A configuração do servidor LDAP é gerenciada dinamicamente: a configuração pode ser atualizada através de operações normais do LDAP no objeto hierárquico cn=config, e o servidor atualiza o /etc/ldap/slapd.d em tempo real para fazer com que a configuração seja persistente. ldapmodify é, assim, a ferramenta certa para atualizar a configuração:

Exemplo 11.24. Configurando slapd para criptografia

# cat >ssl.ldif <<END
dn: cn=config
changetype: modify
add: olcTLSCertificateFile
olcTLSCertificateFile: /etc/ssl/certs/ldap.falcot.com.pem
-
add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/ssl/private/ldap.falcot.com.key
-
END
# ldapmodify -Y EXTERNAL -H ldapi:/// -f ssl.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "cn=config"
O último passo para habilitar a criptografia envolve alterar a variável SLAPD_SERVICES no arquivo /etc/default/slapd. Nós vamos torná-lo seguro e desabilitar o LDAP inseguro de uma vez só.

Exemplo 11.25. O nome /etc/default/slapd

# Default location of the slapd.conf file or slapd.d cn=config directory. If
# empty, use the compiled-in default (/etc/ldap/slapd.d with a fallback to
# /etc/ldap/slapd.conf).
SLAPD_CONF=

# System account to run the slapd server under. If empty the server
# will run as root.
SLAPD_USER="openldap"

# System group to run the slapd server under. If empty the server will
# run in the primary group of its user.
SLAPD_GROUP="openldap"

# Path to the pid file of the slapd server. If not set the init.d script
# will try to figure it out from $SLAPD_CONF (/etc/ldap/slapd.conf by
# default)
SLAPD_PIDFILE=

# slapd normally serves ldap only on all TCP-ports 389. slapd can also
# service requests on TCP-port 636 (ldaps) and requests via unix
# sockets.
# Example usage:
# SLAPD_SERVICES="ldap://127.0.0.1:389/ ldaps:/// ldapi:///"
SLAPD_SERVICES="ldaps:/// ldapi:///"

# If SLAPD_NO_START is set, the init script will not start or restart
# slapd (but stop will still work).  Uncomment this if you are
# starting slapd via some other means or if you don't want slapd normally
# started at boot.
#SLAPD_NO_START=1

# If SLAPD_SENTINEL_FILE is set to path to a file and that file exists,
# the init script will not start or restart slapd (but stop will still
# work).  Use this for temporarily disabling startup of slapd (when doing
# maintenance, for example, or through a configuration management system)
# when you don't want to edit a configuration file.
SLAPD_SENTINEL_FILE=/etc/ldap/noslapd

# For Kerberos authentication (via SASL), slapd by default uses the system
# keytab file (/etc/krb5.keytab).  To use a different keytab file,
# uncomment this line and change the path.
#export KRB5_KTNAME=/etc/krb5.keytab

# Additional options to pass to slapd
SLAPD_OPTIONS=""

11.7.3.3.2. Configurando o Cliente
No lado do cliente, a configuração para os módulos libpam-ldap e libnss-ldap precisa ser modificada para usar a URI ldaps://.
Clientes LDAP também precisam ser capazes de autenticar o servidor. Em uma infraestrutura de chave pública X.509, certificados públicos são assinados pela chave da autoridade certificadora (CA, do inglês certificate authority). Com easy-rsa, os administradores da Falcot criaram seu próprio CA e agora eles precisam configurar o sistema para confiar nas assinaturas do CA da Falcot. Isso pode ser feito colocando o certificado CA em /usr/local/share/ca-certificates e executando update-ca-certificates.
# cp pki/ca.crt /usr/local/share/ca-certificates/falcot.crt
# update-ca-certificates
Updating certificates in /etc/ssl/certs... 1 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d....

Adding debian:falcot.pem
done.
done.
Por último, mas não menos importante, a URI padrão do LDAP e o DN base padrão usado por várias ferramentas de linha de comando podem ser modificados em /etc/ldap/ldap.conf. Isso irá evitar, consideravelmente, digitação.

Exemplo 11.26. O arquivo /etc/ldap/ldap.conf

#
# LDAP Defaults
#

# See ldap.conf(5) for details
# This file should be world readable but not world writable.

BASE   dc=falcot,dc=com
URI    ldaps://ldap.falcot.com

#SIZELIMIT      12
#TIMELIMIT      15
#DEREF          never

# TLS certificates (needed for GnuTLS)
TLS_CACERT      /etc/ssl/certs/ca-certificates.crt