Outils personnels

Samba avec authentification sur Active Directory : Différence entre versions

De wikiGite

(Authentification et droits)
 
(26 révisions intermédiaires par un autre utilisateur non affichées)
Ligne 1 : Ligne 1 :
Tout d'abord vérifiez si les paquets suivants sont installés ou non:
+
== Pré-requis ==
 +
Tout d'abord vérifier si les paquets suivants sont installés ou non:
 
  krb5-libs krb5-workstation pam_krb5 samba-client nss
 
  krb5-libs krb5-workstation pam_krb5 samba-client nss
Ensuite il faut configurer le fichier /etc/krb5.conf comme ceci:
+
samba et samba-common (qui fournit entre autres winbind) doivent évidemment être installés !
  
 +
Vérifier que samba et winbind sont lancés au démarrage du serveur !
 +
 +
De plus, penser à synchroniser l'heure du contrôleur de domaine et du serveur linux avec ntp, kerberos est très sensible à ça !
 +
 +
== Kerberos ==
 +
=== Configurer /etc/krb5.conf ===
 
  [logging]
 
  [logging]
  default = FILE:/var/log/krb5libs.log
+
default = FILE:/var/log/krb5libs.log
  kdc = FILE:/var/log/krb5kdc.log
+
kdc = FILE:/var/log/krb5kdc.log
  admin_server = FILE:/var/log/kadmind.log
+
admin_server = FILE:/var/log/kadmind.log
 
   
 
   
 
  [libdefaults]
 
  [libdefaults]
  default_realm = DOMAIN.COM
+
default_realm = DOMAINE_AD.COM
  dns_lookup_realm = true
+
dns_lookup_realm = false
  dns_lookup_kdc = true
+
dns_lookup_kdc = false
 +
ticket_lifetime = 24h
 +
forwardable = yes
 
   
 
   
 
  [realms]
 
  [realms]
  DOMAIN.COM = {
+
DOMAINE_AD.COM = {
  kdc = controleur.domain.com:88
+
    kdc = server.domaine_ad.com
  admin_server = controleur.domain.com:749
+
    admin_server = server.domaine_ad.com
  default_domain = domain.com
+
    default_domain = domaine_ad.com
  }
+
}
 
   
 
   
 
  [domain_realm]
 
  [domain_realm]
  .domain.com = DOMAIN.COM
+
domaine_ad.com = DOMAINE_AD.COM
  domain.com = DOMAIN.COM
+
.domaine_ad.com = DOMAINE_AD.COM
 
   
 
   
  [kdc]
+
  # Optionnel
  profile = /var/kerberos/krb5kdc/kdc.conf
+
# [appdefaults]
   
+
  # pam = {
  [appdefaults]
+
#    debug = false
  pam = {
+
#    ticket_lifetime = 36000
     debug = false
+
#    renew_lifetime = 36000
     ticket_lifetime = 36000
+
#    forwardable = true
     renew_lifetime = 36000
+
#    krb4_convert = false
     forwardable = true
+
# }
     krb4_convert = false
+
 
  }
+
=== Valider la configuration de kerberos ===
Les deux lignes suivantes:
+
kinit user_AD
 +
ou user_AD est un utilisateur existant sur Active Directory. S'il n'y a pas de message d'erreur, vérifier le ticket obtenu par
 +
klist
 +
puis le supprimer par
 +
kdestroy
 +
 
 +
== Samba ==
 +
=== Modifier /etc/samba/smb.conf ===
 +
#GLOBAL PARAMETERS
 +
  [global]
 +
    '''workgroup = DOMAINE_AD'''
 +
    '''realm = DOMAINE_AD.COM'''
 +
    '''preferred master = no'''
 +
    server string = Linux Test Machine
 +
    '''security = ADS'''
 +
    encrypt passwords = yes
 +
    log level = 3
 +
    log file = /var/log/samba/%m
 +
    max log size = 50
 +
    printcap name = cups
 +
    printing = cups
 +
    '''winbind enum users = Yes'''
 +
    '''winbind enum groups = Yes'''
 +
    '''winbind use default domain = Yes'''
 +
    '''winbind nested groups = Yes'''
 +
    '''winbind separator = +'''
 +
    '''idmap uid = 600-20000'''
 +
    '''idmap gid = 600-20000'''
 +
    ;template primary group = "Domain Users"
 +
    template shell = /bin/bash
 +
 
 +
  [partage]
 +
    comment = Home Directories
 +
     path = /home/users/%u # le répertoire devra s'appeler "DOMAINE_AD+user_AD" en toutes lettres, case sensitive, et le "+" au milieu
 +
     '''valid users = @"DOMAINE_AD+groupe1_AD" @"DOMAINE_AD+groupe2_AD"'''
 +
# (pour un utilisateur seul, même syntaxe sans le "@") - (si plusieurs noms, séparer par un espace)
 +
     read only = No
 +
     browseable = No
 +
# Si on utilise "%u" dans le "path", on ne peut pas forcer l'utilisateur par "force user", seulement le groupe
 +
     force group = apache
 +
 
 +
Valider la syntaxe de smb.conf par
 +
testparm
 +
 
 +
=== Joindre la machine au domaine AD ===
 +
net ads join -U administrateur
 +
doit demander le mot de passe administrateur AD et répondre au final
 +
Joined 'SERVER_LINUX' to realm 'DOMAINE_AD'
 +
 
 +
=== Vérifier l'accès à AD ===
 +
Lister les comptes et les groupes :
 +
# wbinfo -u # (liste des utilisateurs)
 +
# wbinfo -g # (liste des groupes)
  
dns_lookup_realm = true
+
== PAM ==
  dns_lookup_kdc = true
+
Modifier /etc/nsswitch.conf
   
+
  passwd: files '''winbind'''
indiquent qu'il faut se reposer sur la résolution DNS (enregistrements SRV) pour trouver le/les serveur(s) kerberos, mais s'il devait y avoir un soucis avec la résolution, tester ces paramètres à false : dans ce cas utiliser le fichier /etc/hosts du serveur.
+
  shadow: files '''winbind'''
 +
group: files '''winbind'''
  
Modifier la configuration samba (fichier /etc/samba/smb.conf) de la manière suivante:
+
Vérifier que les librairies suivantes existent dans /lib :
 +
libnss_winbind.so
 +
libnss_winbind.so.2 -> libnss_winbind.so
 +
libnss_wins.so
 +
libnss_wins.so.2 -> libnss_wins.so
  
- passer security à "ads" (security = ads)
+
Modifier /etc/pam.d/system-auth
  - donner le domaine kerberos: realm = domain.com
+
  #%PAM-1.0
  - indiquer le serveur de mot de passe: password server = controleur
+
  # This file is auto-generated.
  - vérifier qu'il y a bien:
+
  # User changes will be destroyed the next time authconfig is run.
    encrypt passwords = yes
+
auth required /lib/security/$ISA/pam_env.so
    local master = no
+
  auth sufficient /lib/security/$ISA/pam_unix.so likeauth nullok
    domain master = no
+
'''auth sufficient /lib/security/$ISA/pam_winbind.so use_first_pass'''
    preferred master = no
+
  auth required /lib/security/$ISA/pam_deny.so
    dns proxy = no
+
   
  - renommer pour backup le fichier secrets.tdb: mv /etc/samba/secrets.tdb /etc/samba/secrets.tdb.bak
+
  account required /lib/security/$ISA/pam_unix.so
Relancer samba:
+
  account sufficient /lib/security/$ISA/pam_succeed_if.so uid < 100 quiet
  /etc/init.d/smb restart
+
  '''account sufficient /lib/security/$ISA/pam_winbind.so use_first_pass'''
+
  account required /lib/security/$ISA/pam_permit.so
Maintenant il faut vérifier que le kerberos passe bien, pour se faire:
 
  # klist
 
  klist: No credentials cache found (ticket cache FILE:/tmp/krb5cc_0)
 
 
 
  Kerberos 4 ticket cache: /tmp/tkt0
 
  klist: You have no tickets cached
 
Il n'y a pas de ticket en cache, tentons d'en obtenir un:
 
# kinit utilisateur@DOMAIN.COM
 
  Password for utilisateur@DOMAIN.COM:
 
# klist
 
Ticket cache: FILE:/tmp/krb5cc_0
 
Default principal: utilisateur@DOMAIN.COM
 
 
   
 
   
  Valid starting    Expires            Service principal
+
  password requisite /lib/security/$ISA/pam_cracklib.so retry=3 type=
  03/17/09 16:35:43 03/18/09 02:35:45  krbtgt/DOMAIN.COM@DOMAIN.COM
+
  password sufficient /lib/security/$ISA/pam_unix.so nullok use_authtok md5 shadow
        renew until 03/18/09 16:35:43
+
  '''password sufficient /lib/security/$ISA/pam_winbind.so use_first_pass'''
 +
password required /lib/security/$ISA/pam_deny.so
 
   
 
   
  Kerberos 4 ticket cache: /tmp/tkt0
+
  session required /lib/security/$ISA/pam_limits.so
  klist: You have no tickets cached
+
session required /lib/security/$ISA/pam_unix.so
Nous avons bien un ticket kerberos v5 en cache. Détruisons le:
+
  '''session required /lib/security/$ISA/pam_winbind.so use_first_pass'''
  # kdestroy
+
 
  # klist
+
== Relancer les services ==
 +
stopper WINBIND :
 +
service winbind stop
 +
redémarrer SAMBA :
 +
  service smb restart
 +
démarrer WINBIND :
 +
  service winbind start
  
Maintenant il faut joindre la machine avec Samba au domaine:
+
== Authentification et droits ==
 +
A ce moment, on doit pouvoir se connecter (en console ou ssh) au serveur linux avec un utilisateur Active Directory. Si le système reconnait ces utilisateurs, Samba doit les reconnaitre également.
 +
Attention, il peut y avoir un message d'erreur si le homedir de l'utilisateur n'a pas été créé avant.
  
  # kinit Administrator@DOMAIN.COM
+
On peut tester le partage à partir du serveur linux, après obtention d'un ticket kerberos, par :
  [...]
+
  # kinit utilisateur_AD
  # net ads join -Uadministrator%password
+
  [...]
+
# smbclient //serveur_linux/partage -k
  # /etc/init.d/smb restart
+
  OS=[Unix] Server=[CentOS 5.5]
 +
  smb: \> put hello_world.txt
 +
  putting file hello_world.txt as \hello_world.txt (0.0 kb/s) (average nan kb/s)
 +
smb: \> quit
 +
  # ls -l /data/testshare/hello_world.txt
 +
-rwxr--r--  1 utilisateur_AD Util. du domaine 0 2005-07-22 13:37 /data/test/hello_world.txt
 +
Puis bien sûr faire le ménage
 +
# kdestroy
  
Avec ce type de configuration il n'y a plus besoin de créer les utilisateurs avec smbpasswd, mais il faut que l'utilisateur zxiste au niveau de l'OS pour les droits du/des filesystem(s). Pour ça nous pouvons utiliser winbind. Winbind est normalement déjà installé sur les CentOS et RedHat sinon il faut installer le paquet "nss".
+
== Partages ==
 +
La connexion se fait avec l'utilisateur "DOMAINE_AD+user_AD" (avec le "+" au milieu, puisque c'est ce qu'on a demandé par "winbind separator = +" dans smb.conf)
  
Ajouter ceci à smb.conf:
+
Si on utilise le homedir de l'utilisateur comme partage (path = /home/%u) il faut que ce homedir s'appelle en toutes lettres "DOMAINE_AD+user_AD" (DOMAINE en majuscule, toujours le "+" au milieu, et le login utilisateur tel qu'il a été créé dans AD). Si on utilise un chemin statique par contre ça ne pose pas de problème, mais ça n'empêche pas de devoir modifier les acls (voir ci-dessous).
idmap uid = 15000-20000
 
idmap gid = 15000-20000
 
 
winbind enum users = yes
 
winbind enum groups = yes
 
template shell = /bin/bash
 
winbind use default domain = Yes
 
  
Vérifier le fichier /etc/nsswitch.conf et éventuellement modifier les lignes suivantes:
+
Il faut ensuite ajouter le groupe du domaine aux droits du partage, sinon Samba autorisera l'accès, mais pas le système de fichier !
passwd:    db files winbind
 
shadow:    db files
 
group:      db files winbind
 
hosts:      files dns winbind
 
  
Relancer le démon winbind: /etc/init.d/winbind start
+
Activer les acl dans /etc/fstab pour la partition qui contiendra le partage ("acl" dans les options), puis :
 +
# setfacl -m g:"DOMAINE_AD+groupe_AD":rwx /home/share
  
Il n'y a plus qu'à tester !
+
== '''NOTES''' ==
 +
- on ne peut pas mettre "force user = apache" (par exemple) quand on utilise "%u" dans le path, car Samba remplace tout de suite le nom de l'utilisateur par "apache" et cherche une chemin du type "/home/user/apache" dans ce cas (à moins que ce répertoire existe, évidemment, et qu'on veuille que tout le monde tombe dedans !).<br/>
 +
- par contre on peut mettre force group = apache pour forcer les fichiers à se créer avec le groupe "apache"

Version actuelle datée du 11 avril 2011 à 16:41

Pré-requis

Tout d'abord vérifier si les paquets suivants sont installés ou non:

krb5-libs krb5-workstation pam_krb5 samba-client nss

samba et samba-common (qui fournit entre autres winbind) doivent évidemment être installés !

Vérifier que samba et winbind sont lancés au démarrage du serveur !

De plus, penser à synchroniser l'heure du contrôleur de domaine et du serveur linux avec ntp, kerberos est très sensible à ça !

Kerberos

Configurer /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 = DOMAINE_AD.COM
dns_lookup_realm = false
dns_lookup_kdc = false
ticket_lifetime = 24h
forwardable = yes

[realms]
DOMAINE_AD.COM = {
   kdc = server.domaine_ad.com
   admin_server = server.domaine_ad.com
   default_domain = domaine_ad.com
}

[domain_realm]
domaine_ad.com = DOMAINE_AD.COM
.domaine_ad.com = DOMAINE_AD.COM

# Optionnel
# [appdefaults]
# pam = {
#    debug = false
#    ticket_lifetime = 36000
#    renew_lifetime = 36000
#    forwardable = true
#    krb4_convert = false
# }

Valider la configuration de kerberos

kinit user_AD

ou user_AD est un utilisateur existant sur Active Directory. S'il n'y a pas de message d'erreur, vérifier le ticket obtenu par

klist

puis le supprimer par

kdestroy

Samba

Modifier /etc/samba/smb.conf

#GLOBAL PARAMETERS
[global]
   workgroup = DOMAINE_AD
   realm = DOMAINE_AD.COM
   preferred master = no
   server string = Linux Test Machine
   security = ADS
   encrypt passwords = yes
   log level = 3
   log file = /var/log/samba/%m
   max log size = 50
   printcap name = cups
   printing = cups
   winbind enum users = Yes
   winbind enum groups = Yes
   winbind use default domain = Yes
   winbind nested groups = Yes
   winbind separator = +
   idmap uid = 600-20000
   idmap gid = 600-20000
   ;template primary group = "Domain Users"
   template shell = /bin/bash
[partage]
   comment = Home Directories
   path = /home/users/%u # le répertoire devra s'appeler "DOMAINE_AD+user_AD" en toutes lettres, case sensitive, et le "+" au milieu
   valid users = @"DOMAINE_AD+groupe1_AD" @"DOMAINE_AD+groupe2_AD" 
# (pour un utilisateur seul, même syntaxe sans le "@") - (si plusieurs noms, séparer par un espace)
   read only = No
   browseable = No
# Si on utilise "%u" dans le "path", on ne peut pas forcer l'utilisateur par "force user", seulement le groupe
   force group = apache

Valider la syntaxe de smb.conf par

testparm

Joindre la machine au domaine AD

net ads join -U administrateur

doit demander le mot de passe administrateur AD et répondre au final

Joined 'SERVER_LINUX' to realm 'DOMAINE_AD'

Vérifier l'accès à AD

Lister les comptes et les groupes :

# wbinfo -u # (liste des utilisateurs)
# wbinfo -g # (liste des groupes)

PAM

Modifier /etc/nsswitch.conf

passwd: files winbind
shadow: files winbind
group: files winbind

Vérifier que les librairies suivantes existent dans /lib :

libnss_winbind.so
libnss_winbind.so.2 -> libnss_winbind.so
libnss_wins.so
libnss_wins.so.2 -> libnss_wins.so

Modifier /etc/pam.d/system-auth

#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth required /lib/security/$ISA/pam_env.so
auth sufficient /lib/security/$ISA/pam_unix.so likeauth nullok
auth sufficient /lib/security/$ISA/pam_winbind.so use_first_pass
auth required /lib/security/$ISA/pam_deny.so

account required /lib/security/$ISA/pam_unix.so
account sufficient /lib/security/$ISA/pam_succeed_if.so uid < 100 quiet
account sufficient /lib/security/$ISA/pam_winbind.so use_first_pass
account required /lib/security/$ISA/pam_permit.so

password requisite /lib/security/$ISA/pam_cracklib.so retry=3 type=
password sufficient /lib/security/$ISA/pam_unix.so nullok use_authtok md5 shadow
password sufficient /lib/security/$ISA/pam_winbind.so use_first_pass
password required /lib/security/$ISA/pam_deny.so

session required /lib/security/$ISA/pam_limits.so
session required /lib/security/$ISA/pam_unix.so
session required /lib/security/$ISA/pam_winbind.so use_first_pass

Relancer les services

stopper WINBIND :

service winbind stop

redémarrer SAMBA :

service smb restart

démarrer WINBIND :

service winbind start

Authentification et droits

A ce moment, on doit pouvoir se connecter (en console ou ssh) au serveur linux avec un utilisateur Active Directory. Si le système reconnait ces utilisateurs, Samba doit les reconnaitre également. Attention, il peut y avoir un message d'erreur si le homedir de l'utilisateur n'a pas été créé avant.

On peut tester le partage à partir du serveur linux, après obtention d'un ticket kerberos, par :

# kinit utilisateur_AD

# smbclient //serveur_linux/partage -k
OS=[Unix] Server=[CentOS 5.5]
smb: \> put hello_world.txt
putting file hello_world.txt as \hello_world.txt (0.0 kb/s) (average nan kb/s)
smb: \> quit
# ls -l /data/testshare/hello_world.txt
-rwxr--r--  1 utilisateur_AD Util. du domaine 0 2005-07-22 13:37 /data/test/hello_world.txt

Puis bien sûr faire le ménage

# kdestroy

Partages

La connexion se fait avec l'utilisateur "DOMAINE_AD+user_AD" (avec le "+" au milieu, puisque c'est ce qu'on a demandé par "winbind separator = +" dans smb.conf)

Si on utilise le homedir de l'utilisateur comme partage (path = /home/%u) il faut que ce homedir s'appelle en toutes lettres "DOMAINE_AD+user_AD" (DOMAINE en majuscule, toujours le "+" au milieu, et le login utilisateur tel qu'il a été créé dans AD). Si on utilise un chemin statique par contre ça ne pose pas de problème, mais ça n'empêche pas de devoir modifier les acls (voir ci-dessous).

Il faut ensuite ajouter le groupe du domaine aux droits du partage, sinon Samba autorisera l'accès, mais pas le système de fichier !

Activer les acl dans /etc/fstab pour la partition qui contiendra le partage ("acl" dans les options), puis :

# setfacl -m g:"DOMAINE_AD+groupe_AD":rwx /home/share

NOTES

- on ne peut pas mettre "force user = apache" (par exemple) quand on utilise "%u" dans le path, car Samba remplace tout de suite le nom de l'utilisateur par "apache" et cherche une chemin du type "/home/user/apache" dans ce cas (à moins que ce répertoire existe, évidemment, et qu'on veuille que tout le monde tombe dedans !).
- par contre on peut mettre force group = apache pour forcer les fichiers à se créer avec le groupe "apache"