====== Samba avec LDAP ====== Samba permet de gérer les domaines Windows. Les utilisateurs du domaine sont habituellement stockés dans un fichier à plat, cependant il est possible d'utiliser une base LDAP pour les stocker. Cet article donne la configuration de Samba mais pas celle du serveur LDAP. ===== Configuration du serveur ===== Installer le serveur samba en version 3. Modifier le fichier ''/etc/samba/smb.conf'' pour configurer Samba. Le serveur Samba doit être client du serveur LDAP si l'on stocke les fichiers des utilisateurs sur le serveur samba lui-même. Cela lui permet également de gérer correctement les droits d'accès à travers Samba (pour faire de la machine Samba un client du LDAP voir [[ldap:configuration_d_une_machine_linux_cliente|l'article correspondant]]). Pour avoir un serveur samba qui fait office de PDC (Controleur Primaire de Domaine) et de serveur de home, il faut la configuration suivante : ######### # P D C # ######### [global] ############################# # identification du serveur # ############################# ; nom du domaine workgroup = EXAMPLE ; nom du serveur dans le domain netbios name = PDC ; description qui sera affichée chez les clients server string = Samba Server %v on %L ######################### # controleur de domaine # ######################### ; les clients peuvent s'authentifier sur ce serveur domain logons = yes ; le serveur fait office de serveur wins wins support = yes ; ce serveur sera toujours le serveur maitre avec un ; niveau de 255, pour l'instant (2005) les produits ; microsoft doivent être au alentour de 70 au maximum os level = 255 ; tiens à jour la liste de toutes les machines du domaine ; ce role doit etre accordé à la machine qui agit en ; tant que PDC domain master = yes ; ce serveur est le serveur de son sous reseau local master = yes ; astuce pour etre certain de devenir le local ; master browser de son sous reseau prefered master = yes ; l'authentification est faite sur cette machine security = user ; les mot de passe sont cryptés encrypt passwords = true ; authorise les clients à synchroniser leur horloge time server = yes host msdfs = yes ; option censé augmenté les performance tcp/ip socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192 ; methode de resolution des noms name resolve order = wins hosts bcast ; hote authorisé à se connecté ;hosts allow = 192.168.0., 192.168.1. ; serveur wins annexe qui doit etre synchronisé ;remote browse sync = 192.168.0.2 ; alias des comptes username map = /etc/samba/smbusers #################### # profile et logon # #################### ; chemin d'acces aux profiles logon path = \\%L\profiles\%U ; script à executer lorsque un utilisateur se connecte logon script = logon.bat ; lettre du lecteur sur lequel sera le home de l'utilisateur logon drive = Z: obey pam restrictions = no ldap passwd sync = yes ############################# # parametre d'acces au LDAP # ############################# ; adresse du serveur LDAP ; le fait de definir 2 sources de donnees authorise ; la creation de comptes machines sur le serveur ; samba et non sur le serveur ldap. comme cela ; chacun gere ses machines mais les utilisateurs ; sont géré de facon globale passdb backend = smbpasswd ldapsam:ldap://ldap.example.com/ ; dn de l'admin du LDAP, il faut authoriser samba ; a modifier et ajouter certain attributs du LDAP ldap admin dn = cn=samba,ou=DSA,dc=example,dc=com ; suffixe de la base LDAP ldap suffix = dc=example,dc=com ; ou sont les groupes ldap group suffix = ou=groups ; ou sont les utilisateur ldap user suffix = ou=people ; ou sont les machines ;ldap machine suffix = ou=computers ; parametre ssl # si on veut du tls : #ldap ssl = start tls # si on en veut pas : ldap ssl = no ldap delete dn = no ################## # journalisation # ################## ; niveau de log log level = 2 ; le log se fait par machine log file = /var/log/samba/log.%m ; taille maximum d'un fichier de log max log size = 1000 ; horodatage des actions loggées debug timestamp = yes ################################## # option concernant les fichiers # ################################## ; option pour la casse des noms de fichiers case sensitive = yes default case = lower preserve case = yes short preserve case = yes ; encodage des caracteres Dos charset = 850 Unix charset = ISO8859-1 ; masque de creation des fichiers create mask = 0744 directory mask = 0750 ; fichier cache hide dot files = yes ; lien symbolique follow symlinks = yes wide links = no ; pas de compte invite guest ok = no [homes] comment = repertoire de %U, %u read only = no writeable = yes browseable = no delete read only = yes map archive = yes # preexec = echo "(`date`) connection %u, machine %m\" >> /tmp/samba.log # postexec = echo "(`date`) deconnection %u, machine %m\" >> /tmp/samba.log [netlogon] path = /var/samba/netlogon browseable = no writable = no read only = yes [profiles] path = /var/samba/profiles writeable = yes read only = no browseable = no create mask = 0640 directory mask = 0700 ==== Connexion de Samba au service LDAP ==== Il faut ensuite indiquer à samba le mot de passe qu'il doit utiliser pour se connecter à LDAP. La connection se faisant avec le compte indiqué par l'attribut //ldap admin dn//. Ce mot de passe est stocké dans le fichier ''/var/lib/samba/sercet.tdb''. smbpasswd -w mot_de_passe ==== Création des répertoires ==== Il faut également créer les répertoires ''netlogon'' et ''profiles'' : mkdir /var/samba mkdir /var/samba/netlogon mkdir /var/samba/profiles chmod 711 /var/samba chmod 777 /var/samba/profiles chmod 755 /var/samba/netlogon echo 'NET USE Z: \\SMB-HOME\homes' | sed "s/$/^M/" | sed "$ s/$/^Z/" > /var/samba/netlogon/logon.bat chmod 744 /var/samba/netlogon/logon.bat ==== SID ==== Le numéro du serveur samba peut être forcé : net setlocalsid S-1-5-21-20043454-3907201459-4213964173 ==== Alias ==== Pour faciliter l'administration du serveur on peut donner plusieurs nom au compte administrateur : * créer un fichier ''/etc/samba/smbusers'' * y mettre : ''"Administrator = administrateur admin root administrator"'' Il est possible de donner des alias à d'autres comptes. ===== Ajouter une machine cliente (serveur ou poste de travail) ===== Pour ajouter une machine au domaine géré par samba, il faut créer un compte sur le serveur samba. Le compte doit être un compte système et Samba pour que cela fonctionne. J'utilise un script qui prend en entrée un fichier qui contient un nom de machine par ligne : #!/usr/bin/perl # Script qui cree des comptes pour les machines use strict; use warnings; use Net::LDAP; my $source = 'liste-machine.txt'; my $min = 30000; my %ldap = ( host => 'ldap.example.com', base => 'dc=example,dc=com', ); $ldap{cxn} = Net::LDAP->new($ldap{host}) or die "$@"; $ldap{cxn}->bind; sub existe_dans_ldap { my $arg = shift(@_); my $msg = $ldap{cxn}->search( base => $ldap{base}, filter => "(|(uidNumber=$arg)(uid=$arg))", attrs => ['1.1'] ); $msg->code && die "Problem! " . $msg->error; return ($msg->count != 0); } sub existe_dans_smbpasswd { my $uid = shift(@_); my $exist = 0; open(PASSWD, ") { chomp; if (/(.+)\$:.*/ && $1 eq $uid) { $exist = 1; last; } } close PASSWD; return $exist; } sub existe_dans_passwd { my $uid = shift(@_); my $exist = 0; open(PASSWD, ") { chomp; if (/(.+)(:.*){6}/ && $1 eq $uid) { $exist = 1; last; } } close PASSWD; return $exist; } sub trouve_uidnumber_libre { my $num = $min; my @liste = (); open(PASSWD, ") { chomp; push(@liste,$2) if (/(.+:){2}(.+)(:.*){4}/); } close PASSWD; while (grep(/$num/, @liste) > 0) { $num++; } return $num; } sub ajoute_au_systeme { my($nom, $num) = @_; my $res = `/usr/sbin/useradd -c \"Machine $nom\" -d /dev/null -s /bin/false -u $num $nom\$`; print "$nom -> $res "; $res = `smbpasswd -a -m $nom`; print ", $res\n"; } open(ENTREE, "<$source"); my $nom; while (defined($nom = )) { chomp($nom); if (existe_dans_smbpasswd($nom)) { warn("$nom : existe dans /etc/samba/smbpasswd !\n"); next; } if (existe_dans_passwd($nom)) { warn("$nom : existe dans /etc/passwd !\n"); next; } if (existe_dans_ldap($nom)) { warn("$nom : existe dans ldap !\n"); next; } my $uidnumber = trouve_uidnumber_libre; ajoute_au_systeme($nom, $uidnumber); } Il est à noter que le $ à la fin du useradd indique à samba que c'est un compte représentant une machine. ===== Autre serveur Samba (facultatif) ===== Pour connecter un autre serveur samba au domaine, il faut configurer le serveur de tel sorte qu'il s'authentifie sur le PDC et qu'il fasse partie du même workgroup (domaine) : ####################### # serveur de fichiers # ####################### [global] ; le nom du domaine workgroup = EXAMPLE ; le nom du serveur netbios name = SMB-HOME ; il n'est pas le PDC domain master = no ; l'authentification se fait sur le PDC security = domain ; le niveau du serveur doit etr moindre que le PDC os level = 50 ; si le serveur et le PDC ne sont pas sur le meme reseau ; le serveur doit etre maitre sur son sous reseau prefered master = no local master = no name resolve order = wins hosts bcast [homes] read only = no writeable = yes browseable = no delete read only = yes map archive = yes path = /home Sur le serveur que l'on souhaite ajouté au domaine, il faut taper la commande qui suit ; le -I indique l'adresse du PDC, le -U indique le compte LDAP representant l'administrateur du domaine windows. La commande demande le mot de passe du compte //Administrateur// (ou tout autre compte ayant les droit d'admninistration du domaine). Ensuite, le serveur appartient au domaine. net join -I pdc.example.com -U Administrateur