UP | HOME

LPI-2 202-450 Topico 210.4
Configurar um servidor OpenLDAP

Índice

210.4 Configurar um servidor OpenLDAP - Objetivos

Peso 4

O candidato deve ser capaz de configurar um servidor OpenLDAP básico, o que inclui conhecer o formato LDIF e controles de acesso essenciais. Também é exigido entender o papel o SSSD na autenticação e gestão de identidade.

Conhecimentos-chave:

Lista parcial dos arquivos, termos e ferramentas utilizados:

210.4 Configurar um servidor OpenLDAP - Conteúdo

LDAP

De início é importante entender o que é o LDAP. No caso LDAP não é um programa mas sim uma coleção de protocolos. O nome LDAP é uma sigla para Lightweight Directory Access Protocol ou protocolo leve de acesso a diretório. Tem suas especificações técnicas publicadas na RFC4510. O LDAP permite ao usuário acessar informações de forma centralizada (sobre uma rede). Pode ser usado de várias formas tais como autenticação, compartilhamento de diretórios, listas de endereço, etc. Como o LDAP tem múltiplos usos, ele pode armazenar vários tipos de informações.

A porta de rede padrão do LDAP é a TCP 389 em conexões não cifradas e a 636 para LDAP sobre TLS cifrado, também é comum ver o LDAP escutando portas diferentes da padrão por motivos diversos.

O LDAP segue uma estrutura de diretórios. Todas as entradas (chamadas objetos) tem uma posição definida na hierarquia. Essa hierarquia é chamada de Directory Information Tree (DIT) ou árvore de informação de diretórios em tradução nossa.

Segundo Anahuac [1] "um diretório no sistema de arquivos nada mais é do que uma divisão lógica que visa organizar os arquivos existentes no disco rígido. Pense no LDAP nos mesmos termos."

com
├── abc
└── exemplo
    ├── vendas
    └──  gerentes
         ├── dispositivos
         └── usuarios
             └── joao 

Em um sistema de arquivos o diretório principal chama-se raiz e isso deve-se a sua estrutura em forma de "árvore". O LDAP mantém essa mesma ideia, ou seja a partir da "raiz da árvore", estão suas ramificações, que permitem a organização lógica dos arquivos (Anahuac, 2015 [1]).

Assim entradas no nível mais alto da hierarquia representam grupos maiores na organização, logo o grupo mais alto é o maior de todos e é chamado de entrada root. Entradas abaixo de organizações maiores representam organizações menores que consequentemente compõem as maiores. Os nós folha (ou entradas) da estrutura em árvore representam os indivíduos ou os recursos.

Outra forma de entender a estrutura é por um gráfico de vértices, ele também segue a lógica de que os objetos mais altos na hierarquia são os maiores, seguindo a lógica de que cada vértice é composto por outros vértices.

ldap-vertice-diagram.png

Figura 1: Diagrama de Vértices representando uma árvore (invertida) LDAP

Nomenclatura

A nomenclatura define como as entradas e os dados são referenciados no DIT. Aqui também faz sentido fazer uma analogia com uma estrutura de diretórios em um disco.

Por exemplo se precisarmos referenciar em um script o caminho para o arquivo lpi.txt dentro do diretório Documentos na home do usuário João o faríamos dessa forma: /home/joao/Documentos/lpi.txt

Em um diretório LDAP o equivalente a "caminho" é chamado de Distinguished Name (DN) ou "Nome Distinto" em tradução nossa. A lógica para expressar um DN é a mesma do que usaríamos para expressar um "caminho" em uma árvore de diretórios, porém com duas diferenças:

  1. No DN o nível mais alto da "árvore" é expresso mais à direita, e vamos citando os agrupamentos até chegar ao objeto final à esquerda;
  2. Não é usada a / mas sim uma , e também devemos definir o atributo do elemento citado.
com ➔ dc=com
├── abc 
└── exemplo ➔ dc=exemplo
    ├── vendas
    └──  gerentes ➔ ou=gerentes
         ├── dispositivos
         └── usuarios ➔ ou=usuarios
             ├── joao  ➔ cn=joao
             └── maria ➔ cn=maria

Logo o Distinguished Name para joao é:
dn:cn=joao,ou=usuarios,ou=gerentes,dc=exemplo,dc=com

Os DN são identificadores exclusivos que identificam uma entrada na hierarquia. No exemplo acima, joao e maria são cn diferentes que identificam entradas diferentes dentro de um mesmo nível (ou=usuarios).

Podemos resumir que um Distinguished Name é um "Caminho Completamente Qualificado" que traça uma entrada até a raiz da árvore de diretório.

Também é importante citar o Relative Distinguished Name (RDN) ou "Nome Distinto Relativo" em tradução nossa. Que nada mais é do que um componente do Distinguished Name.

Por exemplo cn=joao,ou=usuarios é um RDN relativo ao root dc=exemplo,dc=com.

Definições importantes:

  • DNs descrevem um caminho completamente qualificado até a raiz do domínio.
  • RDNs descrevem um caminho parcial da entrada em relação à outra entrada na árvore, em outras palavras um DN é constituído por RDNs.
Entrada

A unidade básica de informação armazenada num Diretório é denominada por "entrada", elas são compostas por um conjunto de atributos referentes a um objeto, e como já mostrado anteriormente são organizadas na estrutura de árvore invertida (DIT).

# Entrada root dn
dn: dc=infralinux,dc=com,dc=br
objectClass: dcObject
objectClass: organization
o: Infralinux
dc=infralinux

# Administrador do Diretório
dn: cn=admin,dc=infralinux,dc=com,dc=br
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
userPassword: topsecret
description: Administrador LDAP
ObjectClass

Consiste num conjunto de atributos referentes a uma entrada. Quando uma entrada é definida, são atribuídas um ou mais object classes. Esses object classes possuem atributos que podem ser opcionais ou obrigatórios. Existem dois tipos de object classes: structural e auxiliary. Toda a entrada deve ter um object class do tipo structural e pode ter uma ou mais object classes do tipo auxiliary.

objectclass ( 2.5.6.6 NAME ’person’
DESC ’RFC2256: a person’
SUP top STRUCTURAL
MUST ( sn $ cn )
MAY ( userPassword $ telephoneNumber $ seeAlso $ description ) )

Como mostrado no exemplo, é obrigatório o uso de um SN (surname) ou um CN (commonName) e os atributos opcionais são: userPassword; telephoneNumber; seeAlso; e description.

Atributos

Um diretório LDAP possui entradas que contêm informações pertencentes a entidades. Cada atributo possui um nome e um ou mais valores. Os nomes dos atributos são strings mnemônicas, como cn para common name ou mail para endereço de e-mail. (Documentação Oracle [2])

Por exemplo podemos pegar a árvore de LDAP apresentada na listagem 2, cada entrada dentro de usuarios representa um usuário distinto. Já a entrada usuário pode conter informações como nome, endereço de e-mail e número de telefone.

Tabela 1: Exemplo de atributos dos usuários
Atributo Conteúdo
cn joao
mail joao@exemplo.com
mail joao@mail.com
telephoneNumber 4899322332

Cada parte das informações descritivas, como o nome de um usuário, é conhecida como um atributo. No exemplo da tabela 1, o atributo commonName (cn) representa o nome do funcionário. Os outros atributos contidos nele são mail e telephoneNumber.

Cada atributo pode ter um ou mais valores. No exemplo uma entrada usuário contém dois atributos de e-mail.

Lista de atributos comuns

Lista obtida na RFC4519 pg. 4:

c
O Atributo c (contryName no protocolo X.500) contém duas letras para representar um país no padrão ISO3166;
cn
(commonName no protocolo X.500) contem o nome de um objeto. E como tal, pode conter outros atributos como e-mail, números de telefone e assim por diante. Se o objeto corresponder a uma pessoa, normalmente é o nome completo da pessoa;
sn
(surname no protocolo X.500) este atributo contem uma string que armazena o sobrenome de um usuário. Também trata-se de um objeto portanto pode conter outros atributos.
dc

(domainComponent no protocolo X.500) este atributo é uma string que funciona como um rótulo de um nome de domínio DNS ou de um host. Logo suporta uma string composta por caracteres ASCII aderindo ao padrão ABNF RFC4234:

  • ALPHA: "A"-"Z"/"a"-"z"
  • Dígitos: "0"-"9"
  • Hífen: "-"

Logo o . não é aceito. Portanto para o domínio exemplo.com que apresentamos acima o correto é declarar cada componente dentro de um dn assim: dc=exemplo,dc=com.

o
(organizationName no protocolo X.500) este atributo contem o nome de uma organização. Trata-se de um objeto, portanto pode conter outros atributos.
ou
(organizationalUnitName no protocolo X.500) este atributo contém nomes para as unidades organizacionais. Tal como o cn trata-se de um objeto. Portanto pode conter outros atributos.
uid
(userid na RFC1274) este atributo contém a identificação única de um usuário em um sistema. Também trata-se de um objeto. Portanto pode conter outros atributos. Este atributo pode ser utilizado em substituição ao atributo cn. Porém hoje o cn é o padrão de fato.
description
este atributo contem uma descrição de um objeto.
userPassword
este atributo contém strings que são conhecidas apenas pelo usuário e pelo sistema ao qual o usuário tem acesso.
Schema

Os schemas no LDAP permitem manter a consistência dos dados no Diretório. Uma importante característica é serem extensíveis e assim podemos adicionar mais atributos ou classes dependendo das necessidades. Para usar um schema é necessário incluí-lo no arquivo de configuração O arquivo slapd.conf. Os schemas definem:

  • quais as object classes podem ser inseridas num Diretório;
  • quais os atributos de uma determinada object class;
  • os valores possíveis para os atributos.

Obs.: Se um objeto (entrada), não obedecer às regras do schema, este não pode ser inserido no diretório. Portanto cada entrada estará condicionada a uma hierarquia de armazenamento dos dados na base LDAP.

Na instalação padrão do OpenLDAP é disponibilizada uma coleção de schemas padrão, assunto abordado em /etc/openldap/schema/.

OpenLDAP

O OpenLDAP é uma implementação open source do LDAP desenvolvida pelo projeto OpenLDAP. É distribuído sob uma licença BSD-style chamada de OpenLDAP Public License. Ele provê um serviço de diretório distribuído armazenando informações associadas a usuários que podem ser usadas para autenticá-los e armazenar informações diversas sobre eles.

Logo o OpenLDAP pode ser comparado ao serviço Active Directory do Windows como um serviço que fornece informações de usuários em uma base hierárquica.

Histórico

No início da década de 80 a International Organization Standardization (ISO) e o Consultative Committee for International Telegraphy and Telephony (CCITT) se juntaram para criar um serviço de mensagens (a série X.400). Chegaram a conclusão que precisavam desenvolver um protocolo que organizasse entradas de dados num serviço de nomes de forma hierárquica, capaz de suportar grandes quantidades de informação e com uma enorme capacidade de procura dessas informações. Esse serviço criado por essas duas instituições foi apresentado em 1988 e foi denominado X.500, juntamente com um conjunto de recomendações e das normas ISO 9594.

o X.500 especificava que a comunicação entre o cliente e o servidor do Diretório usava o Directory Access Protocol (DAP). Porém ao aplicá-lo na prática concluiu-se que ele era muito complexo e de custo operacional incompatível.

Isso levou aos pesquisadores da Universidade de Michigan a criar o Lightweight Directory Access Protocol (LDAP), além do protocolo foi criado o Daemon Standalone LDAP o slapd. Em 1993 o LDAP foi apresentado como uma alternativa ao protocolo DAP para acesso a Diretórios baseados no modelo X.500, sendo pela primeira vez implementado na própria universidade.

Esse mesmo grupo de pesquisadores disponibilizou os fontes do slapd na Internet e criou listas de discussão para divulgar e aperfeiçoar o novo serviço, sendo a sua evolução acompanhada por pessoas do mundo inteiro. Segundo Ricardo Pinheiro [3] "Com a divulgação do slapd, o LDAP deixou de ser uma mera alternativa ao DAP do X.500 e ganhou estatuto de Serviço de Diretório completo, passando a competir diretamente com o X.500".

Em Dezembro de 1997, o IETF lançou a versão 3 do LDAP como proposta padrão Internet para Serviços de Diretório.

O projeto OpenLDAP foi inciado em 1998 por Kurt Zeilenga clonando os fontes da referência LDAP utilizada na Universidade de Michigan, onde um projeto de longa duração apoiou o desenvolvimento e a evolução do protocolo LDAP até o lançamento final desse projeto em 1996.

A evolução do OpenLDAP prossegue, acompanhando a evolução dos padrões IETF.

Componentes

O OpenLDAP tem 3 componentes principais:

  • slapd: é um daemon stand-alone com módulos associados e algumas ferramentas;
  • bibliotecas de implementação do protocolo LDAP e bibliotecas de representação de dados estruturados ASN.1 usadas pelo X.500;
  • softwares clientes como o ldapsearch, ldapadd, ldapdelete e outras.

Instalação

Aqui demonstraremos instalação do OpenLDAP será demonstrada em sistemas RedHat-like. No caso instalaremos os pacotes necessários para o servidor e os utilitários clients. Para tanto utilizaremos os seguintes pacotes:

  • openldap: Pacote com as bibliotecas;
  • openldap-clients: pacote com os software clients;
  • openldap-servers; servidor OpenLDAP.

yum install openldap openldap-servers openldap-clients

Para execução desse laboratório iremos desabilitar o SELinux, pois ajustes de SELinux não fazem escopo desse tópico do Exame LPI-2. Em produção o SELinux nunca deve ser desativado, o correto é analisar os alertas e executar os devidos ajustes.

Desabilitando o SELinux "a quente":

setenforce permissive

Para desabilitar o SELinux em definitivo deve-se editar o arquivo /etc/selinux/config mudando a diretiva SELINUX para permissive:

SELINUX=permissive

Após esses ajustes podemos iniciar o serviço slapd:

systemctl start slapd

Obs.: Em servidores antigos como o RedHat5 o nome do serviço é ldap dessa forma para iniciar o servidor deve-se utilizar o comando:

service ldap start

Após o serviço iniciado pode-se constatar seu funcionamento verificando se ele está ouvindo a porta TCP 389 com o comando netstat.

# netstat -tulpen | grep -i 389
tcp   0   0   0.0.0.0:389   0.0.0.0:*   OUÇA   0   56306   11922/slapd         
tcp   0   0        :::389        :::*   OUÇA   0   56305   11922/slapd

Em servidores Debian-like a instalação é mais simples:

apt install slapd ldap-utils

No caso dos servidores Debian-like a base inicial será criada pelo instalador. Assim durante esse processo será solicitada uma senha para o usuário "admin":

debian-ldap-passwd.png

Figura 2: Instalação OpenLDAP no Debian

Configuração do OpenLDAP

Outra diferença notável entre as distribuições é que nas distribuições Debian-like os arquivos de configuração ficam em /etc/ldap já nas distribuições RedHat-like ficam em /etc/openldap.

┌─[root@centos7lpi]──[15:21]──[/etc/openldap]
└─[70]─># ll
total 12
drwxr-xr-x. 2 root root   90 Nov 15 14:18 certs
-rw-r--r--. 1 root root  121 Ago 31 11:49 check_password.conf
-rw-r--r--. 1 root root  363 Ago 31 11:49 ldap.conf
drwxr-xr-x. 2 root root 4096 Nov 15 14:18 schema
drwxr-x---. 3 ldap ldap   45 Nov 15 14:18 slapd.d
O arquivo slapd.conf

É o principal arquivo de configuração do serviço principal do OpenLDAP o slapd, nesse arquivo constam todas as informações necessárias para o funcionamento do serviço.

Porém como mostra a Listagem 6 ele não se encontra no diretório de configurações do slapd.

Se for procurá-lo no servidor ele não será encontrado.

A explicação é que historicamente o serviço slapd é configurado estaticamente. Em outras palavras para executar alguma alteração na configuração do serviço era necessário parar o serviço e então reiniciá-lo para que as mudanças fizessem efeito. Essa característica era indesejável em aplicações onde houvessem muitos usuários e essa operação de stop/start poderia representar um obstáculo para a administração do serviço.

Mudanças substanciais foram aplicadas ao slapd com a versão 2.4. Dentre elas a mais significativa foi a implementação do modo Run-Time Configuration (RTC) ou "Configuração em tempo de execução" (em tradução nossa), esse modo mantém as configurações do serviço slapd dentro da própria base do OpenLDAP, assim não precisando mais do arquivo slapd.conf e permitindo que ajustes no serviço possam ser executados sem a necessidade de parada do mesmo.

Nesse formato todos os ajustes no serviço slapd são feitos no servidor escrevendo arquivos .ldif e inserindo-os "a quente" no serviço.

O modo RTC também é conhecido como cn=Config e também como On-Line Configuration (OLC).

Em servidores modernos como o CentOS7 exemplificado na Listagem 6 o formato RTC é o padrão, por isso o arquivo slapd.cof não foi encontrado.

Porém o objetivo do exame LPIC2 é sobre a versão antiga do OpenLDAP (Versão 2.3) logo preparei uma instalação com um CentOS5 para continuar os estudos:

┌─[root@centos5]──[18:14]──[/etc/openldap]
└─[84]─># slapd -V
@(#) $OpenLDAP: slapd 2.3.43 (Jul 12 2012 04:02:14) $
        mockbuild@builder10.centos.org:/builddir/build/BUILD/openldap-2.3.43/openldap-2.3.43/build-servers/servers/slapd

┌─[root@centos5]──[18:14]──[/etc/openldap]
└─[85]─># ls -l
total 40
drwxr-xr-x 2 root root 4096 Jul 12  2012 cacerts
-rw-r----- 1 root ldap  921 Jul 12  2012 DB_CONFIG.example
-rw-r--r-- 1 root root  327 Nov 15 11:43 ldap.conf
drwxr-xr-x 3 root root 4096 Nov 15 15:48 schema
-rw-r----- 1 root ldap 3801 Jul 12  2012 slapd.conf
┌─[root@centos5]──[18:14]──[/etc/openldap]
└─[86]─># cat slapd.conf
#
# See slapd.conf(5) for details on configuration options.
# This file should NOT be world readable.
#
include         /etc/openldap/schema/core.schema
include         /etc/openldap/schema/cosine.schema
include         /etc/openldap/schema/inetorgperson.schema
include         /etc/openldap/schema/nis.schema

# Allow LDAPv2 client connections.  This is NOT the default.
allow bind_v2

# Do not enable referrals until AFTER you have a working directory
# service AND an understanding of referrals.
#referral       ldap://root.openldap.org

pidfile         /var/run/openldap/slapd.pid
argsfile        /var/run/openldap/slapd.args

# Load dynamic backend modules:
# modulepath    /usr/lib64/openldap

# Modules available in openldap-servers-overlays RPM package
# Module syncprov.la is now statically linked with slapd and there
# is no need to load it here
# moduleload accesslog.la
# moduleload auditlog.la
# moduleload denyop.la
# moduleload dyngroup.la
# moduleload dynlist.la
# moduleload lastmod.la
# moduleload pcache.la
# moduleload ppolicy.la
# moduleload refint.la
# moduleload retcode.la
# moduleload rwm.la
# moduleload smbk5pwd.la
# moduleload translucent.la
# moduleload unique.la
# moduleload valsort.la

# modules available in openldap-servers-sql RPM package:
# moduleload back_sql.la

# The next three lines allow use of TLS for encrypting connections using a
# dummy test certificate which you can generate by changing to
# /etc/pki/tls/certs, running "make slapd.pem", and fixing permissions on
# slapd.pem so that the ldap user or group can read it.  Your client software
# may balk at self-signed certificates, however.
# TLSCACertificateFile /etc/pki/tls/certs/ca-bundle.crt
# TLSCertificateFile /etc/pki/tls/certs/slapd.pem
# TLSCertificateKeyFile /etc/pki/tls/certs/slapd.pem

# Sample security restrictions
#       Require integrity protection (prevent hijacking)
#       Require 112-bit (3DES or better) encryption for updates
#       Require 63-bit encryption for simple bind
# security ssf=1 update_ssf=112 simple_bind=64

# Sample access control policy:
#       Root DSE: allow anyone to read it
#       Subschema (sub)entry DSE: allow anyone to read it
#       Other DSEs:
#               Allow self write access
#               Allow authenticated users read access
#               Allow anonymous users to authenticate
#       Directives needed to implement policy:
# access to dn.base="" by * read
# access to dn.base="cn=Subschema" by * read
# access to *
#       by self write
#       by users read
#       by anonymous auth
#
# if no access controls are present, the default policy
# allows anyone and everyone to read anything but restricts
# updates to rootdn.  (e.g., "access to * by * read")
#
# rootdn can always read and write EVERYTHING!

#######################################################################
# ldbm and/or bdb database definitions
#######################################################################

database        bdb
suffix          "dc=my-domain,dc=com"
rootdn          "cn=Manager,dc=my-domain,dc=com"
# Cleartext passwords, especially for the rootdn, should
# be avoided.  See slappasswd(8) and slapd.conf(5) for details.
# Use of strong authentication encouraged.
# rootpw                secret
# rootpw                {crypt}ijFYNcSNctBYg

# The database directory MUST exist prior to running slapd AND 
# should only be accessible by the slapd and slap tools.
# Mode 700 recommended.
directory       /var/lib/ldap

# Indices to maintain for this database
index objectClass                       eq,pres
index ou,cn,mail,surname,givenname      eq,pres,sub
index uidNumber,gidNumber,loginShell    eq,pres
index uid,memberUid                     eq,pres,sub
index nisMapName,nisMapEntry            eq,pres,sub

# Replicas of this database
#replogfile /var/lib/ldap/openldap-master-replog
#replica host=ldap-1.example.com:389 starttls=critical
#     bindmethod=sasl saslmech=GSSAPI
#     authcId=host/ldap-master.example.com@EXAMPLE.COM

O arquivo slapd.conf é tratado com detalhes em Configuração do OpenLDAP v2.3.

ldap.conf

Usado para configurar padrões a serem aplicados quando rodamos aplicações client tal como o ldapsearch e lsapadd

#
# LDAP Defaults
#

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

#BASE   dc=example,dc=com
#URI    ldap://ldap.example.com ldap://ldap-master.example.com:666

#SIZELIMIT      12
#TIMELIMIT      15
#DEREF          never

TLS_CACERTDIR   /etc/openldap/certs

# Turning this off breaks GSSAPI used with krb5 when rdns = false
SASL_NOCANON    on

Onde:

  • SIZELIMIT <interger>: Define o número de entradas ao executar uma pesquisa;
  • TIMELIMIT <interger>: Define o limite de tempo (timeout) ao executar uma pesquisa.

O arquivo ldap.conf é um arquivo legível e além das diretivas acima não contém nada mais interessante a ajustar, também não faz parte dos objetivos do exame, constando aqui apenas para conhecimento contextual.

/etc/openldap/schema/

Este diretório contém uma coleçao de schemas defaults que descrevem várias object classes padrões do OpenLDAP. Cada conjunto de object classes é definido em um arquivo (ou seja um core.schema) adequado para inclusão usando a diretiva de inclusões nos ajustes globais do O arquivo slapd.conf. É interessante navegar pelo conteúdo desses arquivos para determinar os atributos necessários e disponíveis para uma object class específica.

┌─[root@centos7lpi]──[18:24]──[/etc/openldap/schema]
└─[75]─># ls
collective.ldif    cosine.schema         java.ldif      openldap.schema
collective.schema  duaconf.ldif          java.schema    pmi.ldif
corba.ldif         duaconf.schema        misc.ldif      pmi.schema
corba.schema       dyngroup.ldif         misc.schema    ppolicy.ldif
core.ldif          dyngroup.schema       nis.ldif       ppolicy.schema
core.schema        inetorgperson.ldif    nis.schema
cosine.ldif        inetorgperson.schema  openldap.ldif
Configuração do OpenLDAP v2.4

Toda configuração do OpenLDAP v2.4 encontra-se no diretório /etc/openldap/slapd.d/.

┌─[root@centos7lpi]──[18:40]──[/etc/openldap/slapd.d]
└─[79]─># ls -l 
total 4
drwxr-x---. 3 ldap ldap 182 Nov 15 14:18 cn=config
-rw-------. 1 ldap ldap 589 Nov 15 14:18 cn=config.ldif
┌─[root@centos7lpi]──[18:40]──[/etc/openldap/slapd.d]
└─[80]─># tree
.
├── cn=config
│   ├── cn=schema
│   │   └── cn={0}core.ldif
│   ├── cn=schema.ldif
│   ├── olcDatabase={0}config.ldif
│   ├── olcDatabase={-1}frontend.ldif
│   ├── olcDatabase={1}monitor.ldif
│   └── olcDatabase={2}hdb.ldif
└── cn=config.ldif

2 directories, 7 files

Obs.: Nunca editar os arquivos LDIF do OpenLDAP diretamente, faça as edições usando os clientes do OpenLDAP sendo ldapadd, ldapdelete, ou ldapmodify

Comando slapcat

O comando slapcat é usado para gerar uma saída LDIF baseada em um contexto do banco de dados do slapd. Ele abre um banco de dados determinado pelo número ou sufixo do banco de dados e grava o LDIF correspondente na saída padrão ou no arquivo especificado.

Por padrão, o slapcat na versão 2.3 (e versões anteriores) quando invocado sem argumentos mostra o banco de dados padrão.

┌─[root@centos5]──[18:24]──[/etc/openldap]
└─[93]─># slapcat
bdb_db_open: Warning - No DB_CONFIG file found in directory /var/lib/ldap: (2)
Expect poor performance for suffix dc=my-domain,dc=com.

Mas na versão 2.4.x (e acima) ele não mostra nada:

┌─[root@centos7lpi]──[18:50]──[/etc/openldap/slapd.d]
└─[83]─># slapcat
6192d674 The first database does not allow slapcat; using the first available one (2)
6192d674 hdb_db_open: warning - no DB_CONFIG file found in directory /var/lib/ldap: (2).
Expect poor performance for suffix "dc=my-domain,dc=com".

Logo utilizando o parâmetro -b temos que definir onde o banco de dados de configuração é posicionando dentro do banco de dados slapd logo ele mostra-rá as configurações padrão:

┌─[root@centos7lpi]──[18:51]──[/etc/openldap/slapd.d]
└─[84]─># slapcat -b cn=config
dn: cn=config
objectClass: olcGlobal
cn: config
olcArgsFile: /var/run/openldap/slapd.args
olcPidFile: /var/run/openldap/slapd.pid
olcTLSCACertificatePath: /etc/openldap/certs
olcTLSCertificateFile: "OpenLDAP Server"
olcTLSCertificateKeyFile: /etc/openldap/certs/password
structuralObjectClass: olcGlobal
entryUUID: d1798cde-da83-103b-9574-7fea854dbc21
...
..
.

O parâmetro -b é o sufixo onde colocamos o parâmetro de busca, no exemplo cn=config.

A saída que conseguimos na Listagem 13 mostra as configurações padrão geradas na instalação do pacote, a configuração do servidor OpenLDAP consiste em executar as edições necessárias para montarmos nosso próprio servidor LDAP.

Logo para iniciar a configuração de nosso servidor precisamos editar as variáveis olcSuffix e olcRootDN. Segue lista com as variáveis importantes:

  • olcSuffix: Sufixo do banco de dados, é o nome do nosso domínio para o qual o servidor LDAP proverá informações. Deverá ser editado para o seu nome de domínio;
  • olcRootDN: Root Distinguished Name (DN) essa entrada é para identificar o usuário de acessos irrestritos responsável pela administração do serviço LDAP, tal como um usuário root do Linux mesmo;
  • olcRootPW: a senha do usuário admin RootDN

Em teoria as variáveis acima deveriam ser editadas no arquivo /etc/openldap/slapd.d/cn=config/olcDatabase={2}hdb.ldif. Porém a edição manual dos arquivos não é válida, pois as alterações serão sobrescritas toda vez que o comando ldapmodify é executado.

Comando slappasswd

O comando slappasswd é o utilitário responsável por gerar hashs para senhas que possam ser usadas em conjunto com o comando ldapmodify, com o arquivo slapd.conf (diretiva rootpw) e com a variável olcRootPW no caso de servidores RTC.

┌─[root@centos7lpi]──[18:54]──[/etc/openldap/slapd.d]
└─[85]─># slappasswd 
New password: 
Re-enter new password: 
{SSHA}7GC8j4EggQuGuXed1nXGa6zskViaCSjH
Arquivos LDIF

Para adicionar ou editar alguma informação em um diretório LDAP primeiramente precisamos criar um arquivo LDIF, nele deverá conter as definições para todos os atributos requeridos para as entradas que precisarão ser editadas ou criadas.

Agora seguindo nosso objetivo de configura um servidor OpenLDAP v2.4 poderíamos criar um arquivo LDIF com o seguinte conteúdo:

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=infralinux,dc=com

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=ldapadm,dc=infralinux,dc=com

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootPW
olcRootPW: {SSHA}7GC8j4EggQuGuXed1nXGa6zskViaCSjH

Agora devemos imputar esse arquivo em nosso servidor OpenLDAP.

Comando ldapmodify

O comando ldapmodify abre uma conexão com um servidor LDAP, vincula, modifica ou adiciona entradas. As informações de entrada são lidas da entrada padrão ou de um arquivo através da opção -f.

Considerando que o conteúdo que apresentamos na listagem 15 está no arquivo inicio.ldif a inserção do arquivo seria:

┌─[root@centos7lpi]──[19:40]──[~]
└─[88]─># ldapmodify -Y EXTERNAL -H ldapi:/// -f inicio.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={2}hdb,cn=config"

modifying entry "olcDatabase={2}hdb,cn=config"

modifying entry "olcDatabase={2}hdb,cn=config"

Antes de inserir os dados do LDIF na base LDAP o comando ldapmodify verifica o arquivo LDIF procurando erros de sintaxe.

Após inserir o LDIF com sucesso rode novamente o comando slapcat para ver a diferença.

Note que antes da execução tínhamos os seguintes valores:

olcSuffix: dc=my-domain,dc=com

olcRootDN: cn=Manager,dc=my-domain,dc=com

Agora temos os seguintes valores tais como estavam em nosso LDIF:

olcSuffix: dc=infralinux,dc=com

olcRootDN: cn=ldapadm,dc=infralinux,dc=com

olcRootPW:: e1NTSEF9N0dDOGo0RWdnUXVHdVhlZDFuWEdhNnpza1ZpYUNTakg=

Comando slaptest

O comando slaptest checa a conformidade do arquivo de configuração slapd.conf. Por mais que não exista esse arquivo no OpenLDAP v2.4 ele ainda funciona. Usamos a opção -u para habilitar o modo de simulação (ou seja não falha se os bancos de dados não puderem ser abertos, mas verifica a configuração) e -v para aumentar o nível de detalhe.

┌─[root@centos7lpi]──[19:48]──[~]
└─[90]─># slaptest -u -v
config file testing succeeded

Configuração do OpenLDAP v2.3

A configuração inicial do OpenLDAP v2.3 é bastante simples. Precisamos apenas editar as diretivas constantes em slapd.conf (um exemplo do slapd.conf pode ser visto na listagem 7).

Diretivas a editar:

  • database: O tipo de banco de dados usado no back-end do OpenLDAP, por padrão ele usa o Berkley DB;
  • suffix: o nome do domínio que será administrado pelo OpenLDAP;
  • rootdn: é o Distinguished Name (DN) para o usuário com permissionamento irrestrito utilizado em operações administrativas;
  • rootpw: a senha atribuída ao usuário rootdn;
  • directory: Indica o diretório (no sistema de arquivos) onde o banco de dados será armazenado, não há necessidade de mudar essa diretiva.

No meu arquivo de exemplo editei os seguintes campos:

database        bdb
suffix          "dc=infralinux,dc=net"
rootdn          "cn=ldap2admin,dc=infralinux,dc=net"
rootpw          {SSHA}7GC8j4EggQuGuXed1nXGa6zskViaCSjH

Depois de editado teste a configuração com o comando:

slaptest -u -v -f slapd.conf

Se o comando executar e apresentar uma resposta de teste bem sucedido agora basta parar o serviço ldap (sim no CentOS5 o serviço slapd se chama ldap) e depois iniciá-lo novamente.

O diretório /var/lib/ldap

Os arquivos do banco de dados do LDAP ficam em /var/lib/ldap. Nenhum dos arquivos que constam nesse diretório podem ser editados manualmente. Tal como já exposto em Configuração do OpenLDAP v2.3 esta localização pode ser alterada (ainda que não seja recomendável) editando a diretiva directory no arquivo slapd.conf.

┌─[root@centos7lpi]──[20:00]──[~]
└─[91]─># ls -la /var/lib/ldap/
total 348
drwx------.  2 ldap ldap      126 Nov 15 20:00 .
drwxr-xr-x. 26 root root     4096 Nov 15 14:18 ..
-rw-r--r--.  1 ldap ldap     4096 Nov 15 18:51 alock
-rw-------.  1 ldap ldap   286720 Nov 15 18:51 __db.001
-rw-------.  1 ldap ldap    32768 Nov 15 18:51 __db.002
-rw-------.  1 ldap ldap    49152 Nov 15 18:51 __db.003
-rw-------.  1 ldap ldap     8192 Nov 15 15:02 dn2id.bdb
-rw-------.  1 ldap ldap    32768 Nov 15 15:02 id2entry.bdb
-rw-------.  1 ldap ldap 10485760 Nov 15 15:21 log.0000000001

Obs.: o serviço slapd roda com o usuário ldap. Portanto se você tentar executar o comando slapd ou carregar o LDIF padrão com o usuário root do Linux ele criará os arquivos com permissionamento incorreto. Logo execute o comando chonw -R ldap:ldap /var/lib/ldap para corrigir as permissões antes de iniciar o serviço.

Assim como na seção Configuração do OpenLDAP v2.3 nós havíamos iniciado o serviço com o usuário root do Linux em nosso servidor de testes CentOS5 os diretórios foram criados com permissionamento errado, consequentemente o serviço não subiu:

┌─[root@centos5]──[21:35]──[/var/lib/ldap]
└─[105]─># service ldap status
slapd está parado
┌─[root@centos5]──[21:42]──[/var/lib/ldap]
└─[106]─># ls -la
total 972
drwx------  2 ldap ldap     4096 Nov 15 16:06 .
drwxr-xr-x 26 root root     4096 Nov 15 18:15 ..
-rw-r--r--  1 root root     4096 Nov 15 21:29 alock
-rw-------  1 root root    24576 Nov 15 21:29 __db.001
-rw-------  1 root root   368640 Nov 15 21:29 __db.002
-rw-------  1 root root   270336 Nov 15 21:29 __db.003
-rw-------  1 root root    98304 Nov 15 21:29 __db.004
-rw-------  1 root root   557056 Nov 15 21:29 __db.005
-rw-------  1 root root    24576 Nov 15 21:29 __db.006
-rw-------  1 root root     8192 Nov 15 16:06 dn2id.bdb
-rw-------  1 root root    32768 Nov 15 16:06 id2entry.bdb
-rw-------  1 root root 10485760 Nov 15 21:29 log.0000000001
-rw-r--r--  1 root root       37 Nov 15 15:48 openldap-severs-update.log

Logo ao executar o comando:

chonw -R ldap:ldap /var/lib/ldap

O serviço subiu corretamente.

O comando slapindex

Este comando reindexa as entradas em um banco de dados slapd. Ele faz uso extensivo de indexação e cache para aumentar a velocidade de acesso aos dados.

Importante: Assim como todos os comandos iniciados com o prefixo slap ele só poderá ser executado com o slapd parado.

Infelizmente não há documentação útil sobre ele no OpenLDAP v2.4 ele continua mostrando informações das versões anteriores e ainda precisa do arquivo slapd.conf. Assim os exemplos a seguir serão no CentOS5:

┌─[root@centos5]──[21:55]──[/var/lib/ldap]
└─[111]─># service ldap stop
Parando o slapd:                                           [  OK  ]
┌─[root@centos5]──[21:56]──[/var/lib/ldap]
└─[112]─># slapindex -f /etc/openldap/slapd.conf -b "dc=infralinux,dc=net"
bdb_db_open: Warning - No DB_CONFIG file found in directory /var/lib/ldap: (2)
Expect poor performance for suffix dc=infralinux,dc=net.

Na saída acima o comando apresentou um Warning dizendo que não encontrou o arquivo DB_CONFIG. Logo devemos copiar o arquivo de exemplo para o diretório base, ajustarmos o permissionamento e executarmos novamente o slapindex.

┌─[root@centos5]──[21:56]──[/var/lib/ldap]
└─[113]─># updatedb
┌─[root@centos5]──[22:00]──[/var/lib/ldap]
└─[114]─># locate DB_CONFIG
/etc/openldap/DB_CONFIG.example
┌─[root@centos5]──[22:00]──[/var/lib/ldap]
└─[115]─># cp /etc/openldap/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
┌─[root@centos5]──[22:01]──[/var/lib/ldap]
└─[116]─># chown -R ldap:ldap /var/lib/ldap
┌─[root@centos5]──[22:01]──[/var/lib/ldap]
└─[117]─># slapindex -f /etc/openldap/slapd.conf -b "dc=infralinux,dc=net"
bdb_db_open: DB_CONFIG for suffix dc=infralinux,dc=net has changed.
Performing database recovery to activate new settings.

loglevel

Embora não esteja incluído por padrão no arquivo de configuração, o log pode ser configurado usando a diretiva loglevel. Esta diretiva especifica o nível em que as intruções de depuração e as estatísticas de operação devem ser registradas. Os níveis de log podem ser especificados como inteiros ou por palavra-chave. Entretanto é mais comum o uso de inteiros para especificar o nível de log.

Tabela 2: Níveis de log do OpenLDAP
Nível Palavra-chave Descrição
-1 any Modo de depuração
0   Sem depuração
1 (0x1 trace) Rastrear chamadas de função
2 (0x2 packets) Depurar tratamento de pacotes
4 (0x4 args) Depuração de rastreamento pesado
8 (0x8 conns) Gerenciamento de conexões
16 (0x10 BER) Mostrar pacotes enviados e recebidos
32 (0x20 filter) Processamento com filtro de pesquisa
64 (0x40 config) Processamento de configuração
128 (0x80 ACL) Processamento de ACLs
256 (0x100 stats) Log de status de conexões/operações/resultados
512 (0x200 stats2) Log de status de entradas e saídas
1024 (0x400 shell) Mostra comunicação com backend de shells
2048 (0x800 parse) Mostra entradas de análises de debug
16384 (0x4000 sync) Mostra o consumo do processamento syncrepl
32768 (0x8000 none) Apenas mensagens registradas indiferente do nível de log

Vários níveis de logs podem ser combinados somando seus valores numéricos.

Outra configuração relacionada ao log que não é incluída por padrão é a diretiva do arquivo de log. Por padrão, as entradas de log do OpenLDAP são enviadas ao syslog. Embora isso tenha suas vantagens pode ser conveniente enviar as entradas do OpenLDAP para algum arquivo específico.

# Logging
#  - trace function calls (1)
#  - connection management (8)
#  - ACL processing (128)
#  - stats log connections/operations/results (256)
#  (1 + 8 + 128 + 256)=393
loglevel 393

logfile   /var/log/ldap.log

Importante: Quando especificamos a diretiva logfile precisamos nos certificar da existência do arquivo indicado antes de iniciar o serviço slapd, se o arquivo não existir precisamos criá-lo com o comando touch. Assim para criar o arquivo do exemplo mostrado no fragmento de configuração acima:

touch /var/log/ldap.log

slapadd

O comando slapadd adiciona entradas ao diretório LDAP aceitando entradas via arquivos .ldif ou pela entrada padrão.

O caminho inverso deste comando é o slapdelete que apaga entradas de um diretório LDAP baseado em informações da entrada padrão ou de um arquivo .ldif.

Para exemplificar usaremos o servidor de testes em CentOS 5 pois ele conta com o OpenLDAP v2.3.x. Assim precisaremos criar o seguinte arquivo .ldif.

dn: dc=exemplo,dc=com
dc: exemplo
description: Criando meu dc 
objectClass: dcObject
objectClass: organizacao
o: exemplo,organizacao.

Como se trata de um comando iniciado com o prefixo slap para rodar esse programa precisaremos parar o daemon slapd.

┌─[root@centos5]──[21:08]──[~]
└─[140]─># slapadd -l mydc.ldif 
bdb_db_open: database already in use
backend_startup_one: bi_db_open failed! (-1)
slap_startup failed
┌─[root@centos5]──[21:09]──[~]
└─[141]─># service ldap stop
Parando o slapd:                                           [  OK  ]
┌─[root@centos5]──[21:09]──[~]
└─[142]─># slapadd -l mydc.ldif
┌─[root@centos5]──[21:10]──[~]
└─[143]─># slapcat
dn: dc=exemplo,dc=com
dc: exemplo
description:: Y3JlYXRpbmcpbXkgZGMm
objectClass: dcObject
objectClass: organizacao
o: exemplo,com.
structuralObjectClass: organizacao
entryUUID: 59ef0b24-3ee8-1038-97d2-0fe81e362871
creatorsName: cn=ldapadm,dc=exemplo,dc=com
modifiersName: cn=ldapadm,dc=exemplo,dc=com
createTimestamp: 20210826083023Z
modifyTimestamp: 20211210993023Z
entryCSN: 20180828083022Z#000000#00#000000

Como o slapadd e o slapdelete acessam diretamente a base de dados do OpenLDAP não é possível executá-los através de um computador remoto.

No tópico 210-3 aprendemos como utilizar as ferramentas ldapadd e ldapdelete para configurar alterar o servidor OpenLDAP com o daemon em execução a partir de um host remoto.

Referências

Referências

[1] Anahuac de Paula Gil. OpenLDAP Ultimate. Buqui, 2015. [ bib | http ]
[2] Oracle docs. About ldap, 2010. [ bib | .html ]
[3] Ricardo Pinheiro. Introdução ao openldap, 2012. [ bib | http ]

Autor: Jeremias Alves Queiroz

Criado em: 2021-12-18 sáb 19:18

Valid XHTML 1.0 Strict