Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

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 "​WarninguidNumber ​$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>​
  
  • utilisateurs/quentin/samba_active_directory_domain_controller.1395351027.txt.gz
  • Dernière modification: Le 20/03/2014, 22:30
  • par Qedinux