Home Comunidade Eventos YouTube Networks Desafios // produtos Academy News CTI | CVE Contato

03 - LDAP (389, 636)

video explicativo
Video explicativoEspaco reservado para o video desta anotação — adicione video: https://youtu.be/... no frontmatter da nota.

LDAP (Lightweight Directory Access Protocol)

1. Definição e Histórico

O LDAP (Lightweight Directory Access Protocol) é um protocolo padronizado para acesso a serviços de diretório. Especificado na RFC 4511 (2006), é a versão "leve" do DAP original do modelo OSI X.500, projetada para operar diretamente sobre TCP/IP. Opera em:

  • 389 (TCP) — LDAP plain text (pode usar StartTLS para upgrade criptográfico).
  • 636 (TCP) — LDAPS (LDAP over TLS nativo, portal legado mas ainda usado).

A IANA considera a porta 636 formalmente deprecada em favor de StartTLS na 389, mas a indústria continua usando ambas por compatibilidade.

2. Características de um Diretório

Um diretório LDAP é um banco de dados otimizado para leituras (proporção típica 99:1 entre leituras e escritas). É hierárquico (não relacional), organizado em árvore. Aplicações típicas: autenticação centralizada de usuários, catálogo corporativo, integração com sistemas (SSO, RADIUS, web apps), repositório de políticas, infraestrutura de chaves públicas (PKI). Por ser otimizado para leitura, não é adequado para workloads transacionais como um RDBMS.

3. Estrutura Hierárquica: DIT (Directory Information Tree)

Um diretório LDAP é organizado em uma árvore chamada DIT. Cada nó é uma entrada (entry), identificada por um DN (Distinguished Name) que descreve seu caminho completo a partir da raiz.

dc=exemplo,dc=com,dc=br              (raiz - organization)
├── ou=people                         (organizational unit)
│   ├── uid=joao                      (usuário João)
│   └── uid=maria                     (usuária Maria)
├── ou=groups
│   ├── cn=ti                         (grupo TI)
│   └── cn=admin                      (grupo Administradores)
└── ou=services                       (contas de serviço)
    └── uid=svc-mail

DN e RDN

  • DN (Distinguished Name): caminho completo e único de uma entrada. Exemplo: uid=joao,ou=people,dc=exemplo,dc=com,dc=br.
  • RDN (Relative Distinguished Name): componente local. Exemplo: uid=joao é o RDN.

O DN é único globalmente dentro da árvore — não pode haver duas entradas com o mesmo DN.

Convenções de Naming

Atributo Significado Uso
dc Domain Component Raiz baseada em domínio DNS
o Organization Alternativa à dc-based
ou Organizational Unit Subdivisões (people, groups)
cn Common Name Nome humano
uid User ID Identificador único de usuário
sn Surname Sobrenome

4. Schema: Atributos e ObjectClasses

Cada entrada LDAP tem um conjunto de atributos (key-value pairs), pertencentes a tipos definidos no schema. As entradas são classificadas por objectClasses, que definem quais atributos são obrigatórios (MUST) e opcionais (MAY). Uma entrada pode ter múltiplas objectClasses.

ObjectClasses Comuns

ObjectClass Descrição Atributos obrigatórios
top Base abstrata objectClass
person Pessoa física sn, cn
inetOrgPerson Pessoa corporativa (RFC 2798) uid, mail, sn, cn
organizationalUnit Unidade organizacional ou
posixAccount Conta POSIX (Unix) uid, uidNumber, gidNumber, homeDirectory
posixGroup Grupo POSIX cn, gidNumber, memberUid
shadowAccount Conta com política de senha uid

Exemplo de Entrada LDAP (LDIF)

dn: uid=joao,ou=people,dc=exemplo,dc=com,dc=br
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: joao
cn: João Silva
sn: Silva
mail: joao@exemplo.com.br
uidNumber: 1001
gidNumber: 1001
homeDirectory: /home/joao
loginShell: /bin/bash
userPassword: {SSHA}hashedpasswordbase64==
shadowMax: 90

5. Operações LDAP

Operação Função
Bind Autenticar (anônimo, simples com senha, ou SASL)
Search Buscar entradas por filtro LDAP
Compare Comparar valor de atributo
Add Criar nova entrada
Modify Alterar atributos
Modify DN Renomear ou mover entrada
Delete Remover entrada
Extended Operações específicas (StartTLS, Password Modify)

Bind (Autenticação)

Três modos:

  1. Anônimo: sem credenciais — usado para consultas públicas.
  2. Simples: DN + senha em texto (deve ser usado com TLS).
  3. SASL: framework genérico (Kerberos/GSSAPI, Digest-MD5, External/certificado).

Search: Filtros LDAP

A sintaxe de filtros LDAP (RFC 4515) permite buscas poderosas:

# Igualdade
(uid=joao)
# Substring
(cn=João*)
# Presença
(mail=*)
# Comparação
(uidNumber>=1000)
# Booleanos
(&(objectClass=posixAccount)(gidNumber=1001))
(|(uid=joao)(uid=maria))
(!(gidNumber=0))

Base e Scope

Toda busca tem:

  • Base DN: ponto de partida.
  • Scope: base (apenas a entrada), one (filhos diretos), sub (sub-árvore inteira).

6. Implementações

OpenLDAP (slapd)

Implementação de referência open-source. Leve, modular, configurável via slapd.conf ou cn=config (configuração dinâmica via LDAP).

389 Directory Server (Red Hat)

Implementação LDAP corporativa da Red Hat, derivada do Netscape Directory Server. Base do Red Hat Identity Management (IdM) e FreeIPA.

Microsoft Active Directory

Servidor LDAP embutido no Windows Server. Estende o schema LDAP com classes Microsoft-specific (user, computer, group), integrado com Kerberos, DNS, GPOs.

Apache Directory / OpenDJ

Implementação Java (Apache) e fork do OpenDS (OpenDJ), usados em ambientes de identidade federada.

7. Configuração e Inspeção Prática

Conexão com ldap-utils

# Busca anônima (LDAPS)
ldapsearch -x -H ldaps://ldap.exemplo.com.br \
  -b "ou=people,dc=exemplo,dc=com,dc=br" "(uid=joao)"

# Busca autenticada
ldapsearch -x -H ldap://ldap.exemplo.com.br \
  -D "uid=admin,ou=services,dc=exemplo,dc=com,dc=br" -W \
  -b "ou=people,dc=exemplo,dc=com,dc=br" \
  "(objectClass=posixAccount)" cn mail uidNumber

# Testar autenticação (Bind)
ldapwhoami -x -H ldaps://ldap.exemplo.com.br \
  -D "uid=joao,ou=people,dc=exemplo,dc=com,dc=br" -W

# Adicionar entrada via LDIF
ldapadd -x -H ldap://ldap.exemplo.com.br -D "cn=admin,..." -W -f novo-usuario.ldif

OpenLDAP: configuração básica (slapd)

# /etc/ldap/slapd.conf
include         /etc/ldap/schema/core.schema
include         /etc/ldap/schema/cosine.schema
include         /etc/ldap/schema/nis.schema
include         /etc/ldap/schema/inetorgperson.schema

database        mdb
suffix          "dc=exemplo,dc=com,dc=br"
rootdn          "cn=admin,dc=exemplo,dc=com,dc=br"
rootpw          {SSHA}hashedpassword...

# ACLs
access to attrs=userPassword
    by self write
    by anonymous auth
    by * none
access to *
    by * read

8. Segurança e Boas Práticas

TLS é Obrigatório

LDAP plain text expõe todas as consultas, incluindo senhas em binds simples. Sempre use LDAPS (porta 636) ou StartTLS (porta 389 + upgrade).

Senhas em Hashes

Nunca armazene senhas em texto puro. OpenLDAP suporta {SSHA} (default), {SHA512crypt} (recomendado), {ARGON2} (via módulo).

Replicação

Em produção, configurar réplica(s) para garantir disponibilidade. OpenLDAP suporta replicação multimaster (MirrorMode, N-Way Multi-Master). Active Directory replica entre Domain Controllers.

ACLs Granulares

Restringir atributos sensíveis:

  • userPassword — somente leitura pelo próprio usuário e admin.
  • Atributos de RH — somente HR e admin.

9. Integração com Sistemas

Linux: NSS + PAM via SSSD (recomendado)

# /etc/sssd/sssd.conf
[domain/ldap]
id_provider = ldap
auth_provider = ldap
ldap_uri = ldap://ldap.exemplo.com.br
ldap_search_base = dc=exemplo,dc=com,dc=br
ldap_tls_reqcert = demand
ldap_tls_cacert = /etc/pki/tls/cacert.pem

# /etc/nsswitch.conf
passwd: files sss
group:  files sss
shadow: files sss

Apache mod_authnz_ldap

<Location /intranet>
    AuthType Basic
    AuthName "Intranet"
    AuthBasicProvider ldap
    AuthLDAPURL "ldap://ldap.exemplo.com.br/ou=people,dc=exemplo,dc=com,dc=br?uid"
    Require ldap-group cn=ti,ou=groups,dc=exemplo,dc=com,dc=br
</Location>

10. Tabela Resumo

Conceito Valor
RFC 4511 (LDAPv3)
Porta plain 389 TCP
Porta LDAPS 636 TCP
Estrutura Árvore (DIT)
Identificação DN (Distinguished Name)
Componente local RDN (Relative DN)
Schema Definido por objectClasses
Replicação Multi-master (OpenLDAP) ou DCs (AD)

11. Conclusão

O LDAP é o protocolo de diretório mais difundido em ambientes corporativos, base da maioria das soluções de identidade (Active Directory, FreeIPA, OpenLDAP puro). Sua estrutura hierárquica, otimizada para leitura, é ideal para armazenar dados relativamente estáticos como usuários, grupos e atributos corporativos. Para engenheiros de redes e sistemas, dominar a sintaxe de filtros LDAP, entender DNs e RDNs, configurar ACLs granulares e habilitar TLS são habilidades essenciais. A transição da indústria para SSO (SAML, OIDC) e IAM modernos não substitui o LDAP — este continua como backend de identidade para integração com sistemas legados, servidores Linux, aplicações on-premise e equipamentos de rede que requerem autenticação centralizada.