Infrastructure

Joindre AlmaLinux 9 à un domaine Active Directory via SSSD

Guide complet pour intégrer un serveur AlmaLinux 9 à un domaine Active Directory — authentification LDAP/Kerberos, sudo AD, montage homedir automatique.

Table des matières

Joindre un serveur Linux à un domaine Active Directory permet aux utilisateurs du domaine de s’authentifier avec leurs identifiants AD et de bénéficier des politiques centralisées. Voici comment le faire proprement sur AlmaLinux 9 avec SSSD et Realmd.

Prérequis

  • AlmaLinux 9 à jour
  • Accès réseau au contrôleur de domaine (ports 88, 389, 636, 3268, 3269)
  • Compte AD avec droits de jonction de machine
  • DNS configuré pour résoudre le domaine AD

Vérification du réseau

# Vérifier la résolution DNS du domaine AD
dig +short domaine.local _ldap._tcp.domaine.local SRV
# → doit retourner l'IP et le port LDAP du DC

# Ping vers le DC
ping dc1.domaine.local

# Vérifier les ports nécessaires
for port in 88 389 636; do
  nc -zv dc1.domaine.local $port && echo "Port $port OK" || echo "Port $port FERMÉ"
done
DNS critique

Le DNS doit impérativement résoudre le domaine AD et les enregistrements SRV. Configurez les DCs comme serveurs DNS dans /etc/resolv.conf avant de commencer.

Configurer le DNS

# /etc/resolv.conf
search domaine.local
nameserver 192.168.x.10   # DC1
nameserver 192.168.x.11   # DC2

# Vérifier
nslookup domaine.local
nslookup dc1.domaine.local

Installation des paquets

dnf install -y \
  realmd \
  sssd \
  sssd-ad \
  sssd-tools \
  oddjob \
  oddjob-mkhomedir \
  adcli \
  samba-common-tools \
  krb5-workstation \
  openldap-clients

Jonction au domaine

# Découverte du domaine (sans jonction)
realm discover domaine.local

# Jonction au domaine
realm join -U administrateur domaine.local
# Entrez le mot de passe du compte AD quand demandé

# Vérifier la jonction
realm list

Sortie attendue :

domaine.local
  type: kerberos
  realm-name: DOMAINE.LOCAL
  domain-name: domaine.local
  configured: kerberos-member
  server-software: active-directory
  client-software: sssd
  required-package: oddjob
  required-package: oddjob-mkhomedir
  required-package: sssd
  required-package: adcli
  required-package: samba-common-tools
  login-formats: %U@domaine.local
  login-policy: allow-realm-logins

Configuration SSSD

Le fichier /etc/sssd/sssd.conf est généré automatiquement par realm join, mais quelques ajustements sont recommandés :

# /etc/sssd/sssd.conf
[sssd]
domains = domaine.local
config_file_version = 2
services = nss, pam

[domain/domaine.local]
default_shell = /bin/bash
krb5_store_password_if_offline = True
cache_credentials = True
krb5_realm = DOMAINE.LOCAL
realmd_tags = manages-system joined-with-adcli
id_provider = ad
fallback_homedir = /home/%u@%d
ad_domain = domaine.local
use_fully_qualified_names = False    # ← Permet login sans @domaine.local
ldap_id_mapping = True
access_provider = ad

# Performance
ad_gpo_access_control = disabled    # Désactiver GPO Linux (optionnel)
ldap_referrals = false

# Cache
cache_credentials = true
offline_credentials_expiration = 7

# Timeout
ldap_network_timeout = 3
ldap_opt_timeout = 3
use_fully_qualified_names = False

Sans cette option, les utilisateurs doivent se connecter avec utilisateur@domaine.local. Avec False, ‘utilisateur’ suffit — beaucoup plus pratique.

# Appliquer les permissions (obligatoire)
chmod 600 /etc/sssd/sssd.conf

# Redémarrer SSSD
systemctl restart sssd
systemctl enable sssd

Création automatique du home directory

# Activer la création automatique du home au premier login
authselect select sssd with-mkhomedir --force

# Activer le service oddjobd
systemctl enable --now oddjobd

Tester l’authentification

# Vérifier qu'un utilisateur AD est visible
id utilisateur@domaine.local
# Avec use_fully_qualified_names = False :
id utilisateur

# Tester l'authentification Kerberos
kinit administrateur@DOMAINE.LOCAL
klist   # Affiche le ticket Kerberos

# Tester la connexion SSH avec un compte AD
ssh utilisateur@localhost

Autoriser uniquement certains groupes AD

Par défaut, tous les utilisateurs AD peuvent se connecter. Limitez l’accès :

# Autoriser uniquement le groupe "Linux-Admins" AD
realm permit -g 'Linux-Admins@domaine.local'

# Interdire tout le monde sauf les autorisés
realm deny --all
realm permit -g 'Linux-Admins@domaine.local'
realm permit -g 'Linux-Users@domaine.local'

# Vérifier
realm list

Sudo via groupes Active Directory

Créez un fichier sudoers pour vos groupes AD :

# /etc/sudoers.d/ad-admins
# Donner sudo complet au groupe "Linux-Admins" AD
%Linux-Admins@domaine.local ALL=(ALL) ALL

# Sudo sans mot de passe pour les admins infra
%Linux-Infra-Admins@domaine.local ALL=(ALL) NOPASSWD: ALL
# Vérifier la syntaxe
visudo -c -f /etc/sudoers.d/ad-admins

# Tester
su - utilisateur-admin@domaine.local
sudo whoami   # → root

Problèmes courants

SSSD ne démarre pas

journalctl -u sssd -n 50 --no-pager

# Problème fréquent : permissions sssd.conf
chmod 600 /etc/sssd/sssd.conf
chown root:root /etc/sssd/sssd.conf

# Nettoyer le cache SSSD (si utilisateurs "fantômes")
sss_cache -E
systemctl restart sssd

Utilisateur AD introuvable

# Vérifier la connexion LDAP directement
ldapsearch -H ldap://dc1.domaine.local \
  -D "CN=svc-linux,OU=Services,DC=domaine,DC=local" \
  -w PASS \
  -b "DC=domaine,DC=local" \
  "(sAMAccountName=utilisateur)"

# Forcer la synchronisation
sss_cache -u utilisateur
id utilisateur

Kerberos expiré ou invalide

# Vérifier le ticket
klist

# Renouveler manuellement
kinit utilisateur@DOMAINE.LOCAL

# Synchroniser l'heure (Kerberos est sensible à la dérive)
timedatectl status
chronyc tracking

# Si décalage > 5 min → Kerberos échoue
chronyc makestep

Déjoindre le domaine

realm leave domaine.local
# Le compte machine est supprimé de l'AD

Vérification finale

# Test complet
getent passwd utilisateur        # L'utilisateur est visible
getent group 'Linux-Admins'      # Le groupe AD est visible
su - utilisateur                  # Connexion → home créé automatiquement
sudo -l                           # Droits sudo corrects
Résultat

Les utilisateurs AD peuvent désormais se connecter en SSH sur le serveur Linux avec leurs identifiants du domaine. Le home directory est créé automatiquement au premier login.

Cas particulier — authentification sans jonction (bind LDAP simple)

Si vous ne pouvez pas joindre la machine au domaine (environnements restrictifs), une alternative est le bind LDAP simple via nslcd :

dnf install -y nss-pam-ldapd nslcd

# /etc/nslcd.conf
uri ldap://dc1.domaine.local
base dc=domaine,dc=local
binddn CN=svc-linux,OU=Services,DC=domaine,DC=local
bindpw VOTRE_MOT_DE_PASSE
ssl start_tls
tls_reqcert never
scope sub
filter passwd (&(objectClass=user)(memberOf=CN=Linux-Users,OU=Groupes,DC=domaine,DC=local))
map passwd uid sAMAccountName
map passwd homeDirectory unixHomeDirectory
map passwd gecos displayName

Cette méthode est moins intégrée (pas de Kerberos, pas de SSO) mais fonctionne dans des environnements contraints.

Comments