03 - LDAP (389, 636)
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:
- Anônimo: sem credenciais — usado para consultas públicas.
- Simples: DN + senha em texto (deve ser usado com TLS).
- 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.