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:
- OpenLDAP;
- Controle de acesso;
- Distinguished Names;
- Operações Changetype;
- Schemas e Whitepages;
- Diretórios;
- Object IDs, Attributes e Classes.
Lista parcial dos arquivos, termos e ferramentas utilizados:
slapd
;slapd.conf
;- LDIF;
slapadd
;slapcat
;slapindex
;/var/lib/ldap/*
;- loglevel.
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.
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:
- No DN o nível mais alto da "árvore" é expresso mais à direita, e vamos citando os agrupamentos até chegar ao objeto final à esquerda;
- 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
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.
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ínioexemplo.com
que apresentamos acima o correto é declarar cada componente dentro de umdn
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 ocn
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 atributocn
. Porém hoje ocn
é 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":
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 adminRootDN
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áriorootdn
;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.
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.