🛠 Outils IT
🛠 78 outils 📚 32 docs
🤖 Assistant

Linux - Services Serveur (LDAP, DHCP, DNS)

1. Prerequis et preparation

1.1 Systemes supportes

Cette documentation cible les distributions suivantes :

  • Ubuntu Server 22.04 LTS / 24.04 LTS
  • Debian 12 (Bookworm)
  • Rocky Linux 9 / AlmaLinux 9 (remplacants de CentOS)

1.2 Configuration reseau statique

Debian / Ubuntu (Netplan) :

# /etc/netplan/00-installer-config.yaml
network:
  version: 2
  renderer: networkd
  ethernets:
    ens18:
      addresses:
        - 192.168.1.10/24
      routes:
        - to: default
          via: 192.168.1.1
      nameservers:
        addresses:
          - 192.168.1.10
          - 8.8.8.8
        search:
          - domaine.local
# Appliquer la configuration
sudo netplan apply

# Verifier
ip addr show ens18
ip route show

Rocky Linux / AlmaLinux (NetworkManager) :

# Configuration via nmcli
sudo nmcli con mod ens18 ipv4.addresses 192.168.1.10/24
sudo nmcli con mod ens18 ipv4.gateway 192.168.1.1
sudo nmcli con mod ens18 ipv4.dns "192.168.1.10 8.8.8.8"
sudo nmcli con mod ens18 ipv4.dns-search "domaine.local"
sudo nmcli con mod ens18 ipv4.method manual
sudo nmcli con up ens18

# Verifier
nmcli con show ens18 | grep ipv4

1.3 Configuration du hostname

# Definir le hostname (FQDN)
sudo hostnamectl set-hostname srv-dc01.domaine.local

# Verifier
hostnamectl
hostname -f

1.4 Configuration de /etc/hosts

# /etc/hosts
127.0.0.1       localhost
192.168.1.10    srv-dc01.domaine.local    srv-dc01

# Ne PAS mettre 127.0.1.1 pour un serveur AD/LDAP
# L'IP doit correspondre a l'interface reseau principale
Attention : Pour Samba AD, le hostname ne doit PAS contenir de tiret bas (_) et doit etre en minuscules. Le FQDN doit correspondre exactement a l'adresse IP dans /etc/hosts. Ne jamais associer le hostname a 127.0.1.1.

1.5 Synchronisation NTP

# Debian / Ubuntu
sudo apt install chrony -y
sudo systemctl enable --now chrony

# Rocky Linux / AlmaLinux
sudo dnf install chrony -y
sudo systemctl enable --now chronyd

# Verifier la synchronisation
chronyc tracking
chronyc sources -v
timedatectl

1.6 Mise a jour systeme

# Debian / Ubuntu
sudo apt update && sudo apt upgrade -y

# Rocky Linux / AlmaLinux
sudo dnf update -y
Astuce : Avant toute installation de service, assurez-vous que le systeme est a jour, que l'IP est statique, que le hostname FQDN est correctement configure et que NTP fonctionne. Ces prerequis evitent 90% des problemes d'installation.

2. Samba Active Directory

2.1 Installation de Samba AD DC

Debian / Ubuntu :

# Installer les paquets necessaires
sudo apt install samba smbclient winbind libpam-winbind libnss-winbind krb5-user krb5-config -y

# Lors de l'installation de krb5-user, indiquer :
#   - Realm par defaut : DOMAINE.LOCAL (en majuscules)
#   - Serveur Kerberos : srv-dc01.domaine.local
#   - Serveur admin : srv-dc01.domaine.local

# Arreter et desactiver les services par defaut
sudo systemctl stop smbd nmbd winbind
sudo systemctl disable smbd nmbd winbind

Rocky Linux / AlmaLinux :

# Activer le depot PowerTools/CRB
sudo dnf install epel-release -y
sudo dnf config-manager --set-enabled crb

# Installer les paquets
sudo dnf install samba samba-dc samba-client samba-winbind samba-winbind-clients krb5-workstation -y

# Arreter et desactiver les services
sudo systemctl stop smb nmb winbind
sudo systemctl disable smb nmb winbind

2.2 Provisionnement du domaine

# Sauvegarder la configuration existante
sudo mv /etc/samba/smb.conf /etc/samba/smb.conf.bak

# Provisionner le domaine
sudo samba-tool domain provision \
  --use-rfc2307 \
  --realm=DOMAINE.LOCAL \
  --domain=DOMAINE \
  --server-role=dc \
  --dns-backend=SAMBA_INTERNAL \
  --adminpass='MotDePasseComplexe123!'

# Copier la configuration Kerberos generee
sudo cp /var/lib/samba/private/krb5.conf /etc/krb5.conf

# Demarrer le service Samba AD DC
sudo systemctl unmask samba-ad-dc
sudo systemctl enable --now samba-ad-dc

# Verifier que le service tourne
sudo systemctl status samba-ad-dc
sudo samba-tool domain level show
Note : L'option --use-rfc2307 active les extensions POSIX dans l'annuaire AD, permettant de stocker les UID/GID Unix pour les utilisateurs et groupes. C'est indispensable pour l'integration avec des systemes Linux.

2.3 Verification du domaine

# Tester la resolution DNS interne Samba
host -t SRV _ldap._tcp.domaine.local 127.0.0.1
host -t SRV _kerberos._tcp.domaine.local 127.0.0.1
host -t A srv-dc01.domaine.local 127.0.0.1

# Tester l'authentification Kerberos
kinit administrator@DOMAINE.LOCAL
klist

# Tester la connexion SMB
smbclient -L localhost -U administrator

# Verifier le niveau fonctionnel du domaine
sudo samba-tool domain level show

2.4 Jonction d'une machine au domaine

Jonction d'un client Linux :

# Installer les paquets necessaires
sudo apt install realmd sssd sssd-tools adcli packagekit -y

# Decouvrir le domaine
realm discover domaine.local

# Joindre le domaine
sudo realm join -U administrator domaine.local

# Verifier la jonction
realm list
id administrator@domaine.local

# Permettre la connexion de tous les utilisateurs du domaine
sudo realm permit --all

Configuration SSSD (apres jonction) :

# /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 = True
ldap_id_mapping = True
access_provider = ad
# Redemarrer SSSD
sudo systemctl restart sssd

# Tester la resolution d'un utilisateur AD
id utilisateur@domaine.local
getent passwd utilisateur@domaine.local

2.5 Gestion des utilisateurs avec samba-tool

# Creer un utilisateur
sudo samba-tool user create jdupont 'MotDePasse123!' \
  --given-name="Jean" \
  --surname="Dupont" \
  --mail-address="jdupont@domaine.local" \
  --company="MonEntreprise"

# Lister les utilisateurs
sudo samba-tool user list

# Afficher les details d'un utilisateur
sudo samba-tool user show jdupont

# Desactiver un utilisateur
sudo samba-tool user disable jdupont

# Reactiver un utilisateur
sudo samba-tool user enable jdupont

# Reinitialiser le mot de passe
sudo samba-tool user setpassword jdupont --newpassword='NouveauMdp456!'

# Supprimer un utilisateur
sudo samba-tool user delete jdupont

# Definir l'expiration du mot de passe
sudo samba-tool user setexpiry jdupont --days=90

# Ne jamais expirer le mot de passe
sudo samba-tool user setexpiry jdupont --noexpiry

2.6 Gestion des groupes

# Creer un groupe
sudo samba-tool group create GRP_Informatique

# Ajouter un utilisateur au groupe
sudo samba-tool group addmembers GRP_Informatique jdupont

# Lister les membres d'un groupe
sudo samba-tool group listmembers GRP_Informatique

# Lister tous les groupes
sudo samba-tool group list

# Retirer un utilisateur d'un groupe
sudo samba-tool group removemembers GRP_Informatique jdupont

# Supprimer un groupe
sudo samba-tool group delete GRP_Informatique

2.7 Gestion des Unites d'Organisation (OU)

# Creer une OU
sudo samba-tool ou create "OU=Utilisateurs,DC=domaine,DC=local"
sudo samba-tool ou create "OU=Serveurs,DC=domaine,DC=local"
sudo samba-tool ou create "OU=Informatique,OU=Utilisateurs,DC=domaine,DC=local"

# Lister les OU
sudo samba-tool ou list

# Deplacer un utilisateur dans une OU
sudo samba-tool user move jdupont "OU=Informatique,OU=Utilisateurs,DC=domaine,DC=local"

# Supprimer une OU (doit etre vide)
sudo samba-tool ou delete "OU=Serveurs,DC=domaine,DC=local"

2.8 GPO basiques avec Samba

# Lister les GPO existantes
sudo samba-tool gpo listall

# Creer une nouvelle GPO
sudo samba-tool gpo create "Politique Mots de Passe"

# Lier une GPO a une OU
sudo samba-tool gpo setlink "OU=Utilisateurs,DC=domaine,DC=local" {GPO-GUID}

# Afficher les liens d'une GPO
sudo samba-tool gpo listcontainers {GPO-GUID}

# Configurer la politique de mot de passe du domaine
sudo samba-tool domain passwordsettings set \
  --complexity=on \
  --min-pwd-length=12 \
  --min-pwd-age=1 \
  --max-pwd-age=90 \
  --history-length=12 \
  --account-lockout-threshold=5 \
  --account-lockout-duration=30 \
  --reset-account-lockout-after=15

# Afficher la politique actuelle
sudo samba-tool domain passwordsettings show
Astuce : Pour une gestion avancee des GPO, il est recommande d'utiliser les outils RSAT (Remote Server Administration Tools) depuis un poste Windows joint au domaine. Samba supporte les GPO crees depuis Windows.

3. OpenLDAP

3.1 Installation

Debian / Ubuntu :

# Installer OpenLDAP et les utilitaires
sudo apt install slapd ldap-utils -y

# Lors de l'installation, definir le mot de passe administrateur
# Reconfigurer si necessaire :
sudo dpkg-reconfigure slapd

# Repondre aux questions :
#   - Omettre la config OpenLDAP : Non
#   - Nom de domaine DNS : domaine.local
#   - Nom de l'organisation : MonEntreprise
#   - Mot de passe admin : (votre mot de passe)
#   - Backend : MDB
#   - Supprimer la base si slapd est purge : Non
#   - Deplacer l'ancienne base : Oui

Rocky Linux / AlmaLinux :

# Installer les paquets
sudo dnf install openldap openldap-servers openldap-clients -y

# Demarrer et activer le service
sudo systemctl enable --now slapd

# Generer le hash du mot de passe admin
slappasswd

# Creer le fichier LDIF pour configurer le mot de passe admin
cat > /tmp/admin-pw.ldif << 'LDIF'
dn: olcDatabase={2}mdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=domaine,dc=local
-
replace: olcRootDN
olcRootDN: cn=admin,dc=domaine,dc=local
-
replace: olcRootPW
olcRootPW: {SSHA}hash_genere_par_slappasswd
LDIF

sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f /tmp/admin-pw.ldif

3.2 Verification de l'installation

# Verifier que le service ecoute
sudo ss -tlnp | grep 389

# Verifier la configuration
sudo slapcat -n 0

# Tester une recherche basique
ldapsearch -x -LLL -H ldap://localhost -b "dc=domaine,dc=local"

# Verifier la configuration dynamique (cn=config)
sudo ldapsearch -Y EXTERNAL -H ldapi:/// -b "cn=config" -LLL dn

3.3 Structure DIT (Directory Information Tree)

# /tmp/base-structure.ldif
# Creation des OU de base

dn: ou=Utilisateurs,dc=domaine,dc=local
objectClass: organizationalUnit
ou: Utilisateurs
description: Unite d'organisation pour les utilisateurs

dn: ou=Groupes,dc=domaine,dc=local
objectClass: organizationalUnit
ou: Groupes
description: Unite d'organisation pour les groupes

dn: ou=Machines,dc=domaine,dc=local
objectClass: organizationalUnit
ou: Machines
description: Unite d'organisation pour les comptes machines

dn: ou=Services,dc=domaine,dc=local
objectClass: organizationalUnit
ou: Services
description: Unite d'organisation pour les comptes de service
# Importer la structure
ldapadd -x -D "cn=admin,dc=domaine,dc=local" -W -f /tmp/base-structure.ldif

3.4 Ajout d'entrees (ldapadd)

# /tmp/utilisateurs.ldif
# Ajouter un utilisateur

dn: uid=jdupont,ou=Utilisateurs,dc=domaine,dc=local
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: jdupont
sn: Dupont
givenName: Jean
cn: Jean Dupont
displayName: Jean Dupont
uidNumber: 10001
gidNumber: 10001
userPassword: {SSHA}MotDePasseHashe
loginShell: /bin/bash
homeDirectory: /home/jdupont
mail: jdupont@domaine.local
shadowLastChange: 0
shadowMax: 90
shadowWarning: 7
# Importer les utilisateurs
ldapadd -x -D "cn=admin,dc=domaine,dc=local" -W -f /tmp/utilisateurs.ldif

# Ajouter un groupe
cat > /tmp/groupe.ldif << 'LDIF'
dn: cn=informatique,ou=Groupes,dc=domaine,dc=local
objectClass: posixGroup
cn: informatique
gidNumber: 10001
memberUid: jdupont
description: Groupe du service informatique
LDIF

ldapadd -x -D "cn=admin,dc=domaine,dc=local" -W -f /tmp/groupe.ldif

3.5 Modification d'entrees (ldapmodify)

# Modifier un attribut existant
cat > /tmp/modif.ldif << 'LDIF'
dn: uid=jdupont,ou=Utilisateurs,dc=domaine,dc=local
changetype: modify
replace: mail
mail: jean.dupont@domaine.local
-
add: telephoneNumber
telephoneNumber: +33 1 23 45 67 89
-
delete: displayName
-
add: displayName
displayName: Jean DUPONT
LDIF

ldapmodify -x -D "cn=admin,dc=domaine,dc=local" -W -f /tmp/modif.ldif

# Ajouter un membre a un groupe
cat > /tmp/ajout-membre.ldif << 'LDIF'
dn: cn=informatique,ou=Groupes,dc=domaine,dc=local
changetype: modify
add: memberUid
memberUid: mmartin
LDIF

ldapmodify -x -D "cn=admin,dc=domaine,dc=local" -W -f /tmp/ajout-membre.ldif

# Renommer une entree (modrdn)
ldapmodrdn -x -D "cn=admin,dc=domaine,dc=local" -W \
  "uid=jdupont,ou=Utilisateurs,dc=domaine,dc=local" \
  "uid=jean.dupont"

3.6 Recherche (ldapsearch)

# Recherche de base - tout l'annuaire
ldapsearch -x -LLL -H ldap://localhost \
  -b "dc=domaine,dc=local"

# Rechercher un utilisateur specifique
ldapsearch -x -LLL -H ldap://localhost \
  -b "ou=Utilisateurs,dc=domaine,dc=local" \
  "(uid=jdupont)"

# Rechercher avec filtre et attributs specifiques
ldapsearch -x -LLL -H ldap://localhost \
  -b "dc=domaine,dc=local" \
  "(&(objectClass=posixAccount)(gidNumber=10001))" \
  uid cn mail

# Recherche avec authentification
ldapsearch -x -LLL -H ldap://localhost \
  -D "cn=admin,dc=domaine,dc=local" -W \
  -b "dc=domaine,dc=local" \
  "(objectClass=organizationalUnit)" dn

# Rechercher tous les groupes et leurs membres
ldapsearch -x -LLL -H ldap://localhost \
  -b "ou=Groupes,dc=domaine,dc=local" \
  "(objectClass=posixGroup)" cn memberUid

# Compter le nombre de resultats
ldapsearch -x -H ldap://localhost \
  -b "dc=domaine,dc=local" \
  "(objectClass=posixAccount)" dn | grep "numEntries"

# Portee de recherche : base, one, sub
ldapsearch -x -LLL -H ldap://localhost \
  -b "ou=Utilisateurs,dc=domaine,dc=local" \
  -s one "(objectClass=*)" dn
Note : Les options -LLL suppriment les commentaires et la version LDIF dans la sortie. L'option -x utilise l'authentification simple (au lieu de SASL). Pour la production, privilegiez LDAPS (port 636) avec des certificats TLS.

3.7 Activation de LDAPS (TLS)

# Generer un certificat auto-signe (ou utiliser Let's Encrypt)
sudo openssl req -x509 -nodes -days 3650 \
  -newkey rsa:2048 \
  -keyout /etc/ldap/slapd-key.pem \
  -out /etc/ldap/slapd-cert.pem \
  -subj "/CN=srv-dc01.domaine.local"

# Ajuster les permissions
sudo chown openldap:openldap /etc/ldap/slapd-key.pem /etc/ldap/slapd-cert.pem
sudo chmod 600 /etc/ldap/slapd-key.pem

# Configurer TLS dans slapd
cat > /tmp/tls.ldif << 'LDIF'
dn: cn=config
changetype: modify
replace: olcTLSCertificateFile
olcTLSCertificateFile: /etc/ldap/slapd-cert.pem
-
replace: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/ldap/slapd-key.pem
LDIF

sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f /tmp/tls.ldif

# Activer LDAPS dans /etc/default/slapd
# Modifier la ligne SLAPD_SERVICES :
# SLAPD_SERVICES="ldap:/// ldapi:/// ldaps:///"

sudo systemctl restart slapd

# Tester la connexion LDAPS
ldapsearch -x -H ldaps://srv-dc01.domaine.local \
  -b "dc=domaine,dc=local" \
  -D "cn=admin,dc=domaine,dc=local" -W

3.8 Replication OpenLDAP (SyncRepl)

Configuration du serveur Provider (maitre) :

# Activer le module syncprov
cat > /tmp/syncprov-module.ldif << 'LDIF'
dn: cn=module{0},cn=config
changetype: modify
add: olcModuleLoad
olcModuleLoad: syncprov
LDIF

sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f /tmp/syncprov-module.ldif

# Configurer l'overlay syncprov sur la base
cat > /tmp/syncprov-config.ldif << 'LDIF'
dn: olcOverlay=syncprov,olcDatabase={1}mdb,cn=config
changetype: add
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: syncprov
olcSpCheckpoint: 100 10
olcSpSessionLog: 100
LDIF

sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f /tmp/syncprov-config.ldif

# Creer un compte de replication
cat > /tmp/repl-user.ldif << 'LDIF'
dn: cn=replicateur,dc=domaine,dc=local
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: replicateur
userPassword: {SSHA}MotDePasseReplication
description: Compte de replication syncrepl
LDIF

ldapadd -x -D "cn=admin,dc=domaine,dc=local" -W -f /tmp/repl-user.ldif

# Configurer les ACL pour le replicateur
cat > /tmp/repl-acl.ldif << 'LDIF'
dn: olcDatabase={1}mdb,cn=config
changetype: modify
add: olcAccess
olcAccess: {0}to *
  by dn.exact="cn=replicateur,dc=domaine,dc=local" read
  by * break
LDIF

sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f /tmp/repl-acl.ldif

Configuration du serveur Consumer (esclave) :

# Sur le serveur consumer, configurer syncrepl
cat > /tmp/syncrepl-consumer.ldif << 'LDIF'
dn: olcDatabase={1}mdb,cn=config
changetype: modify
add: olcSyncRepl
olcSyncRepl: rid=001
  provider=ldap://srv-dc01.domaine.local:389
  bindmethod=simple
  binddn="cn=replicateur,dc=domaine,dc=local"
  credentials=MotDePasseReplication
  searchbase="dc=domaine,dc=local"
  scope=sub
  schemachecking=on
  type=refreshAndPersist
  retry="60 +"
  starttls=critical
  tls_reqcert=demand
LDIF

sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f /tmp/syncrepl-consumer.ldif

# Verifier la replication
ldapsearch -x -H ldap://srv-ldap02.domaine.local \
  -b "dc=domaine,dc=local" "(objectClass=*)" dn | head -20

# Verifier le contextCSN (etat de synchronisation)
ldapsearch -x -H ldap://srv-dc01.domaine.local \
  -b "dc=domaine,dc=local" -s base contextCSN

ldapsearch -x -H ldap://srv-ldap02.domaine.local \
  -b "dc=domaine,dc=local" -s base contextCSN
Attention : En mode refreshAndPersist, la connexion reste ouverte en permanence. Si le provider est injoignable, le consumer retente selon le parametre retry. Pour la production, utilisez toujours TLS (starttls=critical) pour chiffrer les donnees de replication.

4. DNS avec BIND9

4.1 Installation

Debian / Ubuntu :

# Installer BIND9
sudo apt install bind9 bind9utils bind9-doc dnsutils -y

# Verifier le service
sudo systemctl enable --now named
sudo systemctl status named

# Verifier la version
named -v

Rocky Linux / AlmaLinux :

# Installer BIND
sudo dnf install bind bind-utils -y

# Demarrer et activer
sudo systemctl enable --now named

# Ouvrir le port DNS dans le firewall
sudo firewall-cmd --permanent --add-service=dns
sudo firewall-cmd --reload

4.2 Configuration principale

# /etc/bind/named.conf.options (Debian/Ubuntu)
# /etc/named.conf (Rocky/Alma - section options)

options {
    directory "/var/cache/bind";

    // Interfaces d'ecoute
    listen-on { 127.0.0.1; 192.168.1.10; };
    listen-on-v6 { ::1; };

    // Autoriser les requetes depuis le reseau local
    allow-query { localhost; 192.168.1.0/24; };

    // Transfert de zone (vers les serveurs esclaves)
    allow-transfer { 192.168.1.11; };

    // Forwarders (serveurs DNS en amont)
    forwarders {
        8.8.8.8;
        8.8.4.4;
        1.1.1.1;
    };

    // Recursion uniquement pour les clients autorises
    recursion yes;
    allow-recursion { localhost; 192.168.1.0/24; };

    // Securite
    dnssec-validation auto;
    version "not disclosed";

    // Journalisation
    querylog yes;
};

4.3 Zone directe (Forward Zone)

# /etc/bind/named.conf.local - Declaration de la zone
zone "domaine.local" {
    type master;
    file "/etc/bind/zones/db.domaine.local";
    allow-transfer { 192.168.1.11; };
    also-notify { 192.168.1.11; };
    allow-update { none; };
};
# /etc/bind/zones/db.domaine.local
$TTL    604800
@       IN      SOA     srv-dc01.domaine.local. admin.domaine.local. (
                        2024010101  ; Serial (YYYYMMDDNN)
                        3600        ; Refresh (1 heure)
                        1800        ; Retry (30 minutes)
                        604800      ; Expire (1 semaine)
                        86400 )     ; Negative Cache TTL (1 jour)

; Serveurs de noms
@       IN      NS      srv-dc01.domaine.local.
@       IN      NS      srv-dc02.domaine.local.

; Enregistrements A (IPv4)
srv-dc01        IN      A       192.168.1.10
srv-dc02        IN      A       192.168.1.11
srv-web01       IN      A       192.168.1.20
srv-mail        IN      A       192.168.1.30
srv-fichiers    IN      A       192.168.1.40
pc-admin01      IN      A       192.168.1.100

; Enregistrements AAAA (IPv6)
srv-dc01        IN      AAAA    fd00::10
srv-web01       IN      AAAA    fd00::20

; Enregistrements CNAME (Alias)
www             IN      CNAME   srv-web01.domaine.local.
ftp             IN      CNAME   srv-fichiers.domaine.local.
mail            IN      CNAME   srv-mail.domaine.local.
intranet        IN      CNAME   srv-web01.domaine.local.

; Enregistrements MX (Serveur de messagerie)
@               IN      MX  10  srv-mail.domaine.local.
@               IN      MX  20  srv-mail-backup.domaine.local.

; Enregistrements SRV (Services)
_ldap._tcp      IN      SRV 0 100 389  srv-dc01.domaine.local.
_ldap._tcp      IN      SRV 1 100 389  srv-dc02.domaine.local.
_kerberos._tcp  IN      SRV 0 100 88   srv-dc01.domaine.local.
_kpasswd._tcp   IN      SRV 0 100 464  srv-dc01.domaine.local.

; Enregistrements TXT
@               IN      TXT     "v=spf1 mx -all"
Astuce : Le numero de serie (Serial) doit etre incremente a chaque modification du fichier de zone. Le format recommande est YYYYMMDDNN ou NN est le numero de revision du jour (01, 02, etc.). Les serveurs esclaves utilisent ce numero pour detecter les changements.

4.4 Zone inverse (Reverse Zone)

# /etc/bind/named.conf.local - Declaration de la zone inverse
zone "1.168.192.in-addr.arpa" {
    type master;
    file "/etc/bind/zones/db.192.168.1";
    allow-transfer { 192.168.1.11; };
    also-notify { 192.168.1.11; };
};
# /etc/bind/zones/db.192.168.1
$TTL    604800
@       IN      SOA     srv-dc01.domaine.local. admin.domaine.local. (
                        2024010101  ; Serial
                        3600        ; Refresh
                        1800        ; Retry
                        604800      ; Expire
                        86400 )     ; Negative Cache TTL

; Serveurs de noms
@       IN      NS      srv-dc01.domaine.local.
@       IN      NS      srv-dc02.domaine.local.

; Enregistrements PTR (resolution inverse)
10      IN      PTR     srv-dc01.domaine.local.
11      IN      PTR     srv-dc02.domaine.local.
20      IN      PTR     srv-web01.domaine.local.
30      IN      PTR     srv-mail.domaine.local.
40      IN      PTR     srv-fichiers.domaine.local.
100     IN      PTR     pc-admin01.domaine.local.

4.5 Types d'enregistrements DNS - Resume

# A      - Associe un nom a une adresse IPv4
srv-web    IN  A      192.168.1.20

# AAAA   - Associe un nom a une adresse IPv6
srv-web    IN  AAAA   fd00::20

# CNAME  - Alias vers un autre nom (ne PAS utiliser pour la racine @)
www        IN  CNAME  srv-web.domaine.local.

# MX     - Serveur de messagerie (priorite + nom)
@          IN  MX  10 srv-mail.domaine.local.

# NS     - Serveur de noms autoritaire pour la zone
@          IN  NS     srv-dc01.domaine.local.

# PTR    - Resolution inverse (IP vers nom)
20         IN  PTR    srv-web.domaine.local.

# SRV    - Service (priorite poids port cible)
_http._tcp IN  SRV 0 100 80  srv-web.domaine.local.

# TXT    - Texte libre (SPF, DKIM, DMARC, etc.)
@          IN  TXT    "v=spf1 mx -all"

# SOA    - Start of Authority (parametres de la zone)
# Defini en en-tete du fichier de zone

4.6 Verification et application

# Verifier la syntaxe de la configuration
sudo named-checkconf
sudo named-checkconf -z

# Verifier un fichier de zone
sudo named-checkzone domaine.local /etc/bind/zones/db.domaine.local
sudo named-checkzone 1.168.192.in-addr.arpa /etc/bind/zones/db.192.168.1

# Recharger la configuration
sudo rndc reload

# Recharger une zone specifique
sudo rndc reload domaine.local

# Redemarrer BIND9
sudo systemctl restart named

# Tester les resolutions
dig @192.168.1.10 srv-dc01.domaine.local A
dig @192.168.1.10 domaine.local MX
dig @192.168.1.10 -x 192.168.1.10
dig @192.168.1.10 _ldap._tcp.domaine.local SRV

nslookup srv-dc01.domaine.local 192.168.1.10
nslookup 192.168.1.10 192.168.1.10

4.7 DNSSEC

# Creer le repertoire pour les cles
sudo mkdir -p /etc/bind/keys
cd /etc/bind/keys

# Generer la cle de signature de zone (ZSK)
sudo dnssec-keygen -a ECDSAP256SHA256 -n ZONE domaine.local

# Generer la cle de signature de cle (KSK)
sudo dnssec-keygen -a ECDSAP256SHA256 -n ZONE -f KSK domaine.local

# Inclure les cles dans le fichier de zone
# Ajouter en fin de fichier de zone :
# $INCLUDE "/etc/bind/keys/Kdomaine.local.+013+XXXXX.key"
# $INCLUDE "/etc/bind/keys/Kdomaine.local.+013+YYYYY.key"

# Signer la zone
sudo dnssec-signzone -A -3 $(head -c 1000 /dev/urandom | sha1sum | cut -b 1-16) \
  -N INCREMENT -o domaine.local -t \
  /etc/bind/zones/db.domaine.local

# Modifier named.conf.local pour utiliser la zone signee
# file "/etc/bind/zones/db.domaine.local.signed";

# Ajouter dans named.conf.options
# dnssec-validation auto;

# Recharger
sudo rndc reload

# Verifier DNSSEC
dig @192.168.1.10 domaine.local DNSKEY +dnssec
dig @192.168.1.10 srv-dc01.domaine.local A +dnssec
Attention : Les cles DNSSEC doivent etre renouvelees regulierement (ZSK tous les 3 mois, KSK tous les 1-2 ans). Mettez en place un cron ou utilisez les fonctionnalites de rotation automatique de BIND 9.16+.

5. DHCP (isc-dhcp-server / Kea)

5.1 Installation isc-dhcp-server

Debian / Ubuntu :

# Installer le serveur DHCP
sudo apt install isc-dhcp-server -y

# Specifier l'interface d'ecoute
sudo nano /etc/default/isc-dhcp-server
# INTERFACESv4="ens18"
# INTERFACESv6=""

Rocky Linux / AlmaLinux :

# Installer le serveur DHCP
sudo dnf install dhcp-server -y

# L'interface est configuree dans le fichier dhcpd.conf

5.2 Configuration isc-dhcp-server

# /etc/dhcp/dhcpd.conf

# Options globales
option domain-name "domaine.local";
option domain-name-servers 192.168.1.10, 192.168.1.11;
option ntp-servers 192.168.1.10;

default-lease-time 28800;      # 8 heures
max-lease-time 86400;          # 24 heures

# Activer la mise a jour dynamique DNS
ddns-update-style interim;
ddns-updates on;
ddns-domainname "domaine.local.";
ddns-rev-domainname "in-addr.arpa.";

# Serveur autoritaire
authoritative;

# Journalisation
log-facility local7;

# =============================================
# Subnet principal - LAN
# =============================================
subnet 192.168.1.0 netmask 255.255.255.0 {
    range 192.168.1.100 192.168.1.200;
    option routers 192.168.1.1;
    option subnet-mask 255.255.255.0;
    option broadcast-address 192.168.1.255;
    option domain-name-servers 192.168.1.10, 192.168.1.11;
    option domain-name "domaine.local";
    option netbios-name-servers 192.168.1.10;
    default-lease-time 28800;
    max-lease-time 86400;
}

# =============================================
# Subnet secondaire - VLAN Serveurs
# =============================================
subnet 192.168.10.0 netmask 255.255.255.0 {
    range 192.168.10.50 192.168.10.100;
    option routers 192.168.10.1;
    option subnet-mask 255.255.255.0;
    option domain-name-servers 192.168.1.10;
    default-lease-time 604800;   # 1 semaine pour les serveurs
    max-lease-time 2592000;      # 30 jours
}

# =============================================
# Reservations (adresses fixes)
# =============================================
host pc-direction01 {
    hardware ethernet 00:11:22:33:44:55;
    fixed-address 192.168.1.50;
    option host-name "pc-direction01";
}

host imprimante-rdc {
    hardware ethernet AA:BB:CC:DD:EE:FF;
    fixed-address 192.168.1.60;
    option host-name "imprimante-rdc";
}

host srv-backup {
    hardware ethernet 00:AA:BB:CC:DD:EE;
    fixed-address 192.168.10.20;
    option host-name "srv-backup";
}

# =============================================
# Classe pour PXE Boot
# =============================================
class "pxe-clients" {
    match if substring(option vendor-class-identifier, 0, 9) = "PXEClient";
    next-server 192.168.1.15;
    filename "pxelinux.0";
}
# Verifier la configuration
sudo dhcpd -t -cf /etc/dhcp/dhcpd.conf

# Demarrer le service
sudo systemctl enable --now isc-dhcp-server

# Verifier les baux actifs
cat /var/lib/dhcp/dhcpd.leases

# Consulter les logs
sudo journalctl -u isc-dhcp-server -f

5.3 Failover DHCP (haute disponibilite)

# Configuration du serveur PRIMAIRE
# Ajouter dans /etc/dhcp/dhcpd.conf

failover peer "dhcp-failover" {
    primary;
    address 192.168.1.10;
    port 647;
    peer address 192.168.1.11;
    peer port 647;
    max-response-delay 60;
    max-unacked-updates 10;
    mclt 3600;
    split 128;                  # 50/50 repartition
    load balance max seconds 3;
}

# Modifier le subnet pour utiliser le failover
subnet 192.168.1.0 netmask 255.255.255.0 {
    pool {
        failover peer "dhcp-failover";
        range 192.168.1.100 192.168.1.200;
    }
    option routers 192.168.1.1;
    option domain-name-servers 192.168.1.10, 192.168.1.11;
}
# Configuration du serveur SECONDAIRE
# Ajouter dans /etc/dhcp/dhcpd.conf sur le 2eme serveur

failover peer "dhcp-failover" {
    secondary;
    address 192.168.1.11;
    port 647;
    peer address 192.168.1.10;
    peer port 647;
    max-response-delay 60;
    max-unacked-updates 10;
    load balance max seconds 3;
}

# Le subnet est identique au primaire
subnet 192.168.1.0 netmask 255.255.255.0 {
    pool {
        failover peer "dhcp-failover";
        range 192.168.1.100 192.168.1.200;
    }
    option routers 192.168.1.1;
    option domain-name-servers 192.168.1.10, 192.168.1.11;
}

5.4 Kea DHCP (successeur de isc-dhcp-server)

# Installation de Kea (Debian/Ubuntu)
sudo apt install kea-dhcp4-server kea-dhcp6-server kea-ctrl-agent -y

# Fichier de configuration principal
# /etc/kea/kea-dhcp4.conf
// /etc/kea/kea-dhcp4.conf
{
    "Dhcp4": {
        "interfaces-config": {
            "interfaces": [ "ens18" ]
        },
        "lease-database": {
            "type": "memfile",
            "persist": true,
            "name": "/var/lib/kea/dhcp4.leases",
            "lfc-interval": 3600
        },
        "valid-lifetime": 28800,
        "max-valid-lifetime": 86400,
        "renew-timer": 14400,
        "rebind-timer": 25200,

        "option-data": [
            {
                "name": "domain-name",
                "data": "domaine.local"
            },
            {
                "name": "domain-name-servers",
                "data": "192.168.1.10, 192.168.1.11"
            }
        ],

        "subnet4": [
            {
                "id": 1,
                "subnet": "192.168.1.0/24",
                "pools": [
                    { "pool": "192.168.1.100 - 192.168.1.200" }
                ],
                "option-data": [
                    {
                        "name": "routers",
                        "data": "192.168.1.1"
                    }
                ],
                "reservations": [
                    {
                        "hw-address": "00:11:22:33:44:55",
                        "ip-address": "192.168.1.50",
                        "hostname": "pc-direction01"
                    },
                    {
                        "hw-address": "AA:BB:CC:DD:EE:FF",
                        "ip-address": "192.168.1.60",
                        "hostname": "imprimante-rdc"
                    }
                ]
            }
        ],

        "loggers": [
            {
                "name": "kea-dhcp4",
                "output_options": [
                    {
                        "output": "/var/log/kea/kea-dhcp4.log"
                    }
                ],
                "severity": "INFO",
                "debuglevel": 0
            }
        ]
    }
}
# Verifier la configuration Kea
kea-dhcp4 -t /etc/kea/kea-dhcp4.conf

# Demarrer le service
sudo systemctl enable --now kea-dhcp4-server

# Consulter les baux
cat /var/lib/kea/dhcp4.leases

# Consulter les logs
sudo journalctl -u kea-dhcp4-server -f
tail -f /var/log/kea/kea-dhcp4.log
Note : isc-dhcp-server est en fin de vie (EOL). ISC recommande de migrer vers Kea DHCP pour les nouvelles installations. Kea offre une API REST, le stockage des baux en base de donnees et une architecture modulaire.

6. Replication DNS (Master/Slave)

6.1 Configuration du serveur Master

# /etc/bind/named.conf.local sur le MASTER (192.168.1.10)

# Generation de la cle TSIG pour securiser les transferts
tsig-keygen dhcp-dns-key > /etc/bind/tsig-key.conf

# Contenu genere (exemple) :
# key "dhcp-dns-key" {
#     algorithm hmac-sha256;
#     secret "cLeSecRetEgEnErEe==";
# };

# Inclure la cle dans la configuration
# Ajouter dans named.conf :
include "/etc/bind/tsig-key.conf";

# Definir le serveur esclave avec la cle TSIG
server 192.168.1.11 {
    keys { dhcp-dns-key; };
};

# Configuration de la zone master
zone "domaine.local" {
    type master;
    file "/etc/bind/zones/db.domaine.local";
    allow-transfer { key dhcp-dns-key; };
    also-notify { 192.168.1.11; };
    notify yes;
};

zone "1.168.192.in-addr.arpa" {
    type master;
    file "/etc/bind/zones/db.192.168.1";
    allow-transfer { key dhcp-dns-key; };
    also-notify { 192.168.1.11; };
    notify yes;
};

6.2 Configuration du serveur Slave

# /etc/bind/named.conf.local sur le SLAVE (192.168.1.11)

# Copier la meme cle TSIG sur le serveur esclave
# /etc/bind/tsig-key.conf (meme contenu que le master)
key "dhcp-dns-key" {
    algorithm hmac-sha256;
    secret "cLeSecRetEgEnErEe==";
};

# Inclure la cle
include "/etc/bind/tsig-key.conf";

# Definir le serveur master avec la cle TSIG
server 192.168.1.10 {
    keys { dhcp-dns-key; };
};

# Configuration de la zone esclave
zone "domaine.local" {
    type slave;
    file "/var/cache/bind/db.domaine.local";
    masters { 192.168.1.10; };
    allow-notify { 192.168.1.10; };
};

zone "1.168.192.in-addr.arpa" {
    type slave;
    file "/var/cache/bind/db.192.168.1";
    masters { 192.168.1.10; };
    allow-notify { 192.168.1.10; };
};

6.3 Generation et utilisation de cles TSIG

# Generer une cle TSIG avec tsig-keygen
tsig-keygen -a hmac-sha256 transfer-key

# Resultat :
# key "transfer-key" {
#     algorithm hmac-sha256;
#     secret "AbCdEfGhIjKlMnOpQrStUvWxYz0123456789==";
# };

# Alternative : generer avec dnssec-keygen
dnssec-keygen -a HMAC-SHA256 -b 256 -n HOST transfer-key

# La cle doit etre copiee de maniere securisee
# sur les deux serveurs (scp, copie manuelle)
sudo scp /etc/bind/tsig-key.conf root@192.168.1.11:/etc/bind/

6.4 Verification de la replication

# Recharger la configuration sur les deux serveurs
# Sur le master :
sudo rndc reload

# Sur le slave :
sudo rndc reload

# Forcer un transfert de zone depuis le slave
sudo rndc retransfer domaine.local

# Verifier le transfert de zone
dig @192.168.1.11 domaine.local AXFR

# Comparer les numeros de serie
dig @192.168.1.10 domaine.local SOA +short
dig @192.168.1.11 domaine.local SOA +short

# Verifier les logs du slave
sudo journalctl -u named | grep "transfer of"

# Tester la resolution depuis le slave
dig @192.168.1.11 srv-dc01.domaine.local A
dig @192.168.1.11 -x 192.168.1.10

# Verifier l'etat de la notification
sudo rndc notify domaine.local

# Afficher les statistiques
sudo rndc stats
cat /var/cache/bind/named.stats | grep -A5 "Zone Maintenance"
Astuce : Apres chaque modification du fichier de zone sur le master, pensez a incrementer le numero de serie (Serial). Sans cela, le serveur esclave ne detectera pas les changements et ne lancera pas de transfert de zone.

6.5 Transfert incremental (IXFR)

# BIND9 supporte IXFR par defaut si le journal de zone existe
# Verifier les fichiers .jnl (journal)
ls -la /etc/bind/zones/*.jnl

# Forcer un transfert incremental
dig @192.168.1.11 domaine.local IXFR=2024010100

# Pour desactiver IXFR (forcer AXFR) sur le slave :
# Ajouter dans la declaration de zone :
# request-ixfr no;

# Surveiller les transferts dans les logs
sudo journalctl -u named | grep -E "(AXFR|IXFR|transfer)"

7. Integration AD / DNS / DHCP

7.1 Integration Samba AD avec BIND9 (DLZ)

# Installer le module Samba DLZ pour BIND9
sudo apt install bind9 samba -y

# Configurer BIND9 pour utiliser le backend Samba DLZ
# /etc/bind/named.conf.options

options {
    directory "/var/cache/bind";
    tkey-gssapi-keytab "/var/lib/samba/bind-dns/dns.keytab";
    minimal-responses yes;
    listen-on { 127.0.0.1; 192.168.1.10; };
    allow-query { any; };
    forwarders { 8.8.8.8; 1.1.1.1; };
    dnssec-validation no;
};
# /etc/bind/named.conf
include "/etc/bind/named.conf.options";
include "/etc/bind/named.conf.local";

# Module DLZ Samba
dlz "samba4" {
    database "dlopen /usr/lib/x86_64-linux-gnu/samba/bind9/dlz_bind9_12.so";
};
# Modifier la configuration Samba pour utiliser BIND9_DLZ
# /etc/samba/smb.conf - section [global]
[global]
    server role = active directory domain controller
    dns forwarder = 8.8.8.8
    server services = s3fs, rpc, nbt, wrepl, ldap, cldap, kdc, drepl, winbindd, ntp_signd, kcc, dnsupdate

# Regenerer la configuration DNS Samba
sudo samba_upgradedns --dns-backend=BIND9_DLZ

# Verifier les permissions du keytab
sudo chgrp bind /var/lib/samba/bind-dns/dns.keytab
sudo chmod g+r /var/lib/samba/bind-dns/dns.keytab

# Redemarrer les services
sudo systemctl restart named
sudo systemctl restart samba-ad-dc

# Verifier que les zones AD sont chargees
dig @127.0.0.1 domaine.local SOA
dig @127.0.0.1 _ldap._tcp.domaine.local SRV

7.2 Mise a jour dynamique DNS (DDNS)

# Configuration DDNS avec isc-dhcp-server et BIND9
# Generer une cle TSIG pour les mises a jour DDNS
tsig-keygen -a hmac-sha256 dhcp-dns-key > /etc/bind/dhcp-dns-key.conf
# /etc/bind/named.conf.local - Autoriser les MAJ dynamiques
include "/etc/bind/dhcp-dns-key.conf";

zone "domaine.local" {
    type master;
    file "/etc/bind/zones/db.domaine.local";
    allow-update { key dhcp-dns-key; };
    journal "/var/cache/bind/db.domaine.local.jnl";
};

zone "1.168.192.in-addr.arpa" {
    type master;
    file "/etc/bind/zones/db.192.168.1";
    allow-update { key dhcp-dns-key; };
    journal "/var/cache/bind/db.192.168.1.jnl";
};
# /etc/dhcp/dhcpd.conf - Configuration DDNS cote DHCP
include "/etc/bind/dhcp-dns-key.conf";

ddns-update-style interim;
ddns-updates on;
ddns-domainname "domaine.local.";
ddns-rev-domainname "in-addr.arpa.";
update-static-leases on;
allow client-updates;

# Zone directe
zone domaine.local. {
    primary 192.168.1.10;
    key dhcp-dns-key;
}

# Zone inverse
zone 1.168.192.in-addr.arpa. {
    primary 192.168.1.10;
    key dhcp-dns-key;
}

# Subnet avec DDNS
subnet 192.168.1.0 netmask 255.255.255.0 {
    range 192.168.1.100 192.168.1.200;
    option routers 192.168.1.1;
    option domain-name-servers 192.168.1.10;
    option domain-name "domaine.local";
    ddns-hostname = pick-first-value(option host-name, concat("dhcp-", binary-to-ascii(10, 8, "-", leased-address)));
}
# Redemarrer les services
sudo systemctl restart named
sudo systemctl restart isc-dhcp-server

# Tester la mise a jour dynamique manuellement
nsupdate -k /etc/bind/dhcp-dns-key.conf << 'EOF'
server 192.168.1.10
zone domaine.local
update add test-ddns.domaine.local 3600 A 192.168.1.201
send
EOF

# Verifier
dig @192.168.1.10 test-ddns.domaine.local A

# Supprimer l'enregistrement de test
nsupdate -k /etc/bind/dhcp-dns-key.conf << 'EOF'
server 192.168.1.10
zone domaine.local
update delete test-ddns.domaine.local A
send
EOF

7.3 Integration Kea DHCP avec DDNS

// /etc/kea/kea-dhcp-ddns.conf
{
    "DhcpDdns": {
        "ip-address": "127.0.0.1",
        "port": 53001,
        "control-socket": {
            "socket-type": "unix",
            "socket-name": "/tmp/kea-ddns-ctrl-socket"
        },
        "tsig-keys": [
            {
                "name": "dhcp-dns-key",
                "algorithm": "HMAC-SHA256",
                "secret": "cLeSecRetEgEnErEe=="
            }
        ],
        "forward-ddns": {
            "ddns-domains": [
                {
                    "name": "domaine.local.",
                    "key-name": "dhcp-dns-key",
                    "dns-servers": [
                        { "ip-address": "192.168.1.10" }
                    ]
                }
            ]
        },
        "reverse-ddns": {
            "ddns-domains": [
                {
                    "name": "1.168.192.in-addr.arpa.",
                    "key-name": "dhcp-dns-key",
                    "dns-servers": [
                        { "ip-address": "192.168.1.10" }
                    ]
                }
            ]
        }
    }
}
# Activer DDNS dans kea-dhcp4.conf
# Ajouter dans la section "Dhcp4" :
"dhcp-ddns": {
    "enable-updates": true,
    "qualifying-suffix": "domaine.local.",
    "override-no-update": true,
    "override-client-update": true,
    "replace-client-name": "when-not-present"
}

# Demarrer le service DDNS de Kea
sudo systemctl enable --now kea-dhcp-ddns-server
Attention : Lorsque vous utilisez Samba AD avec son propre DNS interne, les mises a jour dynamiques sont gerees automatiquement par Samba. N'utilisez la configuration DDNS avec BIND9 que si vous avez choisi le backend DNS BIND9_DLZ ou un BIND9 standalone.

8. Bonnes pratiques et securite

8.1 Regles de firewall

UFW (Ubuntu/Debian) :

# Ports Samba AD DC
sudo ufw allow 53/tcp     # DNS
sudo ufw allow 53/udp     # DNS
sudo ufw allow 88/tcp     # Kerberos
sudo ufw allow 88/udp     # Kerberos
sudo ufw allow 135/tcp    # RPC Endpoint Mapper
sudo ufw allow 137/udp    # NetBIOS Name
sudo ufw allow 138/udp    # NetBIOS Datagram
sudo ufw allow 139/tcp    # NetBIOS Session
sudo ufw allow 389/tcp    # LDAP
sudo ufw allow 389/udp    # LDAP
sudo ufw allow 445/tcp    # SMB
sudo ufw allow 464/tcp    # Kerberos kpasswd
sudo ufw allow 464/udp    # Kerberos kpasswd
sudo ufw allow 636/tcp    # LDAPS
sudo ufw allow 3268/tcp   # Global Catalog
sudo ufw allow 3269/tcp   # Global Catalog SSL
sudo ufw allow 49152:65535/tcp  # RPC dynamique

# Ports DHCP
sudo ufw allow 67/udp     # DHCP Server
sudo ufw allow 68/udp     # DHCP Client
sudo ufw allow 647/tcp    # DHCP Failover
sudo ufw allow 647/udp    # DHCP Failover

# Activer le firewall
sudo ufw enable
sudo ufw status verbose

firewalld (Rocky/AlmaLinux) :

# Services predefinies
sudo firewall-cmd --permanent --add-service=dns
sudo firewall-cmd --permanent --add-service=ldap
sudo firewall-cmd --permanent --add-service=ldaps
sudo firewall-cmd --permanent --add-service=kerberos
sudo firewall-cmd --permanent --add-service=samba
sudo firewall-cmd --permanent --add-service=dhcp

# Ports personnalises
sudo firewall-cmd --permanent --add-port=3268/tcp
sudo firewall-cmd --permanent --add-port=3269/tcp
sudo firewall-cmd --permanent --add-port=464/tcp
sudo firewall-cmd --permanent --add-port=464/udp
sudo firewall-cmd --permanent --add-port=647/tcp

# Appliquer
sudo firewall-cmd --reload
sudo firewall-cmd --list-all

8.2 AppArmor (Ubuntu/Debian)

# Verifier l'etat d'AppArmor
sudo aa-status

# Profils pour BIND9
sudo ls /etc/apparmor.d/usr.sbin.named

# Si BIND9 a besoin d'acceder a des fichiers supplementaires,
# modifier le profil :
sudo nano /etc/apparmor.d/local/usr.sbin.named

# Ajouter les chemins necessaires, par exemple :
# /var/lib/samba/bind-dns/** rw,
# /var/lib/samba/bind-dns/dns.keytab r,

# Recharger le profil
sudo apparmor_parser -r /etc/apparmor.d/usr.sbin.named

# En cas de probleme, mettre en mode complainte
sudo aa-complain /usr/sbin/named

8.3 SELinux (Rocky/AlmaLinux)

# Verifier l'etat de SELinux
getenforce
sestatus

# Contextes pour BIND
ls -lZ /etc/named/
ls -lZ /var/named/

# Si BIND n'arrive pas a lire un fichier
sudo semanage fcontext -a -t named_zone_t "/etc/bind/zones(/.*)?"
sudo restorecon -Rv /etc/bind/zones

# Autoriser BIND a utiliser le port DLZ
sudo setsebool -P named_write_master_zones on

# Autoriser DHCP
sudo setsebool -P dhcpd_manage_leases on

# Consulter les alertes SELinux
sudo ausearch -m AVC -ts recent
sudo sealert -a /var/log/audit/audit.log

8.4 Sauvegarde des services

#!/bin/bash
# /root/scripts/backup-services.sh
# Script de sauvegarde des services DNS/LDAP/DHCP/AD

BACKUP_DIR="/opt/backups/services"
DATE=$(date +%Y%m%d_%H%M%S)
mkdir -p "${BACKUP_DIR}"

# Sauvegarde BIND9
echo "=== Sauvegarde DNS BIND9 ==="
tar czf "${BACKUP_DIR}/bind9_${DATE}.tar.gz" \
  /etc/bind/ \
  /var/cache/bind/ \
  2>/dev/null

# Sauvegarde DHCP
echo "=== Sauvegarde DHCP ==="
tar czf "${BACKUP_DIR}/dhcp_${DATE}.tar.gz" \
  /etc/dhcp/ \
  /var/lib/dhcp/ \
  /etc/kea/ \
  /var/lib/kea/ \
  2>/dev/null

# Sauvegarde OpenLDAP
echo "=== Sauvegarde OpenLDAP ==="
slapcat -n 0 > "${BACKUP_DIR}/ldap_config_${DATE}.ldif"
slapcat -n 1 > "${BACKUP_DIR}/ldap_data_${DATE}.ldif"

# Sauvegarde Samba AD
echo "=== Sauvegarde Samba AD ==="
samba-tool domain backup offline \
  --targetdir="${BACKUP_DIR}/samba_${DATE}"

# Rotation (garder 30 jours)
find "${BACKUP_DIR}" -type f -mtime +30 -delete

echo "=== Sauvegarde terminee ==="
ls -lh "${BACKUP_DIR}/"*${DATE}*
# Ajouter au cron (tous les jours a 2h)
sudo crontab -e
# 0 2 * * * /root/scripts/backup-services.sh >> /var/log/backup-services.log 2>&1

8.5 Surveillance et monitoring

# Configurer la journalisation BIND9
# /etc/bind/named.conf.local

logging {
    channel default_log {
        file "/var/log/named/default.log" versions 5 size 10m;
        severity info;
        print-time yes;
        print-severity yes;
        print-category yes;
    };
    channel query_log {
        file "/var/log/named/queries.log" versions 5 size 50m;
        severity info;
        print-time yes;
    };
    channel xfer_log {
        file "/var/log/named/transfers.log" versions 3 size 5m;
        severity info;
        print-time yes;
    };
    channel security_log {
        file "/var/log/named/security.log" versions 5 size 10m;
        severity dynamic;
        print-time yes;
    };

    category default { default_log; };
    category queries { query_log; };
    category xfer-in { xfer_log; };
    category xfer-out { xfer_log; };
    category security { security_log; };
    category notify { xfer_log; };
};
# Creer le repertoire de logs
sudo mkdir -p /var/log/named
sudo chown bind:bind /var/log/named

# Rotation des logs avec logrotate
cat > /etc/logrotate.d/named << 'EOF'
/var/log/named/*.log {
    weekly
    rotate 12
    compress
    delaycompress
    missingok
    notifempty
    create 0640 bind bind
    postrotate
        /usr/sbin/rndc reopen 2>/dev/null || true
    endscript
}
EOF

# Surveiller les services en temps reel
sudo journalctl -u named -f
sudo journalctl -u isc-dhcp-server -f
sudo journalctl -u slapd -f
sudo journalctl -u samba-ad-dc -f
Astuce : Utilisez un outil de supervision comme Zabbix, Nagios ou Prometheus pour surveiller la disponibilite des services DNS, DHCP et LDAP. Surveillez les metriques cles : temps de reponse DNS, nombre de baux DHCP actifs, etat de la replication LDAP.

9. Depannage courant

9.1 Depannage DNS (BIND9)

# Verifier la configuration globale
sudo named-checkconf
sudo named-checkconf -z     # Verifier aussi les zones

# Verifier un fichier de zone specifique
sudo named-checkzone domaine.local /etc/bind/zones/db.domaine.local
sudo named-checkzone 1.168.192.in-addr.arpa /etc/bind/zones/db.192.168.1

# Tester la resolution
dig @127.0.0.1 domaine.local SOA +short
dig @127.0.0.1 srv-dc01.domaine.local A +short
dig @127.0.0.1 -x 192.168.1.10 +short
dig @127.0.0.1 domaine.local ANY +noall +answer

# Tracer une requete complete
dig @127.0.0.1 srv-dc01.domaine.local A +trace

# Tester le transfert de zone
dig @192.168.1.10 domaine.local AXFR

# Nslookup interactif
nslookup
> server 192.168.1.10
> set type=any
> domaine.local
> exit

# Verifier les ports d'ecoute
sudo ss -tlnup | grep named

# Consulter les logs
sudo journalctl -u named --since "1 hour ago" --no-pager
sudo tail -50 /var/log/named/default.log

# Vider le cache DNS
sudo rndc flush
sudo rndc flush domaine.local

# Afficher le cache
sudo rndc dumpdb -cache
cat /var/cache/bind/named_dump.db | head -100

# Statistiques
sudo rndc stats
cat /var/cache/bind/named.stats

9.2 Depannage DHCP

# Verifier la configuration
sudo dhcpd -t -cf /etc/dhcp/dhcpd.conf

# Pour Kea :
kea-dhcp4 -t /etc/kea/kea-dhcp4.conf

# Consulter les baux actifs
cat /var/lib/dhcp/dhcpd.leases
# ou pour Kea :
cat /var/lib/kea/dhcp4.leases

# Tester depuis un client (mode verbose)
sudo dhclient -v ens18

# Liberer et renouveler un bail
sudo dhclient -r ens18    # Release
sudo dhclient -v ens18    # Renew

# Surveiller le trafic DHCP en temps reel
sudo tcpdump -i ens18 port 67 or port 68 -vv

# Consulter les logs
sudo journalctl -u isc-dhcp-server --since "1 hour ago"
sudo journalctl -u kea-dhcp4-server --since "1 hour ago"

# Verifier l'etat du failover
sudo omshell << 'EOF'
connect
server 127.0.0.1
port 7911
new failover-state
set name = "dhcp-failover"
open
EOF

# Verifier les ports
sudo ss -ulnp | grep dhcp

9.3 Depannage Samba AD

# Verifier la configuration Samba
testparm

# Verifier le domaine
sudo samba-tool domain level show
sudo samba-tool domain info 192.168.1.10

# Tester DNS interne Samba
host -t SRV _ldap._tcp.domaine.local 127.0.0.1
host -t SRV _kerberos._tcp.domaine.local 127.0.0.1
host -t A srv-dc01.domaine.local 127.0.0.1

# Tester Kerberos
kinit administrator@DOMAINE.LOCAL
klist

# Verifier la base SAM
sudo samba-tool dbcheck
sudo samba-tool dbcheck --fix

# Lister les comptes machines
sudo samba-tool computer list

# Verifier les SPN (Service Principal Names)
sudo samba-tool spn list srv-dc01$

# Verifier la replication entre DC
sudo samba-tool drs showrepl

# Diagnostic des erreurs
sudo samba-tool drs kcc

# Consulter les logs Samba
sudo journalctl -u samba-ad-dc --since "1 hour ago"
cat /var/log/samba/log.samba
ls /var/log/samba/

# Tester la connexion SMB
smbclient -L localhost -U administrator
smbclient //srv-dc01/netlogon -U administrator

# Verifier l'heure (crucial pour Kerberos)
# Un decalage > 5 minutes cause des echecs d'authentification
timedatectl
chronyc tracking

9.4 Depannage OpenLDAP

# Verifier la configuration
sudo slaptest -u

# Tester la connectivite
ldapsearch -x -H ldap://localhost -b "" -s base namingContexts

# Recherche complete de l'annuaire
ldapsearch -x -LLL -H ldap://localhost \
  -D "cn=admin,dc=domaine,dc=local" -W \
  -b "dc=domaine,dc=local" "(objectClass=*)" dn

# Verifier la configuration dynamique
sudo ldapsearch -Y EXTERNAL -H ldapi:/// \
  -b "cn=config" -LLL "(objectClass=olcDatabaseConfig)"

# Verifier les index
sudo ldapsearch -Y EXTERNAL -H ldapi:/// \
  -b "olcDatabase={1}mdb,cn=config" olcDbIndex

# Verifier la replication syncrepl
sudo ldapsearch -Y EXTERNAL -H ldapi:/// \
  -b "olcDatabase={1}mdb,cn=config" olcSyncRepl

# Verifier le contextCSN
ldapsearch -x -H ldap://localhost \
  -b "dc=domaine,dc=local" -s base contextCSN

# Consulter les logs
sudo journalctl -u slapd --since "1 hour ago"

# Augmenter le niveau de log temporairement
sudo ldapmodify -Y EXTERNAL -H ldapi:/// << 'LDIF'
dn: cn=config
changetype: modify
replace: olcLogLevel
olcLogLevel: stats sync
LDIF

# Remettre le niveau normal
sudo ldapmodify -Y EXTERNAL -H ldapi:/// << 'LDIF'
dn: cn=config
changetype: modify
replace: olcLogLevel
olcLogLevel: stats
LDIF

# Verifier les ports
sudo ss -tlnp | grep slapd

9.5 Commandes de diagnostic reseau

# Tester la resolution DNS
dig @192.168.1.10 domaine.local SOA
nslookup domaine.local 192.168.1.10

# Tester la connectivite
ping -c 3 srv-dc01.domaine.local
traceroute srv-dc01.domaine.local

# Verifier les ports ouverts
sudo ss -tlnup | grep -E "(53|67|68|88|389|445|636)"
sudo nmap -sT -sU -p 53,67,88,389,445,636 192.168.1.10

# Capturer le trafic DNS
sudo tcpdump -i ens18 port 53 -vv -c 50

# Capturer le trafic LDAP
sudo tcpdump -i ens18 port 389 -vv -c 20

# Verifier les tables de routage
ip route show

# Verifier la configuration DNS du systeme
cat /etc/resolv.conf
resolvectl status    # systemd-resolved

# Tester une connexion LDAP avec openssl
openssl s_client -connect srv-dc01.domaine.local:636 -showcerts

9.6 Erreurs courantes et solutions

Attention : Erreur Kerberos "Clock skew too great" : le decalage horaire entre le client et le serveur depasse 5 minutes. Solution : synchroniser NTP avec chronyc makestep ou verifier la configuration de chrony.
Note : Si BIND9 refuse de demarrer avec "permission denied", verifiez les permissions des fichiers de zone et les profils AppArmor/SELinux. Sur Ubuntu, le processus named tourne sous l'utilisateur bind.
Astuce : Pour diagnostiquer les problemes de replication OpenLDAP, comparez les contextCSN entre le provider et le consumer. S'ils different, verifiez la connectivite reseau, les identifiants de replication et les logs slapd.
# Resume des commandes de verification essentielles
# ================================================

# DNS
named-checkconf && echo "Config OK"
named-checkzone domaine.local /etc/bind/zones/db.domaine.local

# DHCP
dhcpd -t -cf /etc/dhcp/dhcpd.conf && echo "Config OK"
kea-dhcp4 -t /etc/kea/kea-dhcp4.conf && echo "Config OK"

# Samba AD
testparm -s 2>/dev/null | head -5
samba-tool domain level show

# OpenLDAP
sudo slaptest -u && echo "Config OK"
ldapsearch -x -H ldap://localhost -b "" -s base namingContexts

# Etat des services
systemctl status named slapd samba-ad-dc isc-dhcp-server kea-dhcp4-server 2>/dev/null
systemctl is-active named slapd samba-ad-dc isc-dhcp-server kea-dhcp4-server 2>/dev/null