Samba : Monter un controleur de domaine avec OpenLDAP

De Adadov.net wiki

Il y a de ça déjà quelques années j'avais écris une doc sur le wiki de fedora-fr.org sur l'installation d'un système OpenLDAP + Samba ...

Bon cette doc a pris un bon coup de vieux avec le temps et j'ai mis au point des méthodes bien plus précises, mais elle vallait le coup d'être citée et je mettrais quelques annotations quand j'aurais refais le tour.

Ecrit Par : DavidOlivier


Ce type de serveur permet de gérer l'authentification centralisée pour des clients Windows et Linux.

Configuration du serveur OpenLDAP

La configuration du serveur LDAP se fait par le fichier <path>/etc/openldap/slapd.conf</path>.
Nous utiliserons les informations suivantes pour créer l'architecture LDAP :
Les utilisateurs sont placés dans l'Unité d'Organisation (OU) Users. Les machines dans une OU Computers.

 #
 # See slapd.conf(5) for details on configuration options.
 # This file should NOT be world readable.
 #
 include	/etc/openldap/schema/core.schema
 include	/etc/openldap/schema/cosine.schema
 include	/etc/openldap/schema/inetorgperson.schema
 include	/etc/openldap/schema/nis.schema
 include	/etc/openldap/schema/samba.schema

On intègre les schémas samba et automount en plus des schémas par défaut.

 # Allow LDAPv2 client connections.  This is NOT the default.
 allow bind_v2
 
 pidfile	/var/run/openldap/slapd.pid
 argsfile	/var/run/openldap/slapd.args
 
 
 TLSCACertificateFile	/etc/pki/tls/certs/ca-bundle.crt
 TLSCertificateFile	/etc/pki/tls/certs/slapd.pem
 TLSCertificateKeyFile	/etc/pki/tls/certs/slapd.pem

Certificats pour l'utilisation de LDAP sur TLS/SSL (optionel).

 access to dn.children="ou=Users,dc=exemple,dc=com" \
   attrs=userPassword,shadowLastChange,sambaLMPassword,sambaNTPassword,sambaPwdLastSet
     by anonymous auth
     by * none
 
 access to dn.children="ou=Admins,dc=exemple,dc=com" \
   attrs=userPassword,shadowLastChange,sambaLMPassword,sambaNTPassword,sambaPwdLastSet
     by anonymous auth
     by * none
 
 access to dn.children="ou=Computers,dc=exemple,dc=com" \
   attrs=userPassword,shadowLastChange,sambaLMPassword,sambaNTPassword,sambaPwdLastSet
     by anonymous auth
     by * none
 
 access to *
     by self write
     by * read

On met en place des restrictions d'accès sur certains attributs de manière à ce que seuls les administrateurs LDAP et le titulaire de la fiche puissent écrire les attributs sensibles, et on bloque l'accès aux autres utilisateurs sur ces champs. L'accès à toutes les autres données de l'annuaire peut donc se faire de manière anonyme.(On peut sécuriser ça en venant forcer l'authentification des utilisateurs pour lire il suffit pour cela de remplacer :

 by * read

par

 by users read
 by anonymous auth
 #######################################################################
 # ldbm and/or bdb database definitions
 #######################################################################
 
 database	bdb
 suffix	"dc=exemple,dc=com"
 rootdn	"cn=Manager,dc=exemple,dc=com"
 rootpw	secret

rootdn et rootpw sont les informations de connexion du superutilisateur LDAP, rootpw peut (et doit) être chiffré dans le fichier, pour ce faire utiliser le programme slappasswd qui vous demandera le mot de passe et vous l'affichera dans le shell chiffré en SSHA il vous suffira ensuite de venir le coller comme valeur pour rootpw

 # The database directory MUST exist prior to running slapd AND
 # should only be accessible by the slapd and slap tools.
 # Mode 700 recommended.
 directory	/var/lib/ldap
 
 # Indices to maintain for this database
 index objectClass				eq,pres
 index ou,cn,mail,surname,givenname		eq,pres,sub
 index uidNumber,gidNumber,loginShell		eq,pres
 index uid,memberUid				eq,pres,sub

Il faut ensuite venir créer la racine de l'annuaire, ça peut être fait simplement à l'aide de la commande smbldap-populate contenue dans les smbldap-tools. Il est aussi possible de le faire à la main avec un fichier ldif de ce type :

 dn: dc=exemple,dc=com
 objectclass: top
 objectclass: dcObject
 objectclass: organization
 o: exemple
 dc: exemple
 description: Racine de l'annuaire

Configuration de samba

La configuration de Samba se fait dans le fichier <path>/etc/samba/smb.conf</path>

 [global]
 
 workgroup = EXEMPLE
 netbios name = SRV
 hosts allow = 192.168. 127.0.0
 log file = /var/log/samba/access.log
 log level = 1
 max log size = 10
 security = user
 encrypt passwords = true
 socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192
 dns proxy = no
 domain logons = Yes
 domain master = Yes
 preferred master = Yes
 os level = 66
 local master = Yes
 wins support = Yes
 guest account = nobody
 printing = cups
 printcap name = cups
 
 oplocks = No
 level2 oplocks = No
 kernel oplocks = No
 
 
 template shell = /bin/false
 winbind use default domain = no
 
 
 ;option LDAP
 passdb backend = ldapsam:ldap://127.0.0.1
 ldap suffix = dc=exemple,dc=com
 ldap machine suffix = ou=Machines
 ldap user suffix = ou=Users
 ldap group suffix = ou=Group
 ldap admin dn = "cn=Manager,dc=exemple,dc=com"
 
 ldap passwd sync = Yes
 enable privileges = Yes
 
 logon path = \\%L\profiles\%U
 
 # Table d'encodage des caractères (je fixe sur celui-là pour avoir le même que sous windows)
 Unix Charset = ISO8859-15 
 
 #SMBLDAP-TOOLS
 
 add user script = /usr/sbin/smbldap-useradd -m "%u"
 add machine script = /usr/sbin/smbldap-useradd -w "%u"
 add group script = /usr/sbin/smbldap-groupadd -p "%g"
 add user to group script = /usr/sbin/smbldap-groupmod -m "%u" "%g"
 delete user script = /usr/sbin/smbldap-userdel "%u"
 delete group script = /usr/sbin/smbldap-groupdel "%g"
 delete user from group script = /usr/sbin/smbldap-groupmod -x "%u" "%g"
 set primary group script = /usr/sbin/smbldap-usermod -g "%g" "%u"
 passwd program = /usr/sbin/smbldap-passwd -u %u
 
 
 admin users = @Administrators
 
 [netlogon]
   comment = Network Logon Service
   path = /home/netlogon
   guest ok = yes
   writable = no
   share modes = no
   browseable = no
 
 
 [profiles]
   path = /srv/profiles
   browseable = no
   guest ok = yes

Je ne vais pas détailler toutes les lignes de la configuration de Samba ce serait bien trop long, je vais donc seulement donner l'explication des lignes spécifiques à notre projet :

 domain logons = Yes
 domain master = Yes
 
 ;option LDAP
 passdb backend = ldapsam:ldap://127.0.0.1 

Adresse du serveur LDAP, on peut facilement en mettre plusieurs sur cette ligne pour faire une tolérance de panne

 ldap suffix = dc=exemple,dc=com
 ldap machine suffix = ou=Machines
 ldap user suffix = ou=Users
 ldap group suffix = ou=Group

Ce sont les chemins de recherche dans la base LDAP pour les différents éléments.

 ldap admin dn = "cn=Manager,dc=exemple,dc=com"

Le DN du Manager, l'utilisateur qui aura les pleins pouvoirs sur la base LDAP

 ldap passwd sync = Yes

ldap passwd sync fait en sorte que les mots de passe Windows et Linux soient toujours identiques.

 logon path = \\%L\profiles\%U

Chemin pour les profiles itinérants Windows %L est le LogonServer et %U le nom de l'utilisateur.


Il vous faudra ensuite venir donner à Samba le mot de passe du manager de l'annuaire afin qu'il puisse accéder librement aux données, ceci se fait à l'aide de la commande :

 smbpasswd -W

Création et gestion des comptes dans l'annuaire

C'est ici que commence la partie la plus pénible si on n'utilise pas de GUI, il faut maintenant venir peupler notre annuaire pour que les stations viennent chercher les informations utilisateurs dedans.
La manière la plus basique est de faire les utilisateurs à l'aide de fichier ldif et de venir les intégrer dans la base à l'aide des clients OpenLDAP.

Utilitaires OpenLDAP et fichiers LDIF

Un fichier LDIF type pour un utilisateur :

 dn: uid=user1,ou=Users,dc=example,dc=com
 cn: user1
 objectClass: top
 objectClass: account
 objectClass: posixAccount
 objectClass: shadowAccount
 uid: user1
 userPassword:: eMNoen1gVuZerulrbsFdre9PVAJRSIROSL3sS4LESS09
 uidNumber: 1000
 gidNumber: 1000
 homeDirectory: /home/ldap/user1
 loginShell: /bin/bash

Pour le userPassword vous pouvez le rentrer en clair ou crypté avec les protocoles CRYPT, SSHA ou MD5.
Un fois que vous avez entré ces quelques lignes dans un fichier quelquechose.ldif il ne vous reste plus qu'à introduire ces données dans l'annuaire, pour cela nous allons utiliser la commande :

 ldapadd -x -D cn=Manager,dc=exemple,dc=com -W -f quelquechose.ldif

L'utilitaire devrait vous demander un mot de passe entrez celui que vous avez mis comme rootpw dans votre fichier slapd.conf (ben oui on a mis le rootdn dans la commande).
Et voilà vous venez de rajouter un utilisateur dans votre annuaire vous devriez pouvoir faire su – user1 maintenant sur n'importe quel client bien configuré.

Les smbldap-tools

Ce sont de petits utilitaires qui permettent une gestion simplifiée des données de l'annuaire. Ils peuvent être utilisés pour gérer aussi bien les comptes Windows que les comptes Linux.

Configuration

Le fichier smbldap_bind.conf contient les informations de connexion qu'utiliseront les smbldap-tools donc de toute évidence il faut mettre ici un compte utilisateur qui a le droit de créer des entrées diverses dans la base LDAP, pour le moment nous mettrons le Manager, celui qui a tous les droits.
<path>/etc/smbldap/smbldap_bind.conf</path> :

 slaveDN="cn=Manager,dc=exemple,dc=com" 
 slavePw="secret" 
 masterDN="cn=Manager,dc=exemple,dc=com" 
 masterPw="secret"

Le fichier smbldap.conf, contient toute la configuration des tools à proprement parler, séparé en trois grandes parties : La configuration du domaine et l'accès au LDAP :

 # Le nom du domaine, s'il est non défini la valeur sera celle de samba 
 sambaDomain="EXEMPLE" 
  
 # Adresse du serveur LDAP esclave
 slaveLDAP="127.0.0.1" 
  
 # Adresse du serveur LDAP maitre 
 masterLDAP="127.0.0.1" 
  
 # Ne pas utiliser TLS pour sécuriser la connexion avec LDAP 
 ldapTLS="0" 
  
 # Suffixe LDAP (la racine de votre base LDAP) 
 # Ex: suffix=dc=IDEALX,dc=ORG 
 suffix="dc=exemple,dc=com" 
  
 # OU contenant les utilisateurs 
 usersdn="ou=Users,${suffix}" 
  
 # OU contenant les comptes ordinateurs (clients windows)
 computersdn="ou=Computers,${suffix}" 
  
 # OU contenant les groupes 
 groupsdn="ou=Group,${suffix}" 
  
 # OU idmap (utile uniquement en cas d'utilisation de plusieurs LDAP ) 
 idmapdn="ou=Idmap,${suffix}" 
  
 # Rechercher par défaut dans les sous OU aussi 
 scope="sub" 
  
 # Cryptage par défaut des mots de passe Linux
 # (CRYPT, MD5, SMD5, SSHA, SHA, CLEARTEXT) 
 hash_encrypt="SSHA" 
 La configuration des options par défaut Linux :
 # Shell par défaut
 userLoginShell="/bin/bash"
 
 # Chemin du répertoire home linux
 userHome="/home/ldap/%U"
 
 # Mode donné au Home lors de sa création
 userHomeDirectoryMode="700"
 
 # Commentaire par défaut
 userGecos="System User"
 
 # Groupe principal par défaut
 defaultUserGid="513"
 
 # Groupe principal par défaut pour un compte ORDINATEUR
 defaultComputerGid="515"
 
 # Répertoire modèle pour la création des nouveaux home
 skeletonDir="/etc/skel"
 
 # Nombre de jours maximum pour la validité du mot de passe
 defaultMaxPasswordAge="45"

La configuration des options par défaut Windows :

 # Partage à monter en tant que Home Drive à la connexion
 userSmbHome="%LOGONSERVER%\%U" 
 
 # Chemin du profil itinérant
 userProfile="%LOGONSERVER%\profiles\%U" 
 
 # Lettre à utiliser pour monter le Home Drive
 userHomeDrive="Z:" 
 
 # Nom du script d'ouverture de session (doit être dans le partage NETLOGON)
 userScript="logon.bat" 
 
 # Domaine par défaut de l'email
 mailDomain="exemple.com"
 
 # L'utilisateur peut changer son mot de passe 
 sambaPwdCanChange="1"

Utilisation

smbldap-useradd : le premier utilitaire et surement un des plus utilisé qui permet de venir ajouter des utilisateurs simplement dans la base LDAP avec les attributs POSIX et/ou SAMBA.

Cet utilitaire permet de mettre en place de nouveaux utilisateurs avec le parametrage de tous les attributs utiles de manière assez intuitive car la plupart des options de la ligne de commande sont similaires à celles de smbpasswd ou passwd.

 Usage: /usr/sbin/smbldap-useradd [-awmugdsckABCDEFGHMNPST?] username
   -o    ajoute l'utilisateur dans l'OU (relative au suffix utilisateur)
   -a    est un utilisateur Windows (sinon, uniquement POSIX)
   -b    est un utilisateur AIX
   -w    est une station de travail Windows
   -i    is a trust account (Windows Workstation)
   -u    uid
   -g    gid
   -G    groupes supplémentaires séparés par des virgules
   -n    ne pas créer de groupe
   -d    home
   -s    shell
   -c    commentaires
   -m    créer le répertoire home et copier /etc/skel
   -k    répertoire squelette (avec -m)
   -t    temps. attendre 'temps' secondes avant de quitter ( avec -w )
   -P    exécute smbldap-passwd après
   -A    peux changer le mot de passe ? 0 = non, 1 = oui
   -B    dois changer le mot de passe ? 0 = non, 1 = oui
   -C    sambaHomePath
   -D    sambaHomeDrive
   -E    sambaLogonScript (Script de login)
   -F    sambaProfilePath (Chemin du profil utilisateur)
   -H    sambaAcctFlags (Bits de contrôle de compte Samba)
   -N    surnom
   -S    nom de famille
   -M    adresses email locales (séparées par des virgules)
   -T    adresse email de transfert
   -?    affiche ce message d'aide

smbldap-passwd : Définir ou redéfinir le mot de passe d'un utilisateur

 Usage: /usr/sbin/smbldap-passwd [options] [username] 
   -h, -?, --help show this help message 
   -s             update only samba password 
   -u             update only UNIX password 

smbldap-userdel : Supprimer un utilisateur

 Usage: /usr/sbin/smbldap-userdel [-r?] username 
   -r    remove home directory 
   -R    remove home directory interactively 

smbldap-usermod : Permet de modifier simplement et rapidement les options d'un utilisateur avec les mêmes fonctions que smbldap-useradd.

 Usage: /usr/sbin/smbldap-usermod [-awmugdsckABCDEFGHIPSMT?h] username 
 Available options are: 
   -c    gecos 
   -d    home directory 
   -r    new username (cn, sn and dn are updated) 
   -u    uid 
   -o    uid can be non unique 
   -g    gid 
   -G    supplementary groups (comma separated) 
   -s    shell 
   -N    canonical name 
   -S    surname 
   -P    ends by invoking smbldap-passwd 
  For samba users: 
   -a    add sambaSAMAccount objectclass 
   -e    expire date ("YYYY-MM-DD HH:MM:SS") 
   -A    can change password ? 0 if no, 1 if yes 
   -B    must change password ? 0 if no, 1 if yes 
   -C    sambaHomePath (SMB home share, like '\\PDC-SRV\homes') 
   -D    sambaHomeDrive (letter associated with home share, like 'H:') 
   -E    sambaLogonScript (DOS script to execute on login) 
   -F    sambaProfilePath (profile directory, like '\\PDC-SRV\profiles\foo') 
   -H    sambaAcctFlags (samba account control bits like '[NDHTUMWSLKI]') 
   -I    disable an user. Can't be used with -H or -J 
   -J    enable an user. Can't be used with -H or -I 
   -M    mailAddresses (comma separated) 
   -T    mailToAddress (forward address) (comma separated) 
   -?|-h show this help message 

smbldap-group* : on retrouve les mêmes commandes que pour les utilisateurs mais qui eux agissent comme leur nom l'indique sur les groupes.

smbldap-populate : cette commande n'est utilisée qu'une seule fois normalement au moment où vous venez de finir la configuration de votre serveur LDAP pour créer la base le l'architecture. Une fois que le serveur LDAP et les smbldap-tools sont configurés exécutez cette commande pour que les OU et la base de l'annuaire soient créés automatiquement en fonction des paramètres définis dans la configuration des smbldap-tools.

Configuration des clients Linux

Nous avons donc trois endroits où modifier la configuration :

Configuration PAM

La configuration de PAM se fait sous Fedora ,pour les options à appliquer sur tout le système, dans le fichier <path>/etc/pam.d/system-auth</path> :

 auth		sufficient	pam_ldap.so use_first_pass
 account	[default=bad success=ok user_unknown=ignore] pam_ldap.so
 password	sufficient	pam_ldap.so use_authtok
 session	optional	pam_ldap.so

Vous pouvez constater que l'on retrouve le module pam_ldap.so dans les 4 sections.

Client LDAP

Il est préférable de modifier ce fichier à la main pour vraiment savoir ce que l'on met dedans de plus certaines distributions intègrent des outils pour faciliter la configuration de ces fichiers mais pas toutes.
Voilà un fichier /etc/ldap.conf en exemple :

 host ldap1.example.com
 base dc=example,dc=com
 ldap_version 3
 port 389
 scope one
 pam_filter objectclass=posixaccount
 pam_login_attribute uid
 pam_member_attribute gid
 pam_password crypt
 nss_base_passwd ou=Users,dc=example,dc=com
 nss_base_shadow ou=Users,dc=example,dc=com
 nss_base_group ou=Group,dc=example,dc=com
 bind_policy soft

Dans ce fichier il faudra modifier la ligne scope one par scope sub si l'on utilise des sous-OU.

Mais il vous faudra aussi modifier le fichier <path>/etc/openldap/ldap.conf</path> pour que tous les utilitaires fonctionnent
Voilà un fichier <path>/etc/openldap/ldap.conf</path> en exemple :

BASE dc=example,dc=com
URI ldap://ldap1.example.com/

Configuration NSS

La configuration de NSS est vraiment simple à comprendre et à arranger comme on le souhaite, il suffit de chercher dans le fichier <path>/etc/nsswitch.conf</path> les lignes pour les bases de données que l'on souhaite voir utiliser LDAP et de venir rajouter à la fin de la ligne « ldap » tout simplement. Ce qui nous donnera dans le cas de l'authentification des utilisateurs les lignes suivantes :

 passwd:	files ldap
 shadow:	files ldap
 group:		files ldap

L'attribut files en début de ligne spécifie qu'il doit d'abord chercher dans les fichiers en local et venir compléter ses informations avec LDAP. Nous pouvons aussi voir les autres lignes et ajouter LDAP à certaines suivant les informations que nous voulons dans notre annuaire.

Pour éviter les requêtes trop nombreuses
{{{texte}}}

Configuration des clients Windows

Création du compte ordinateur

La méthode la plus simple est d'utiliser les smbldap-tools pour le faire, il vous suffira de taper la commande suivante :

 smbldap-useradd -w NomOrdinateur$
Le nom du compte
{{{texte}}}

Ajout de l'ordinateur Windows dans le domaine

De ce coté-là aussi ça donne dans la simplicité, si tout a été bien configuré cette étape devrait se faire en moins de 5 minutes.
L'option qui nous intéresse est un peu cachée, il faut aller dans :

  • Panneau de configuration
  • Système
  • Onglet nom de l'ordinateur
  • Modifier

Une fois dans cette petite boîte de dialogue tout est relativement facile, en haut vous trouverez une case contenant le nom actuel de l'ordinateur et en bas deux cases avec un bouton radio pour activer l'une ou l'autre. Il faut activer la case « Domaine » et dedans vous viendrez saisir le nom que vous avec donné à votre domaine dans la configuration de Samba ( ici EXEMPLE ).
Windows vous demandera alors de saisir des informations d'identification veillez à bien saisir un nom d'utilisateur et un mot de passe ayant les droits administrateurs sur le domaine.
Une fois que Windows vous aura confirmé l'entrée dans le domaine il vous restera seulement à redémarrer, une fois arrivé sur la boite d'ouverture de session Windows vous pourrez constater la présence d'une liste de choix en bas, sélectionnez le nom du domaine et entrez les informations d'identification d'un utilisateur du domaine.
Vous voilà maintenant avec une station qui peux utiliser les différents comptes utilisateurs de votre base LDAP.

Quelques trucs pouvant aider

Impossible de se connecter en tant que root

Vous avez fait une erreur dans votre configuration PAM ou dans le fichier <path>/etc/ldap.conf</path> des PAM et/ou NSS ? Pas de panique, vous pouvez peut-être vous en sortir sans devoir redémarrer en ajoutant à votre annuaire l'objet suivant :

 dn: uid=root,ou=Admins,dc=example,dc=com
 cn: root
 objectClass: top
 objectClass: account
 objectClass: posixAccount
 objectClass: shadowAccount
 uid: root
 uidNumber: 0
 gidNumber: 0
 userPassword:: eMNoen1gVuZerulrbsFdre9PVAJRSIROSL3sS4LESS09
 homeDirectory: /root
 loginShell: /bin/bash

N'oubliez pas de changer le mot de passe avant l'insertion dans l'annuaire. Cela ne fonctionne bien évidemment que s'il n'a pas été spécifié d'uid minimal définissable par LDAP. Sinon, un reboot en single-user voire un CD de secours s'impose...
Dans ces cas-là, toujours conserver un terminal root dans un coin pour pouvoir modifier la configuration entre deux tests qui font échouer un su - root ou un ssh root@localhost.


Documentation que vous pourrez retrouver là : Configuration d'un serveur d'authentification Openldap Samba