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 27/03/2014, 13:31]
Qedinux
utilisateurs:quentin:samba_active_directory_domain_controller [Le 28/04/2018, 11:32] (Version actuelle)
Ligne 1: Ligne 1:
 + ​{{tag>​BROUILLON}}
 +====== Samba - Active Directory Domain Controller (AD DC) ======
  
 +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|Samba - Active Directory Domain Controller (AD DC)]]
 +...
 +
 +===== Versions =====
 +...
 +===== Installation de Samba=====
 +==== Paramètres généraux ====
 +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 | \\ RFC 2606
 +|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) |
 +==== Pré-requis ====
 +...
 +==== Installation à partir des dépôts ====
 +...
 +==== Installation à partir des sources ====
 +...
 +===== Création d'un premier DC dans une nouvelle forêt =====
 +...
 +==== Initialisation de Samba ====
 +...
 +==== Démarrer Samba AD DC ====
 +...
 +===== Test de Samba AD DC =====
 +...
 +==== Tests des ACL ====
 +...
 +==== Tests des attributs étendus ====
 +...
 +==== Tests du DNS ====
 +...
 +==== Tests de Kerberos ====
 +...
 +==== Tests de SMB ====
 +...
 +===== Mise à jour depuis un domaine Samba de type NT4 vers un AD=====
 +...
 +===== Authentification avec Samba AD 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>​
 +
 +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>​...
 +passwd: compat winbind
 +group: ​ compat winbind
 +...
 +</​file>​
 +
 +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)
 +<​code>​getent passwd
 +getent group</​code>​
 +
 +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>​
 +Default: no
 +Priority: 900
 +Session-Type:​ Additional
 +Session-Final:​
 +        required ​       pam_mkhomedir.so skel=/​etc/​skel umask=0077 silent
 +</​file>​
 +
 +  * Alternative en mofdifiant le fichier /​usr/​share/​pam-config/​winbind
 +<file - /​usr/​share/​pam-configs/​winbind>​...
 +Session:
 +        optional ​                       pam_winbind.so mkhomedir
 +...</​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.
 +== Limitation de l'​accès à un ou plusieurs 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
 +<file - /​usr/​share/​pam-configs/​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
 +...</​file>​
 +Le RID 512 représente le groupe //Domain Admins//
 +
 +== 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>​
 +
 +==== Générer les uidNumber et gidNumber dans l'AD ====
 +Le script suivant permet d'​ajouter les uidNumber et gidNumber pour chaque utilisateur et chaque groupe de l'AD.
 +<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
 +
 +# 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
 +</​file>​
 +
 +
 +===== Informations optionnelles et complémentaires =====
 +...
 +===== Références =====
 +...
 +//​Contributeurs principaux : [[utilisateurs:​bcag2|bcag2]],​ [[:​utilisateurs:​Qedinux|Qedinux]]//​
  • utilisateurs/quentin/samba_active_directory_domain_controller.txt
  • Dernière modification: Le 28/04/2018, 11:32
  • (modification externe)