Brouillon avant de compléter ou créer un nouvelle page concernant l'authentification d'un utilisateur avec Samba AD DC
La version actuelle se trouve ici Samba - Active Directory Domain Controller (AD DC) …
…
Avant toute installation, il est nécessaire de définir son environnement. Ainsi, il sera possible de configurer correctement son serveur. Le reste de cette documentation se basera sur les paramètres suivants :
Nom de domaine | example.com |
Royaume (realm) | EXAMPLE.COM |
Nom de NetBIOS | example |
Nom du serveur | ubndc01 |
Adresse IP du serveur | 192.168.1.11 |
Rôle du serveur | DC (contrôleur de domaine) |
…
…
…
…
…
…
…
…
…
…
…
…
…
Afin de réaliser l'authentification des utilisateurs d'AD, plusieurs méthodes existent :
Seule cette dernière méthode est expliquée dans cette documentation.
Les paquets suivants sont requis pour la mise en œuvre de cette authentification.
sudo apt-get install libnss-winbind libpam-winbind winbind
Il faut configurer le Name Service Switch (nsswitch) par l'ajout de winbind comme méthode pour les sections passwd et group. Par exemple avec la commande :
sudo sed -i '/^passwd:\|^group:/{ s/$/ winbind/; };' /etc/nsswitch.conf
... passwd: compat winbind group: compat winbind ...
Ceci permet de chercher et utiliser les utilisateurs, leurs mots de passes et les groupes venant de AD au travers de winbind. Par défaut sur un DC, les commandes ci-dessous retourne la liste de tous les utilisateurs et groupes (y compris ceux d'AD). Ce comportement peut être modifié avec l'option … dans la partie global du fichier de configuration de samba (/etc/samba/smb.conf)
getent passwd getent group
Les UID et GID, s'ils n'existent pas dans l'AD, sont automatiquement généré (par winbind / idmap) mais ils ne sont pas écrits dans AD par winbind. Cette remarque est importante car d'autres machines récupérant ces même informations de l'AD génèreront d'autres UID et GID pour un même utilisateur. Ceci crée une incohérance dans le domaine.
Idmap écrit les données dans le fichier /var/lib/samba/private/idmap.ldb. Le range prévu pour la création automatique des id's est définit dans dn: CN=CONFIG avec les valeurs lower et upperBound.
sudo ldbsearch -H /var/lib/samba/private/idmap.ldb 'cn=config' # record 1 dn: CN=CONFIG cn: CONFIG lowerBound: 3000000 upperBound: 4000000 xidNumber: 3000017 distinguishedName: CN=CONFIG
Le fichier idmap.ldb n'est présent que sur les DC et pas sur les member server. Est-il bon de copier les valeurs des xidNumber vers les uidNumber et gidNumber des utilisateurs et groupes d'AD ?
En tout cas, afin d'éviter ce type de problème, il est préférable de définir ces valeurs dans AD. Pour ce faire, il faut définir un range d'identifiant réservé uniquement pour AD, par exemple de 100000 à 999999. De plus, afin de garantir que seuls les utilisateurs et groupes possèdant un UID et GID dans AD puissent s'authentifier sur une machine Linux du domaine, il faut ajouter les options suivantes dans la partie globale du fichier de configuration de samba.
... # Pas nécessaire sur un DC car les valeurs sont prises dans idmap.ldb si elles n'existent pas dans AD idmap config EXAMPLE:backend = ad idmap config EXAMPLE:schema_mode = rfc2307 idmap config EXAMPLE:range = 100000-999999 # A ajouter sur les member servers mais pas sur les DC #winbind nss info = rfc2307 ...
Default: no Priority: 900 Session-Type: Additional Session-Final: required pam_mkhomedir.so skel=/etc/skel umask=0077 silent
... Session: optional pam_winbind.so mkhomedir ...
Cette alternative crée bien le home directory de l'utilisateur. Les droits sur ce répertoire sont correctement définis (700 avec owner: uidNumber et group: gidNumber)
Il est possible de limiter la possibilité l'accès à certains utilisateurs ou certains groupes sur base de leur SID. Il faut ajouter require_membership_of=<SID> à la fin de la ligne pam_winbind.so de la section Auth: du fichier /usr/share/pam-config/winbind
... Auth: [success=end default=ignore] pam_winbind.so krb5_auth krb5_ccache_type=FILE cached_login try_first_pass required_membership_of=S-1-5-21-5555555555-555555555-5555555555-512 ...
Le RID 512 représente le groupe Domain Admins
Afin d'appliquer les modifications faites aux différents fichiers de configuration de pam (/usr/share/pam-configs/*), il faut exécuter :
sudo pam-auth-update
Le script suivant permet d'ajouter les uidNumber et gidNumber pour chaque utilisateur et chaque groupe de l'AD.
#!/bin/bash # Vérifier si ces valeurs existent dans smb.conf # idmap config REALM:range = min-max rangeMin=100000 rangeMax=999999 sam=/var/lib/samba/private/sam.ldb createTmpDir() { tmpDir=$(mktemp -d --tmpdir addGid.XXXXXX) || exit 1 tmpRecord=$tmpDir/record_ tmpLdif=$tmpDir/ldif } cleanTmpDir() { rm $tmpDir/* } removeTmpDir() { rm -r $tmpDir } findMaxId() { ldbsearch -H $sam "$regexp" $field | sed '/^# Referral/ { :loop; N; $! b loop; d; }; s/^\([a-zA-Z0-9]*\): \(.*\)$/\1="\2"/g; /^$/d;' | awk '/^# record/{n++}{print > f n}' f=$tmpRecord maxID=$rangeMin for file in `grep -l -E "^$field=" ${tmpRecord}*` do source $file if [ ${!field} -gt $rangeMax ] then echo "Warning: $field ${!field} for $dn is bigger than max id $rangeMax" 1>&2 elif [ ${!field} -lt $rangeMin ] then echo "Warning: $field ${!field} for $dn is lower than min id $rangeMin" 1>&2 else [ ${!field} -gt $maxID ] && maxID=${!field} fi done echo "Max ID found for $field: $maxID" } addIdNumber() { for file in `grep -L -E "^$field=" ${tmpRecord}*` do ((maxID++)) source $file echo "Adding $field: $maxID for dn: $dn" echo "dn: $dn changetype: modify add: $field $field: $maxID" > $tmpLdif ldbmodify -H $sam $tmpLdif done } umask 0077 createTmpDir field=uidNumber regexp="(&(objectclass=user)(!(objectclass=computer)))" findMaxId addIdNumber cleanTmpDir field=gidNumber regexp="(objectclass=group)" findMaxId addIdNumber cleanTmpDir removeTmpDir exit 0
…