Configurar sincronização unidirecional OpenLDAP com Active Directory e TLS no Debian (sssd/samba-tool): passo a passo

Redes & Segurança · Por · Publicado em · 11 min de leitura

Trem branco sobre trilhos em frente a uma grande estação com múltiplos trilhos e fiação aérea
Metáfora visual para integração e roteamento entre sistemas Foto: Didgeman / Pixabay

Neste tutorial, você vai configurar sincronização unidirecional OpenLDAP com Active Directory e TLS no Debian (sssd/samba-tool). O guia cobre preparo de TLS, Kerberos, sssd para resolução de identidades, script de sincronização com samba-tool, agendamento via systemd e validação final, além de troubleshooting para erros comuns.

Pré-requisitos e cenário de rede

Vamos sincronizar usuários do OpenLDAP para o Active Directory, garantindo transporte seguro com TLS (LDAPS ou StartTLS). Você precisa de acesso de administrador ao AD, uma conta de serviço no OpenLDAP, CA confiável, nomes DNS resolvíveis e relógios sincronizados.

Use um domínio ilustrativo, como ad.example.com para o AD e ldap.example.org para o OpenLDAP. Tenha um OU de teste no AD para validar primeiro. As ações criam e alteram usuários no AD; use ambiente de homologação antes de produção.

Se TLS/PKI é novo para você, revise conceitos em mTLS entre serviços ou em PKI interna no Compose. Para postura geral, veja o checklist de segurança de VPS.

  • Debian atualizado, shell com sudo.
  • OpenLDAP acessível via LDAP/LDAPS, base: dc=example,dc=org.
  • Active Directory acessível, base: DC=ad,DC=example,DC=com.
  • Conta admin no AD e conta bind no OpenLDAP.
  • CA raiz/intermediária importada no Debian.
  • DNS do AD resolvendo SRV e A/AAAA.
  • Sincronização de hora (NTP).
Serviço Porta Uso
LDAP (StartTLS) 389/TCP Consulta/atualização de diretório com StartTLS
LDAPS 636/TCP Consulta/atualização de diretório via TLS direto
Kerberos 88/TCP+UDP Autenticação (GSSAPI) no AD
DNS 53/UDP+TCP Descoberta de DCs e SRV do AD

1) Preparar TLS: CAs, certificados e teste de StartTLS/LDAPS

Instale a CA raiz/intermediária usada pelo OpenLDAP e pelo AD (se houver CA corporativa). O ldapsearch deve validar os certificados. Use LDAPS (636) quando disponível; StartTLS (389) também é aceitável.

Se a CA não estiver instalada, conexões LDAP seguras falharão. Teste primeiro no OpenLDAP e depois no AD. Para certificados públicos, a lógica de confiança é semelhante ao que você já usa em HTTPS; se necessário, veja dicas em SSL com Let's Encrypt.

# 1) Instalar CA corporativa
sudo install -m 0644 /path/to/your-ca.crt /usr/local/share/ca-certificates/your-ca.crt
sudo update-ca-certificates

# 2) Testar OpenLDAP com StartTLS (389)
ldapsearch -H ldap://ldap.example.org -ZZ -x \
  -b "dc=example,dc=org" -s base namingContexts

# 3) Testar OpenLDAP com LDAPS (636)
ldapsearch -H ldaps://ldap.example.org -x \
  -b "dc=example,dc=org" -s base namingContexts

# 4) Testar AD com GSSAPI + LDAPS (exige Kerberos configurado)
ldapsearch -H ldaps://dc1.ad.example.com -Y GSSAPI \
  -b "DC=ad,DC=example,DC=com" -s base defaultNamingContext

2) Instalar pacotes no Debian e ajustar DNS/Kerberos

Instale ferramentas essenciais: sssd, Samba (samba-tool), utilitários LDAP e Kerberos. Configure o /etc/krb5.conf para seu realm do AD. Depois, obtenha um ticket Kerberos com kinit. Não prossiga sem kinit bem-sucedido.

Garanta que /etc/resolv.conf aponte para DNS do AD, pois o sssd usa descoberta SRV para localizar controladores de domínio.

sudo apt update && sudo apt install -y \
  sssd sssd-tools sssd-ldap samba samba-common-bin \
  krb5-user ldap-utils openssl

# Exemplo mínimo de /etc/krb5.conf (ajuste domínios e DCs)
sudo tee /etc/krb5.conf > /dev/null <<'EOF'
[libdefaults]
  default_realm = EXAMPLE.COM
  dns_canonicalize_hostname = false
  rdns = false
  dns_lookup_kdc = true

[realms]
  EXAMPLE.COM = {
    kdc = dc1.ad.example.com
    kdc = dc2.ad.example.com
    admin_server = dc1.ad.example.com
  }

[domain_realm]
  .ad.example.com = EXAMPLE.COM
  ad.example.com = EXAMPLE.COM
EOF

# Obter TGT (ticket)
kinit [email protected]
klist

3) Configurar sssd para resolver identidades do Active Directory via TLS

O sssd fornecerá NSS/PAM a partir do AD, útil para validar a criação dos usuários. Ele não faz sincronização; apenas resolve identidades e autentica.

Defina o domínio do AD, exija certificados válidos e habilite cache. Mantenha /etc/sssd/sssd.conf com permissão 600. Ajuste nsswitch para incluir sss em passwd e group.

  • sssd não sincroniza diretórios; apenas consulta e faz cache.
  • Use ldap_tls_reqcert=demand para falhar em certificados inválidos.
  • Após alterações, limpe cache: sss_cache -E.
# Criar /etc/sssd/sssd.conf
sudo install -m 0600 /dev/null /etc/sssd/sssd.conf
sudo tee /etc/sssd/sssd.conf > /dev/null <<'EOF'
[sssd]
services = nss, pam
domains = ad.example.com

[domain/ad.example.com]
id_provider = ad
ad_domain = ad.example.com
krb5_realm = EXAMPLE.COM
cache_credentials = true
ldap_id_mapping = true
access_provider = ad
ad_gpo_access_control = permissive

# TLS
ldap_tls_reqcert = demand
ldap_tls_cacert = /etc/ssl/certs/ca-certificates.crt

# Descoberta DNS
 dns_discovery_domain = ad.example.com
EOF

sudo systemctl enable --now sssd

# Incluir sss no NSS (ajuste conforme seu arquivo atual)
sudo sed -i 's/^passwd:.*/passwd:\t\tfiles systemd sss/' /etc/nsswitch.conf
sudo sed -i 's/^group:.*/group:\t\tfiles systemd sss/' /etc/nsswitch.conf

4) Testar binds e consultas no OpenLDAP e no AD com TLS

Valide acesso ao OpenLDAP com bind simples usando a conta de serviço. No AD, prefira GSSAPI com o ticket Kerberos obtido via kinit. Nunca exponha senhas em linha de comando em produção.

Confirme filtros e bases corretas. Ajuste nomes e DNs ao seu ambiente.

# OpenLDAP: bind simples com conta de serviço
ldapsearch -H ldaps://ldap.example.org \
  -D "cn=sync,ou=svc,dc=example,dc=org" -W \
  -b "ou=People,dc=example,dc=org" '(objectClass=inetOrgPerson)' uid mail -LLL -o ldif-wrap=no

# AD: GSSAPI com Kerberos (sem senha em linha)
ldapsearch -H ldaps://dc1.ad.example.com -Y GSSAPI \
  -b "DC=ad,DC=example,DC=com" '(sAMAccountName=*)' cn -LLL -o nettimeout=5

5) Mapear atributos e criar usuários no AD com samba-tool

Faremos sincronização OpenLDAP→AD. Mapeamentos comuns: uid → sAMAccountName, givenName/sn → nomes, mail → mail e uidNumber/gidNumber → RFC2307 no AD.

Senhas não são copiáveis entre diretórios de forma direta. O fluxo mais seguro é criar usuário com senha temporária e exigir troca no primeiro login.

Este script cria/atualiza contas no AD; aponte para uma OU de teste antes. Autentique-se no AD com Kerberos (kinit) e use samba-tool com -k yes.

  • uid → sAMAccountName
  • givenName/sn → first/last name
  • mail → mail
  • uidNumber/gidNumber → RFC2307 (se usado no AD)
# Salve como /usr/local/sbin/ol2ad-sync.sh e torne executável
sudo install -m 0750 /dev/null /usr/local/sbin/ol2ad-sync.sh
sudo tee /usr/local/sbin/ol2ad-sync.sh > /dev/null <<'EOF'
#!/usr/bin/env bash
set -euo pipefail

OPENLDAP_URI="ldaps://ldap.example.org"
OPENLDAP_BINDDN="cn=sync,ou=svc,dc=example,dc=org"
OPENLDAP_BASE="ou=People,dc=example,dc=org"
FILTER='(objectClass=inetOrgPerson)'

AD_URI="ldaps://dc1.ad.example.com"
AD_BASE="DC=ad,DC=example,DC=com"
AD_UPN_SUFFIX="@ad.example.com"

# Requer 'kinit [email protected]' prévio

ldapsearch -H "$OPENLDAP_URI" -D "$OPENLDAP_BINDDN" -W -LLL -o ldif-wrap=no \
  -b "$OPENLDAP_BASE" "$FILTER" uid givenName sn mail uidNumber gidNumber \
| awk 'BEGIN{ FS=": "; RS="" }{
  uid=""; given=""; sn=""; mail=""; uidn=""; gidn="";
  for(i=1;i<=NF;i++){
    if($i ~ /^uid: /){ split($i,a,": "); uid=a[2] }
    if($i ~ /^givenName: /){ split($i,a,": "); given=a[2] }
    if($i ~ /^sn: /){ split($i,a,": "); sn=a[2] }
    if($i ~ /^mail: /){ split($i,a,": "); mail=a[2] }
    if($i ~ /^uidNumber: /){ split($i,a,": "); uidn=a[2] }
    if($i ~ /^gidNumber: /){ split($i,a,": "); gidn=a[2] }
  }
  if(uid!=""){ printf "%s;%s;%s;%s;%s;%s\n", uid, given, sn, mail, uidn, gidn }
}' \
| while IFS=';' read -r U G S M UIDN GIDN; do
  UPN="${U}${AD_UPN_SUFFIX}"
  if samba-tool user show "$U" -k yes -H "$AD_URI" >/dev/null 2>&1; then
    # Atualizar atributos simples
    [ -n "$M" ] && samba-tool user setattribute "$U" mail "$M" -k yes -H "$AD_URI"
    continue
  fi
  TMPPASS="$(openssl rand -base64 12)"
  samba-tool user create "$U" "$TMPPASS" \
    --given-name="$G" --surname="$S" \
    --user-principal-name="$UPN" \
    ${UIDN:+--uid-number="$UIDN"} ${GIDN:+--gid-number="$GIDN"} \
    --use-username-as-cn \
    -k yes -H "$AD_URI"
  # Forçar troca de senha no primeiro login
  samba-tool user setpassword "$U" --must-change-at-next-login -k yes -H "$AD_URI"
done
EOF
sudo chmod 0750 /usr/local/sbin/ol2ad-sync.sh

6) Agendar sincronização periódica com systemd timer

Agende a execução do script com systemd. Programe intervalos compatíveis com sua necessidade. Use uma OU de destino controlada no AD para reduzir impacto.

O serviço roda sem ambiente interativo; garanta que o host obtenha TGT Kerberos automaticamente (ex.: keytab) ou rode o timer após kinit via automação.

  • Use um keytab do AD se quiser rodar sem intervenção.
  • Monitore logs de execução e falhas.
  • Defina OnCalendar conforme o SLA.
# Unidade de serviço
sudo tee /etc/systemd/system/ol2ad-sync.service > /dev/null <<'EOF'
[Unit]
Description=OpenLDAP -> AD one-way sync
After=network-online.target
Wants=network-online.target

[Service]
Type=oneshot
ExecStart=/usr/local/sbin/ol2ad-sync.sh
User=root
Group=root
# Opcional: export KRB5CCNAME para um cache de credencial específico
Environment=KRB5CCNAME=/tmp/krb5cc_sync

[Install]
WantedBy=multi-user.target
EOF

# Timer horário (ajuste conforme necessário)
sudo tee /etc/systemd/system/ol2ad-sync.timer > /dev/null <<'EOF'
[Unit]
Description=Run OpenLDAP -> AD sync hourly

[Timer]
OnBootSec=5m
OnUnitActiveSec=1h
Persistent=true

[Install]
WantedBy=timers.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable --now ol2ad-sync.timer

# Rodar manualmente para testar
sudo systemctl start ol2ad-sync.service
sudo systemctl status ol2ad-sync.service --no-pager

7) Como confirmar que funcionou e resolver problemas comuns

Valide identidades pelo sssd e confirme objetos no AD. Depois, confira se atributos mapeados foram aplicados. Se algo falhar, verifique TLS, Kerberos e filtros LDAP.

Para acesso administrativo remoto seguro ao servidor, considere um bastion dedicado com 2FA: veja bastion SSH.

Senhas não são migráveis entre diretórios sem mecanismos específicos; crie usuários com senha temporária e force a troca no primeiro login. Planeje grupos e OUs, restrinja permissões da conta que executa o script e registre auditorias. Um erro de script pode criar muitos objetos; faça dry-runs e aponte para uma OU de teste primeiro.

Para sincronização reversa (AD→OpenLDAP), adapte a lógica: leia do AD (GSSAPI) e aplique no OpenLDAP com ldapadd/ldapmodify. O sssd permanece útil apenas para consulta e cache.

  • Verifique TGT: klist e expiração.
  • Limpe cache do sssd após mudanças: sss_cache -E.
  • Desvios de horário quebram Kerberos; sincronize NTP.
  • TLS handshake falha: confira CA instalada e CN/SAN.
  • samba-tool falha com permissão: revise grupos/ACLs no AD.
  • Atributos RFC2307 ausentes: habilite/complete no AD ou ajuste o script.
# Verificações
id usuario_teste
getent passwd usuario_teste
getent group "Domain Users"

# Ver no AD
samba-tool user show usuario_teste -k yes -H ldaps://dc1.ad.example.com | sed -n '1,120p'

# Confirmar no OpenLDAP
ldapsearch -H ldaps://ldap.example.org -D "cn=sync,ou=svc,dc=example,dc=org" -W \
  -b "ou=People,dc=example,dc=org" "(uid=usuario_teste)" dn -LLL

8) Considerações finais sobre mapeamentos e extensão do fluxo

Ajuste mapeamentos conforme sua árvore LDAP e políticas de UPN/sAMAccountName. Trate colisões de uid/sAMAccountName com regras claras. Para atributos extras, use samba-tool setattribute de forma incremental.

Se necessário, inclua sincronismo de grupos e desativação de contas removidas no OpenLDAP. Comece com relatório/dry-run, depois aplique mudanças com proteção e logs detalhados.

Perguntas frequentes

O sssd faz sincronização entre OpenLDAP e Active Directory?

Não. O sssd fornece identidades e autenticação para o sistema (NSS/PAM) e pode usar AD ou LDAP como provedores. Ele não replica nem sincroniza objetos entre diretórios. A sincronização requer scripts ou ferramentas específicas que leem de um lado e escrevem no outro.

Posso sincronizar senhas do OpenLDAP para o AD?

Diretamente, não. Hashes e políticas diferem e o AD restringe como senhas são definidas. Use criação com senha temporária e “must change at next logon” ou fluxos de alteração de senha centralizados no AD. Evite expor senhas em linha de comando.

Devo usar LDAPS (636) ou StartTLS (389)?

Ambos fornecem criptografia. Use LDAPS quando possível para simplicidade operacional. StartTLS é bom onde o 389 já está exposto. Em todos os casos, valide a cadeia de certificados e exija verificação estrita no cliente (ldap_tls_reqcert=demand).

Quais portas preciso liberar no firewall?

LDAP 389/TCP (StartTLS), LDAPS 636/TCP, Kerberos 88/TCP+UDP e DNS 53/UDP+TCP para descoberta do AD. Se usar Global Catalog, 3268/3269. Libere apenas origens necessárias e monitore tentativas de conexão.

E se o AD não tiver atributos RFC2307 habilitados?

Você pode criar usuários sem uidNumber/gidNumber e mapear apenas sAMAccountName/UPN. Se precisar de UNIX IDs no AD, habilite RFC2307 e preencha uidNumber/gidNumber via samba-tool setattribute, conforme sua política.

É possível fazer o caminho inverso (AD→OpenLDAP)?

Sim, mas é outro fluxo. Leia do AD com GSSAPI e aplique mudanças no OpenLDAP usando ldapadd/ldapmodify. Teste filtros e colisões de atributos. O sssd continua sendo apenas cliente para resolução, não de sincronização.

Precisa revisar TLS/PKI ou robustecer o script de sincronização?

Se você quer validar o mapeamento de atributos, automatizar com keytabs e hardening, podemos conversar sobre próximos passos.

Falar sobre a integração OpenLDAP→AD

Veja também