Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
utilisateurs:quentin:samba_active_directory_domain_controller [Le 20/03/2014, 22:30] Qedinux |
utilisateurs:quentin:samba_active_directory_domain_controller [Le 11/09/2022, 13:12] (Version actuelle) moths-art Suppression des espaces en fin de ligne (détecté et corrigé via le bot wiki-corrector (https://forum.ubuntu-fr.org/viewtopic.php?id=2067892) |
||
---|---|---|---|
Ligne 46: | Ligne 46: | ||
... | ... | ||
===== Authentification avec Samba AD DC ===== | ===== Authentification avec Samba AD DC ===== | ||
- | ==== Authentification des utilisateurs sur le DC ==== | + | Afin de réaliser l'authentification des utilisateurs d'AD, plusieurs méthodes existent : |
+ | * [[https://wiki.samba.org/index.php/Local_user_management_and_authentication/sssd|sssd et pam_sss]] | ||
+ | * [[https://wiki.samba.org/index.php/Local_user_management_and_authentication/nslcd|nslcd et pam_ldap]] | ||
+ | * [[https://wiki.samba.org/index.php/Samba4/Winbind|winbind et pam_winbind]] | ||
+ | Seule cette dernière méthode est expliquée dans cette documentation. | ||
+ | |||
+ | ==== Authentification des utilisateurs sur le DC avec //winbind// ==== | ||
+ | |||
+ | === Installation et configuration pour utiliser //winbind// === | ||
+ | Les paquets suivants sont requis pour la mise en œuvre de cette authentification. | ||
<code>sudo apt-get install libnss-winbind libpam-winbind winbind</code> | <code>sudo apt-get install libnss-winbind libpam-winbind winbind</code> | ||
- | Ajout de winbin dans le fichier de configuration de /etc/nsswitch | + | 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 : | ||
+ | <code>sudo sed -i '/^passwd:\|^group:/{ s/$/ winbind/; };' /etc/nsswitch.conf</code> | ||
<file - /etc/nsswitch.conf>... | <file - /etc/nsswitch.conf>... | ||
- | passwd: compat winbind | + | passwd: compat winbind |
- | group: compat winbind | + | group: compat winbind |
... | ... | ||
</file> | </file> | ||
- | Ceci permet d'utiliser les utilisateurs et groupes venant de AD. | + | 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. | + | 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) |
<code>getent passwd | <code>getent passwd | ||
getent group</code> | getent group</code> | ||
- | Création du home directory pour l'utilisateur du domaine. | + | 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. | ||
+ | <code>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 | ||
+ | </code> | ||
+ | |||
+ | 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. | ||
+ | <file - /etc/samba/smb.conf> | ||
+ | ... | ||
+ | # 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 | ||
+ | ... | ||
+ | </file> | ||
+ | |||
+ | == Création du home directory de l'utilisateur == | ||
+ | |||
+ | * Cette première méthode est très générique et s'applique à tous les utilisateurs de la machine (pas uniquement ceux d'AD) | ||
<file - /usr/share/pam-configs/mkhomedir> | <file - /usr/share/pam-configs/mkhomedir> | ||
Default: no | Default: no | ||
Ligne 70: | Ligne 111: | ||
</file> | </file> | ||
- | Alternative en mofdifiant le fichier /usr/share/pam-config/winbind | + | * Alternative en mofdifiant le fichier /usr/share/pam-config/winbind |
- | <file - /usr/share/pam-config/winbind>... | + | <file - /usr/share/pam-configs/winbind>... |
Session: | Session: | ||
optional pam_winbind.so mkhomedir | optional pam_winbind.so mkhomedir | ||
...</file> | ...</file> | ||
+ | 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) | ||
- | Un autre alternative consiste à monter le home directory de l'utilisateur lors du login. Une option du fichier de configuration /etc/samba/smb.conf est //homedir map = auto.home//. Ceci fait référence à autofs. Développement Ult. | + | * Un autre alternative consiste à monter le home directory de l'utilisateur lors du login. Une option du fichier de configuration /etc/samba/smb.conf est //homedir map = auto.home//. Ceci fait référence à autofs. Développement Ult. |
- | + | == Limitation de l'accès à un ou plusieurs SID == | |
- | Possibilité de limiter l'accès à un ou plusieurs groupes ou utilisateurs sur base du SID | + | 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 |
- | Ajouter require_membership_of=SID à la fin de la ligne pam_winbind.so de la section Auth: du fichier /usr/share/pam-config/winbind | + | <file - /usr/share/pam-configs/winbind>... |
- | <file - /usr/share/pam-config/winbind>... | + | |
Auth: | 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 | [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 | ||
Ligne 86: | Ligne 127: | ||
Le RID 512 représente le groupe //Domain Admins// | Le RID 512 représente le groupe //Domain Admins// | ||
- | Activer cette nouvelle configuration : | + | == Appliquer les modifications des configurations PAM == |
+ | Afin d'appliquer les modifications faites aux différents fichiers de configuration de pam (/usr/share/pam-configs/*), il faut exécuter : | ||
<code>sudo pam-auth-update</code> | <code>sudo pam-auth-update</code> | ||
==== Générer les uidNumber et gidNumber dans l'AD ==== | ==== Générer les uidNumber et gidNumber dans l'AD ==== | ||
- | Deux scripts "maisons" : | + | Le script suivant permet d'ajouter les uidNumber et gidNumber pour chaque utilisateur et chaque groupe de l'AD. |
- | <file - uid_master.sh> | + | <note important>Ce script nécessite des droits élevés permettant d'écrite dans l'AD (p.ex. : root via la commande //sudo//). Une mauvaise exécution de ce script pourrait endommager AD ou faire perdre des données.</note> |
+ | <file bash uid-gid_master.sh> | ||
#!/bin/bash | #!/bin/bash | ||
Ligne 100: | Ligne 143: | ||
sam=/var/lib/samba/private/sam.ldb | sam=/var/lib/samba/private/sam.ldb | ||
- | tmpDir=$(mktemp -d --tmpdir addUid.XXXXXX) || exit 1 | ||
- | umask 0077 | ||
- | ldbsearch -H $sam '(&(objectclass=user)(!(objectclass=computer)))' uidNumber | sed '/^# Referral/ { :loop; N; $! b loop; d; }; s/^\([a-zA-Z0-9]*\): \(.*\)$/\1="\2"/g; /^$/d;' | awk '/^# record/{n++}{print > f n}' f=$tmpDir/r | + | 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 | ||
- | maxUid=$rangeMin | + | echo "Max ID found for $field: $maxID" |
- | for file in `grep -l -E "^uidNumber=" $tmpDir/*` | + | } |
- | do | + | |
- | source $file | + | |
- | if [ $uidNumber -gt $rangeMax ] | + | |
- | then | + | |
- | echo "Warning: uidNumber $uidNumber for $dn is bigger than max id $rangeMax" 1>&2 | + | |
- | elif [ $uidNumber -lt $rangeMin ] | + | |
- | then | + | |
- | echo "Warning: uidNumber $uidNumber for $dn is lower than min id $rangeMin" 1>&2 | + | |
- | else | + | |
- | [ $uidNumber -gt $maxUid ] && maxUid=$uidNumber | + | |
- | fi | + | |
- | done | + | |
- | echo "Max UID found: $maxUid" | + | addIdNumber() { |
- | + | for file in `grep -L -E "^$field=" ${tmpRecord}*` | |
- | uidNumber=$(($maxUid+1)) | + | do |
- | for file in `grep -L -E "^uidNumber=" $tmpDir/*` | + | ((maxID++)) |
- | do | + | source $file |
- | source $file | + | echo "Adding $field: $maxID for dn: $dn" |
- | echo "Adding uidNumber: $uidNumber for dn: $dn" | + | echo "dn: $dn |
- | echo "dn: $dn | + | |
changetype: modify | changetype: modify | ||
- | add: uidNumber | + | add: $field |
- | uidNumber: $uidNumber" > $tmpDir/ldif | + | $field: $maxID" > $tmpLdif |
- | ldbmodify -H $sam $tmpDir/ldif | + | ldbmodify -H $sam $tmpLdif |
- | uidNumber=$(($uidNumber+1)) | + | done |
- | done | + | } |
- | rm -r $tmpDir | ||
- | </file> | ||
- | <file bash gid_master.sh> | ||
- | #!/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 | ||
- | tmpDir=$(mktemp -d --tmpdir addGid.XXXXXX) || exit 1 | ||
umask 0077 | umask 0077 | ||
+ | createTmpDir | ||
- | ldbsearch -H $sam '(objectclass=group)' gidNumber | sed '/^# Referral/ { :loop; N; $! b loop; d; }; s/^\([a-zA-Z0-9]*\): \(.*\)$/\1="\2"/g; /^$/d;' | awk '/^# record/{n++}{print > f n}' f=$tmpDir/r | + | field=uidNumber |
+ | regexp="(&(objectclass=user)(!(objectclass=computer)))" | ||
+ | findMaxId | ||
+ | addIdNumber | ||
+ | cleanTmpDir | ||
- | maxGid=$rangeMin | + | field=gidNumber |
- | for file in `grep -l -E "^gidNumber=" $tmpDir/*` | + | regexp="(objectclass=group)" |
- | do | + | findMaxId |
- | source $file | + | addIdNumber |
- | if [ $gidNumber -gt $rangeMax ] | + | cleanTmpDir |
- | then | + | |
- | echo "Warning: gidNumber $gidNumber for $dn is bigger than max id $rangeMax" 1>&2 | + | |
- | elif [ $gidNumber -lt $rangeMin ] | + | |
- | then | + | |
- | echo "Warning: gidNumber $gidNumber for $dn is lower than min id $rangeMin" 1>&2 | + | |
- | else | + | |
- | [ $gidNumber -gt $maxGid ] && maxGid=$gidNumber | + | |
- | fi | + | |
- | done | + | |
- | echo "Max GID found: $maxGid" | + | removeTmpDir |
- | + | ||
- | gidNumber=$(($maxGid+1)) | + | |
- | for file in `grep -L -E "^gidNumber=" $tmpDir/*` | + | |
- | do | + | |
- | source $file | + | |
- | echo "Adding gidNumber: $gidNumber for dn: $dn" | + | |
- | echo "dn: $dn | + | |
- | changetype: modify | + | |
- | add: gidNumber | + | |
- | gidNumber: $gidNumber" > $tmpDir/ldif | + | |
- | ldbmodify -H $sam $tmpDir/ldif | + | |
- | gidNumber=$(($gidNumber+1)) | + | |
- | done | + | |
- | rm -r $tmpDir | + | exit 0 |
</file> | </file> | ||