Samba avec authentification sur Active Directory

De wikiGite

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"