samba-ad

Configurer un serveur Samba comme membre d'un domaine Active Directory

Environnement

  • Un serveur windows 2022 comme contrôleur de domaine principale Active Directory → ici: WIN-KO477AGSO9G.home.lab (ip = 192.168.10.28)
  • Le domaine: home.lab
  • Le sous-réseau du lab: 192.168.10.0/24
  • La passerelle: 192.168.10.254
  • L'installation du service samba se fera sur un serveur Debian 13.1
  • L'accès aux dossier partagé se fera sur un serveur Ubuntu 24.04

Installation du serveur Debian 13 pour le service samba

  • Installation de Debian 13 sans DE - avec SSH server
  • Monter /srv sur une partition dédiée aux partages (optionnel)
  • La partition sur laquelle seront définis les partages doit être ext4 ou xfs pour la prise en charge des acls et des quotas

Post-installation

Ajouter l'utilisateur créé lors de l'installation au groupe sudo

usermod -aG sudo nom_de_l_utilisateur

La majorité des commandes dans cet article doivent être effectuées avec les privilèges super utilisateur, ici la connexion au serveur se fera avec un utilisateur membre du groupe sudo

Configuration réseau

Edition des fichiers de configuration

sudo nano /etc/network/interfaces
allow-hotplug ens18
iface ens18 inet static
       address 192.168.10.245
       netmask 255.255.255.0
       gateway 192.168.10.254
       nameserver 192.168.10.28 9.9.9.9
sudo systemctl restart networking
sudo nano /etc/hosts
127.0.0.1 localhost
127.0.1.1 sambasrv.home.lab sambasrv
192.168.10.28   WIN-KO477AGSO9G.home.lab        WIN-KO477AGSO9G
sudo nano /etc/resolv.conf
domain home.lab
nameserver 192.168.10.28
nameserver 9.9.9.9

Tester la résolution DNS

nslookup WIN-KO477AGSO9G.home.lab

Doit retourner

Server:  192.168.10.28
Address: 192.168.10.28#53

Name: WIN-KO477AGSO9G.home.lab
Address: 192.168.10.28

Synchronisation de l'heure avec le serveur AD

Définition du serveur NTP

sudo nano /etc/systemd/timesyncd.conf
[Time]
NTP=WIN-KO477AGSO9G.home.lab
FallbackNTP=0.debian.pool.ntp.org 1.debian.pool.ntp.org 2.debian.pool.ntp.org 3.debian.pool.ntp.org
RootDistanceMaxSec=500
sudo systemctl enable --now systemd-timesyncd

Vérification:

sudo systemctl status systemd-timesyncd

Créer la configuration Samba

Installation des paquets

sudo apt install acl attr samba winbind libpam-winbind libnss-winbind krb5-config krb5-user dnsutils python3-setproctitle

Configuration de krb5

sudo nano /etc/krb5.conf
[libdefaults]
        default_realm = HOME.LAB
        dns_lookup_realm = false
        dns_lookup_kdc = true

The Samba teams recommends to not set any further parameters in the /etc/krb5.conf file

Création du dossier partagé

sudo mkdir -p /srv/shares/public

Configuration du service samba

sudo nano /etc/samba/smb.conf
[global]

    # Identification du domaine
    workgroup = HOME
    realm = HOME.LAB
    security = ADS
    netbios name = SAMBASRV

    # Backend IDMAP (AUTORID)
    idmap config * : backend = autorid
    idmap config * : range = 10000-999999
    idmap config * : rangesize = 100000

    # Paramètres d'authentification
    kerberos method = secrets and keytab
    dedicated keytab file = /etc/krb5.keytab
    winbind offline logon = false
    winbind enum users = yes
    winbind enum groups = yes
    winbind nss info = rfc2307

    # Performance et Logs
    server string = %h samba files server
    log file = /var/log/samba/log.%m
    log level = 1
    max log size = 1000
    socket options = TCP_NODELAY SO_KEEPALIVE SO_RCVBUF=131072 SO_SNDBUF=131072

    # Paramètres de sécurité
    client use spnego = yes
    client ntlmv2 auth = yes
    server min protocol = SMB2_10
    client min protocol = SMB2_10
    server smb encrypt = desired

    # Divers
    template shell = /bin/bash
    template homedir = /home/%U

    # ACLS
    vfs objects = acl_xattr
    map acl inherit = yes

# Définition des partages

[Public]
    path = /srv/shares/public
    comment = Partage Public
    read only = no
sudo smbcontrol all reload-config
sudo systemctl enable --now winbind smbd nmbd

Rejoindre le domaine avec Samba

Sur le DC windows server

Créer un OU que l'on nommera "LinServers" dans cet exemple

add-ou

Sur le serveur debian

sudo net ads join -S 192.168.10.28 -U "Administrator" HOME createcomputer="OU=LinServers,DC=home,DC=lab"

Configurer les permissions sur le dossier partagé

sudo chmod 2770 /srv/shares/public
sudo chown root:"HOME\domain users" /srv/shares/public

Vérifier l'intégration AD

wbinfo -u  # Liste les utilisateurs AD
wbinfo -g  # Liste les groupes AD
getent passwd  # Affiche les utilisateurs (locaux + AD)
getent group   # Affiche les groupes (locaux + AD)

Tester l'authentification

sudo smbclient -L localhost -U administrator

Vérifier les services

sudo systemctl status winbind smbd nmbd

Optionnel: Configurer pam pour la création du dossier /home/user à la 1ère connexion

sudo nano /etc/pam.d/common-session

Ajouter cette ligne

session required        pam_mkhomedir.so        skel=/etc/skel umask=0077

Tests d'accès au partage

Depuis un client linux

smbclient //SAMBASRV/Public -U "HOME\Administrator"

Depuis un client windows

File Explorer → Network → SAMBASRV → Public

connect-win


Gérer les permissions depuis le DC windows server

Start → Computer Management → Action → Connect to another computer = SAMBASRV

Ne PAS faire de modification dans "share permissions"

perm

Les permissions se gèrent depuis "security" → "advanced"

perm2


L'opération suivante est optionnelle, attention aux valeurs incrémentées qui pourraient altérer le bon fonctionnement de la machine!!!


Optimisations des performances pour samba

sudo nano /etc/sysctl.conf
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
vm.dirty_ratio = 10
vm.dirty_background_ratio = 5
sudo sysctl -p

Détails

Paramètres Réseau

net.core.rmem_max = 16777216

  • Valeur= 16Mo
  • Signification: Taille maximale des buffers de réception (read) par socket
  • Impact: Permet de recevoir plus de données en une fois avant de devoir traiter

net.core.wmem_max = 16777216

  • Valeur= 16Mo
  • Signification: Taille maximale des buffers d'envoi (write) par socket
  • Impact: Permet d'envoyer plus de données en une fois, réduisant les appels système

net.ipv4.tcp_rmem = 4096 87380 16777216

  • 4096 (4 Ko) : Taille minimale de buffer de réception
  • 87380 (85 Ko) : Taille par défaut
  • 16777216 (16 Mo) : Taille maximale (doit match rmem_max)
  • Comportement : Le kernel ajuste dynamiquement entre min et max

net.ipv4.tcp_wmem = 4096 65536 16777216

  • 4096 (4 Ko) : Taille minimale de buffer d'envoi
  • 65536 (64 Ko) : Taille par défaut
  • 16777216 (16 Mo) : Taille maximale (doit match wmem_max)

Paramètres Mémoire (Page Cache)

vm.dirty_ratio = 10

  • Signification: Pourcentage de RAM sale (modifiée mais pas écrite sur disque) avant écriture forcée
  • Exemple: Sur 16 Go RAM → écriture forcée à 1.6 Go de données sales
  • Impact: Réduit les écritures disque fréquentes

vm.dirty_background_ratio = 5

  • Signification: Pourcentage de RAM sale avant que le kernel lance l'écriture en background
  • Exemple: Sur 16 Go RAM → début écriture à 0.8 Go de données sales
  • Impact: Écriture asynchrone, moins bloquant

Attention aux valeurs

Adaptez à votre mémoire RAM:

RAM totale dirty_ratio dirty_background_ratio
4 Go 15 10
8 Go 10 5
16 Go 5 2
32 Go+ 2 1

 Gestion des quotas d'espace disque par utilisateurs ou par groupes

A savoir:

  • La limite soft est une limite d'avertissement au-delà de laquelle l'utilisateur pourra continuer à écrire sur le disque jusqu'à la limite hard et durant la période de grâce
  • Les quotas définis pour un groupe s'appliquent de manière collective à l'ensemble des utilisateurs de ce groupe (quota partagé)
  • Les quotas définis en inodes agissent sur le nombre de fichiers

Sur le serveur Debian

Tout comme pour la gestion des acls, le système de fichier doit pouvoir gérer les quotas, dans ce lab, nous utilisons ext4

Installation des paquets

sudo apt install quota

Ajouter la prise en charge des quotas au montage de la partition:

sudo nano /etc/fstab

Définir les options usrquota et grpquota sur le montage concerné

/dev/sdb1       /srv    ext4    defaults,usrquota,grpquota       0       0

Remonter la partition

sudo mount -o remount /srv

Initialiser les quotas

quotacheck -cug /srv

Connaître la valeur d'un bloc en octets sur notre partition

  • Identifier le périphérique:
    df | grep /srv

    ici:

    /dev/sdb1       16401276    2120  15544016   1% /srv
  • Afficher la taille d'un bloc en octets:
    sudo tune2fs -l /dev/sdb1 | grep -i "block size"

    ici:

    Block size:               4096

Pour fixer un quota à un utilisateur de l'Active Directory

Identifier l'utilisateur sur lequel nous souhaitons appliquer un quota

wbinfo -u

Exemple de sortie

HOME\administrator
HOME\guest
HOME\krbtgt
HOME\cronuser
HOME\test.user

Configurer les limites soft et hard en octets pour l'utilisateur test.user

sudo edquota "HOME\\test.user"

Cette commande ouvre l'éditeur par défaut pour définir la configuration

Disk quotas for user HOME\test.user (uid 111156):
  Filesystem                   blocks       soft       hard     inodes     soft     hard
  /dev/sdb1                         0          0          0          0        0        0
  • Filesystem = nom du périphérique concerné par les quotas appliqués
  • blocks = blocs déjà utilisés par l'utilisateur (ou le groupe)
  • soft = limite soft en octets
  • hard = limite hard en octets
  • inodes = inodes déjà utilisés par l'utilisateur (ou le groupe)
  • soft = limite soft en inodes
  • hard = limite hard en inodes

Pour définir une limite soft à 1Go et une limite hard à 1,25Go

Disk quotas for user HOME\test.user (uid 111156):
  Filesystem                   blocks       soft       hard     inodes     soft     hard
  /dev/sdb1                         0      262144    327680          0        0        0

Pour vérifier la configuration définie:

sudo repquota -auv

Doit retourner

*** Report for user quotas on device /dev/sdb1
Block grace time: 7days; Inode grace time: 7days
                        Block limits                File limits
User            used    soft    hard  grace    used  soft  hard  grace
----------------------------------------------------------------------
root      --      52       0       0              8     0     0       
HOME\test.user --       0  262144  327680              0     0     0

Pour fixer un quota à un groupe de l'Active Directory

Identifier le groupe sur lequel nous souhaitons appliquer un quota

wbinfo -g

Exemple de sortie

HOME\domain computers
HOME\domain controllers
HOME\schema admins
HOME\enterprise admins
HOME\cert publishers
HOME\domain admins
HOME\domain users
HOME\domain guests
HOME\group policy creator owners
HOME\ras and ias servers
HOME\allowed rodc password replication group
HOME\denied rodc password replication group
HOME\read-only domain controllers
HOME\enterprise read-only domain controllers
HOME\cloneable domain controllers
HOME\protected users
HOME\key admins
HOME\enterprise key admins
HOME\dnsadmins
HOME\dnsupdateproxy
HOME\access-denied assistance users

Configurer les limites soft et hard en octets pour le groupe

sudo edquota -g "HOME\\domain users"

Cette commande ouvre l'éditeur par défaut pour définir la configuration

Disk quotas for group HOME\domain users (gid 110513):
  Filesystem                   blocks       soft       hard     inodes     soft     hard
  /dev/sdb1                         0          0          0          0        0        0

Pour définir une limite soft à 5Go et une limite hard à 6Go

Disk quotas for group HOME\domain users (gid 110513):
  Filesystem                   blocks       soft       hard     inodes     soft     hard
  /dev/sdb1                         0      1310720     1572864       0        0        0

Pour vérifier la configuration définie

sudo repquota -agv

Doit retourner

*** Report for group quotas on device /dev/sdb1
Block grace time: 7days; Inode grace time: 7days
                        Block limits                File limits
Group           used    soft    hard  grace    used  soft  hard  grace
----------------------------------------------------------------------
root      --      40       0       0              5     0     0       
HOME\domain users --      0  1310720  1572864              0     0     0

Configurer la période de grâce

sudo edquota -t

Cette commande ouvre l'éditeur par défaut pour définir la configuration

Grace period before enforcing soft limits for users:
Time units may be: days, hours, minutes, or seconds
  Filesystem             Block grace period     Inode grace period
  /dev/sdb1                     7days                  7days

La configuration de la période de grâce est valable pour l'ensemble des éléments concernés (groupes, utilisateurs, blocs et inodes) et des systèmes de fichiers pour lesquels la politique de quotas est activée.


Utiliser le partage Public sur un serveur Ubuntu 24.04

Joindre le serveur Ubuntu au domaine AD

Installation des paquets

sudo apt install sssd sssd-ad sssd-tools samba-common-bin oddjob oddjob-mkhomedir packagekit krb5-user cifs-utils realmd adcli

Configuration DNS

sudo nano /etc/hosts
127.0.0.1 localhost
127.0.1.1       ubuntusrv.home.lab     ubuntusrv
192.168.10.28   WIN-KO477AGSO9G.home.lab        WIN-KO477AGSO9G
sudo nano /etc/resolv.conf
nameserver 192.168.10.28
nameserver 192.168.10.254
options edns0 trust-ad
search home.lab

Vérification

nslookup WIN-KO477AGSO9G.home.lab

Synchronisation de l'heure avec le serveur AD

sudo nano /etc/systemd/timesyncd.conf
[Time]
NTP=WIN-KO477AGSO9G.home.lab
FallbackNTP=ntp.ubuntu.com
RootDistanceMaxSec=15
sudo systemctl enable --now systemd-timesyncd

Vérification

sudo systemctl status systemd-timesyncd

Configuration de sssd

sudo nano /etc/sssd/sssd.conf
[sssd]
domains = home.lab
config_file_version = 2
services = nss, pam

[domain/home.lab]
default_shell = /bin/bash
krb5_store_password_if_offline = True
cache_credentials = True
krb5_realm = HOME.LAB
realmd_tags = manages-system joined-with-adcli
id_provider = ad
fallback_homedir = /home/%u
ad_domain = home.lab
use_fully_qualified_names = False
ldap_id_mapping = True
access_provider = ad
cache_credentials = true
enumerate = true
sudo systemctl restart sssd

Configuration de krb5

sudo nano /etc/krb5.conf
[logging]
   default = FILE:/var/log/krb5libs.log
   kdc = FILE:/var/log/krb5kdc.log
   admin_server = FILE:/var/log/kadmind.log

[libdefaults]
   default_realm = HOME.LAB
   dns_lookup_realm = false
   dns_lookup_kdc = false
   ticket_lifetime = 24h
   renew_lifetime = 7d
   forwardable = true

[realms]
   HOME.LAB = {
     kdc = WIN-KO477AGSO9G.home.lab
     admin_server = WIN-KO477AGSO9G.home.lab
   }

[domain_realm]
    .home.lab = HOME.LAB
    home.lab = HOME.LAB

Joindre le serveur AD avec realm

sudo realm -v discover home.lab
sudo realm join -U administrator@HOME.LAB home.lab --computer-ou="OU=LinServers,DC=home,DC=lab"

Optionnel: pour la création du dossier personnel des utilisateurs à la 1ère connexion

sudo pam-auth-update --enable mkhomedir

Vérifier la jonction

sudo realm list

Tester l'authentification kerberos

kinit Administrator@HOME.LAB
klist

Vérifier la résolution des utilisateurs AD

getent passwd HOME\\Administrator

Mise en place du point de montage Public au démarrage du serveur avec fstab

Création du dossier utilisé pour le montage

sudo mkdir /mnt/public

Configuration du fichier fstab

sudo nano /etc/fstab

On ajoute cette ligne

//sambasrv.home.lab/public /mnt/public cifs _netdev,sec=krb5,cruid=0,multiuser,vers=3.1.1,x-systemd.after=krb-boot.service   0 0

Options:

  • _netdev #attend le réseau avant le montage
  • sec=krb5 #authentification kerberos
  • cruid=0 #défini le propriétaire du cache pour l'authentification (root)
  • vers=3.1.1 #version du protocole SMB utilisé
  • x-systemd.after=krb-boot.service #le service d'obtention de ticket kerberos doit être lancé

Création d'un script pour kinit

sudo nano /usr/local/bin/kinit-machine.sh
#!/bin/bash
/usr/bin/kinit -k UBUNTUSRV\$@HOME.LAB

Le rendre exécutable

sudo chmod +x /usr/local/bin/kinit-machine.sh

Tester l'obtention du ticket via le script

sudo bash /usr/local/bin/kinit-machine.sh
sudo klist

Doit retourner une sortie similaire à

Ticket cache: FILE:/tmp/krb5cc_0
Default principal: UBUNTUSRV$@HOME.LAB

Valid starting       Expires              Service principal
09/29/2025 18:42:06  09/30/2025 04:42:06  krbtgt/HOME.LAB@HOME.LAB
    renew until 10/06/2025 18:42:06

Création d'un service systemd pour l'obtention du ticket kerberos au démarrage

sudo nano /etc/systemd/system/krb-boot.service
[Unit]
Description=Acquire Kerberos ticket at boot
After=network-online.target
Wants=network-online.target

[Service]
Type=oneshot
ExecStart=/usr/local/bin/kinit-machine.sh
ExecStartPost=/bin/sleep 5
TimeoutSec=60

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable krb-boot.service

Exécution automatique du script toutes les 8h (validité du ticket = 10h par défaut)

sudo crontab -e

On ajoute cette ligne

0 */8 * * * /usr/local/bin/kinit-machine.sh

Monter le partage samba immédiatement et redémarrer le serveur si possible pour vérifications

Montage immédiat

sudo mount -av

Doit retourner

mount.cifs kernel mount options: ip=192.168.10.245,unc=\\sambasrv.home.lab\public,sec=krb5,multiuser,vers=3.1.1,cruid=0,user=root,pass=********
/mnt/public              : successfully mounted

Redémarrer le serveur si possible

sudo systemctl reboot

Vérification de la disponibilité du montage après le redémarrage du serveur

df | grep public

Doit retourner

//sambasrv.home.lab/public        1310720       12   1310708   1% /mnt/public

Vérifier la connexion, l'accès au partage et les permissions avec un utilisateur de l'AD selon la configuration des acls

Pour cet exemple, un utilisateur nommé test.user a été créé dans l'AD (membre de Domain Users par défaut)

su - test.user@home.lab
Password: 
Creating directory '/home/test.user@home.lab'.

On crée un fichier test.txt à la racine du dossier public

cd /mnt/public
touch test.txt
ls -l

Doit retourner

-rwxr-xr-x 1 test.user@home.lab domain users@home.lab 0 Sep 29 19:26 test.txt

Notre utilisateur a les permissions en écriture à la racine du partage public


Sources principales:


back