Serveur OpenLdap pour authentification de client Windows

Préambule

Notre projet est basé sur deux machines virtuelles installées sur VirtualBox:

  • Un Serveur OpenLdap sur une distribution Debian 5.0.4 ayant une interface pour une connexion internet et une interface pour notre LAN avec IP fixe 172.16.1.1/24.
  • Un Client Windows sur le même LAN ayant comme IP 172.16.1.2/24.

Notre Serveur OpenLdap, basé sur une distribution Linux, nous permettra d'authentifier des utilisateurs Windows, et de permettre à ces derniers, via un contrôleur de domaine (PDC) Samba, de partager des fichiers, de créer des profils itinérant, ainsi qu'exécuter des scripts.

Nota Bene:
Certains paramètres de fichier de configuration, présents par défaut, n'ont pas tous été affichés et ce volontairement.
Seuls ceux qui sont explicites ou qui ont été modifiés seront présentés.

1. C'est quoi LDAP ?

LDAP ( Lightweight Access Directory Protocol) est un protocole reposant sur TCP/IP qui permet d'interroger et modifier des services d'annuaire.
Un service d'annuaire est une sorte de base de données électroniques permettant de définir des utilisateurs, des groupes, des applications, des ressources, etc… mais contrairement à une base de données, l’organisation des données n’est pas relationnelle mais hiérarchique, c'est à dire telle une arborescence.
Ainsi, grâce à son annuaire, LDAP sera capable de gérer de manière souple un grand nombre de données le rendant bien adapté pour le monde d'Entreprise.
Mais surtout, ce qui fait sa force, est qu'il offre un support d'authentification qui centralise tous les utilisateurs pour un grand nombre de services.

2. les outils nécessaires

  • Un Serveur LDAP (OpenLdap)
  • Un serveur Samba
  • Différents packages tels que : samba-doc, smbldap-tools, libnss-ldap, libpam-ldap
  • Une multitude de fichiers à configurer représentés ci -dessous:
/etc
   |     /ldap
   |       |       -slapd.conf
   |       |       -ldap.conf
   |       |
   |     /samba
   |       |       -smb.conf
   |       |
   |     /smbldap-tools
   |       |       -smbldap.conf
   |       |       -smbldap_bind.conf
   |       |      
   |     /libnss-ldap.conf
   |       |      
   |     /nsswitch.conf
   |       |                
   |     /pam_ldap.conf
   |       |
   |     /pam.d
   |       |      -common-account
   |       |      -common-auth
   |       |      -common-password
   |       |      -common-session

3. Réalisation du Projet

3.1 Configuration de OpenLdap

—-> debian:/# aptitude install slapd ldap-utils
On installe les paquets du serveur OpenLdap et une série de questions nous sont posées afin d'éditer automatiquement le fichier slapd.conf comme:

DNS domain name :  LDAPDebian.uccle
Organisation name :  uccle
Administrator password:  rootldap
Allow LDAPv2 protocol:  no
  • LDAPDebian.uccle correspond à dc=LDAPDebian,dc=uccle contenu dans slapd.conf, définissant notre Domaine LDAP relatif à notre annuaire.
  • rootldap est le mot de passe de l'administrateur qui aura tous les droits sur l'annuaire.

—-> debian:/# aptitude install samba-doc
Comme LDAP fonctionne avec des schémas, il faudra utiliser le schéma Samba pour qu'il s'intègre à OpenLdap et celui-ci est contenu dans le package samba-doc.
Le schéma décrit les classes d’objets, leurs types d’attributs et leur syntaxe.
Une entrée dans l’annuaire peut être composée d’une ou plusieurs classes d’objets.

—-> debian:/# gunzip -c /usr/share/doc/samba-doc/examples/LDAP/samba.schema.gz > /etc/ldap/schema/samba.schema
Cette commande "dezipe" le schéma Samba pour l'associer à LDAP.

—-> debian:/# slappasswd
Cette commande va nous permettre de crypter le mot de passe rootldap du domaine LDAP (LDAPDebian.uccle) spécifié plus haut.
La clé cryptée obtenue, devra être ajoutée dans le fichier slapd.conf présenté ci-dessous à la ligne rootpw.

New password:  rootldap
Re-enter new password:  rootldap
 {SSHA}ehGV6dF+ufqibXdpZDkFfXtim8xc3gii

—-> debian:/# vim /etc/ldap/slapd.conf
Ce fichier permet de configurer le serveur OpenLdap.
Il faudra vérifier si le nom de domaine (dc=LDAPDebian,dc=uccle) est bien édité suite aux questions posées à l'installation du paquet.
Ensuite, on y inclut le schéma Samba en informant le path: include /etc/ldap/schema/samba.schema
Ainsi que le nom complet de l'administrateur du domaine (rootdn), et le mot de passe que l'on a crypté (rootpw).
(voir fichier)

—-> debian:/# vim /etc/ldap/ldap.conf
Ce fichier configure le client LDAP afin qu'il puisse communiquer avec le serveur LDAP.
On y indique le domaine LDAP , ainsi que le nom du serveur et le numéro de port (n° 389) que le client devra contacter.

# LDAP Defaults
# This file should be world readable but not world writable.
# 
BASE    dc=LDAPDebian,dc=uccle
URI     ldap://LDAPDebian.uccle:389

#SIZELIMIT      12
#TIMELIMIT      15
#DEREF          never

—-> debian:/# etc/init.d/slapd start
Démarrage du serveur OpenLdap

3.2 Configuration de Samba

-> debian:/# aptitude install samba smbclients smbfs
On installe les paquets du serveur Samba

—-> debian:/# vim /etc/samba/smb.conf
On configure le serveur Samba afin qu'il utilise LDAP pour l'authentification.
Des explications sont mises en commentaire dans ce fichier.

—-> debian:/home# mkdir -p netlogon partage export/profile
On crée ces répertoires que l'on a mentionnés dans la section PARTAGE du fichier smb.conf.
Il est important, par la suite, de donner les droits en écriture dessus à l'aide de la commande chmod.

  • netlogon = va permettre d'utiliser des scripts (.bat) qui seront exécutés à la connexion de session Windows
  • partage = permet le partage entre les utilisateurs du domaine
  • export/profile = permet de stocker les profils itinérants de Windows

—-> debian:/# aptitude install smbldap-tools
Ce paquet contient des commandes pour faciliter considérablement l'administration des données relatives aux User et Group se trouvant dans la base LDAP et ce via Samba.
Ces commandes (scripts) moins complexes que les commandes natives de LDAP vont nous permettre d'interroger, d'ajouter, modifier, supprimer des entrées dans notre annuaire.
Une série d'attributs, pour chacune d'elles, peut être consultée avec un "-?"

smbldap-useradd        = ajoute un utilisateur ou une machine
smbldap-userdel        = supprime un utilisateur
smbldap-usermod        = modifie une information d'un utilisateur
smbldap-usershow       = montre les informations sur l'utilisateur
smbldap-passwd         = ajoute ou change le mot de passe d'un utilisateur enregistré      
smbldap-groupadd       = ajoute un groupe
smbldap-groupdel       = supprime un groupe
smbldap-groupmod       = modifie une information d'un groupe
smbldap-groupshow      = montre les informations sur un groupe
smbldap-populate       = créer l'arborescence de base de l'annuaire (ceci est expliqué plus loin)

—-> debian:/# vim /etc/smbldap-tools/smbldap_bind.conf
Ce fichier, que l'on a créé, indique à Samba, le DN de l'administrateur LDAP, ainsi que son mot de passe afin de permettre aux différentes commandes smbldap-tools, citées ci-dessus, d'être autorisées à interagir dans l'annuaire LDAP.
Le DN (Distinguished Name) référence de manière unique une entrée dans l'annuaire tel un chemin absolu dans une arborescence de fichier.
Etant donné que le mot de passe est en clair, il faudra restreindre les droits sur ce fichier avec la commande chmod 600.

slaveDN="cn=admin,dc=LDAPDebian,dc=uccle"
slavePw=rootldap
masterDN="cn=admin,dc=LDAPDebian,dc=uccle"
masterPw=rootldap

—-> debian:/# vim /etc/smbldap-tools/smbldap.conf
Il s'agit d'un fichier créé, que l'on configure pour faire interagir les commandes smbldap-tools avec LDAP.
Des explications sont présentes dans le fichier.

—-> debian:/# smbpasswd -w rootldap
-w = LDAP admin password
Cette commande permet à Samba de stocker le mot de passe en crypté dans /var/lib/samba/secrets.tdb.
Ainsi, cela lui permettra de connaitre le mot de passe de l'administrateur du domaine LDAP (= rootldap) afin de pouvoir communiquer avec le serveur OpenLdap, pour que ce dernier authentifie les clients windows.

Setting stored password for "cn=admin,dc=LDAPDebian,dc=uccle" in secrets.tdb

—-> debian:/# net getlocalsid
Si tout à été configuré correctement, cette commande doit afficher l'identificateur du domaine LDAP que Samba utilisera pour se joindre à lui.

SID for domain LDAPDEBIAN is: S-1-5-21-2331648707-682641928-4289532602

—-> debian:/# etc/init.d/samba start
Démarrage du service Samba

—-> debian:/# smbldap-populate
Pour créer l'arborescence de l'annuaire LDAP, on pourrait utiliser des fichiers texte au format .ldif mais cela peut devenir fastidieux.
En exécutant la commande smbldap-populate, celle-ci va créer automatiquement une architecture de base de l'annuaire comme:

  • Les différentes OU (Unité Organisationelle) qui contiendront les machines, utilisateurs et Groupes.
  • Des comptes , crées par défaut, nécessaires pour la gestion d'un domaine tel que Print Operators, Backup Operators, etc…
  • Deux UID : root et nobody qui seront dans OU = Users indispensables pour accéder à l'annuaire.
  • Plusieurs CN (Common Name): nom d'utilisateur ou de groupe.
Populating LDAP directory for domain testldap  (S-1-5-21-2331648707-682641928-4289532602)
(using builtin directory structure)

entry dc=LDAPDebian,dc=uccle already exist. 
entry ou=Users,dc=LDAPDebian,dc=uccle already exist. 
entry ou=Groups,dc=LDAPDebian,dc=uccle already exist. 
entry ou=Machines,dc=LDAPDebian,dc=uccle already exist. 
entry ou=Idmap,dc=LDAPDebian,dc=uccle already exist. 
entry uid=root,ou=Users,dc=LDAPDebian,dc=uccle already exist. 
entry uid=nobody,ou=Users,dc=LDAPDebian,dc=uccle already exist. 
entry cn=Domain Admins,ou=Groups,dc=LDAPDebian,dc=uccle already exist. 
entry cn=Domain Users,ou=Groups,dc=LDAPDebian,dc=uccle already exist. 
entry cn=Domain Guests,ou=Groups,dc=LDAPDebian,dc=uccle already exist. 
entry cn=Domain Computers,ou=Groups,dc=LDAPDebian,dc=uccle already exist. 
entry cn=Administrators,ou=Groups,dc=LDAPDebian,dc=uccle already exist. 
entry cn=Account Operators,ou=Groups,dc=LDAPDebian,dc=uccle already exist. 
entry cn=Print Operators,ou=Groups,dc=LDAPDebian,dc=uccle already exist. 
entry cn=Backup Operators,ou=Groups,dc=LDAPDebian,dc=uccle already exist. 
entry cn=Replicators,ou=Groups,dc=LDAPDebian,dc=uccle already exist. 
entry sambaDomainName=testldap ,dc=LDAPDebian,dc=uccle already exist. Updating it...

Please provide a password for the domain root: 
Changing UNIX and samba passwords for root
New password: 
Retype new password:

Si l'arborescence se crée sans warning, on vous invite à taper 2 fois le mot de passe du domaine LDAP c'est à dire "rootldap".

3.3 Authentification via l'annuaire LDAP

Cette étape est la plus délicate, car une mauvaise configuration, pourrait mener à ne plus pouvoir entrer dans le système et ce, quel que soit le compte (Local ou Global).
Dans un système Linux, l'authentification se fait au travers de NSS et PAM.
Ces 2 modules, étant assez flexibles, vont permettre de signaler à l'OS, quelles informations il devra utiliser pour l'authentification.
Donc, dans notre cas, pour authentifier via un annuaire LDAP, il faudra ajouter le support LDAP à NSS et à PAM en installant 2 librairies: libnss-ldap et libpam-ldap.

3.3.1 NSS

NSS (Name Service Switch) permet d'indiquer où trouver les sources afin de réunir les informations sur les utilisateurs.
Par exemple NIS, /etc/passwd, LDAP, etc…

—-> debian:/# aptitude install libnss-ldap
On installe le paquet de LDAP pour NSS.

—-> debian:/# vim /etc/libnss-ldap.conf
Laisser ce fichier par défaut, sauf pour les 4 lignes suivantes qu'il faudra soit dé-commenter ou reformuler la syntaxe:

host 127.0.0.1
ldap_version 3
base dc=LDAPDebian,dc=uccle
uri ldapi://127.0.0.1/
bind_policy soft
  • bind_policy soft va permettre de ne pas faire des demandes répétées, si un client n'arrive pas à contacter le serveur LDAP, car il pourrait se bloquer. Par défaut, c'est hard.

—-> debian:/# vim /etc/nsswitch.conf
Ce fichier indique à NSS où aller chercher les informations sur les utilisateurs à authentifier.
Nous utilisons la syntaxe "files ldap" dans ce fichier:

  • "files" indique que pour les utilisateurs Locaux, les informations seront recueillies dans les fichiers: /etc/passwd-group-shadow.
  • "ldap" indique que pour les utilisateurs Globaux, les informations seront recueillies dans l'annuaire LDAP.
# /etc/nsswitch.conf
#
passwd:         files ldap
group:          files ldap
shadow:         files ldap

#hosts:          files mdns4_minimal [NOTFOUND=return] dns mdns4
hosts:          files dns ldap
networks:       files ldap

protocols:      db files
services:       db files
ethers:         db files
rpc:            db files

netgroup:       nis

3.3.2 PAM

PAM (Pluggable Authentication Module), suivant les informations récoltées par NSS, est chargé de valider un utilisateur en fonction de la méthode d'authentification choisie.
Les méthodes choisies peuvent être: la carte à puce, biométrie, etc/passwd tout simplement, l'annuaire LDAP dans notre cas, ainsi que bien d'autre.

—-> debian:/# aptitude install libpam-ldap
On installe le paquet de LDAP pour PAM.

—-> debian:/# vim /etc/pam_ldap.conf
Laisser ce fichier par défaut, sauf pour les 4 lignes suivantes qu'il faudra soit dé-commenter ou reformuler la syntaxe:

host 127.0.0.1
ldap_version 3
base dc=LDAPDebian,dc=uccle
uri ldapi://127.0.0.1/
rootbinddn cn=admin,dc=LDAPDebian,dc=uccle
pam_password crypt

—-> debian:/# cd /etc/pam.d/
Le répertoire pam.d comporte plusieurs fichier "common-………" où il faudra ajouter en 1ère ligne " sufficient pam_ldap.so" afin de signifier d'utiliser l'authentification LDAP d'abord.

Nous avons dù configurer les 4 fichiers de pam.d suivant:

………………………….1°/ —-> debian:/# vim /etc/pam.d/common-account
Ce fichier vérifie que le mot de passe n'a pas expiré, ou que l'utilisateur a bien accès au service concerné.

# /etc/pam.d/common-account - authorization settings common to all services
#
account sufficient      pam_ldap.so
account required        pam_unix.so nullok_secure try_first_pass

………………………….2°/ —-> debian:/# vim /etc/pam.d/common-auth
Ce fichier vérifie l'identité de l'utilisateur c'est à dire la demande et la vérification d'un mot de passe.

# /etc/pam.d/common-auth - authentication settings common to all services
#
auth sufficient pam_ldap.so
auth required pam_unix.so nullok_secure try_first_pass

………………………….3°/ —-> debian:/# vim /etc/pam.d/common-password
Ce fichier est étroitement lié au fichier common-auth, et consiste en la mise à jour des processus d'authentification, comme par exemple la gestion du nouveau mot de passe lorsqu'un utilisateur désire changer le sien.

# /etc/pam.d/common-password - password-related modules common to all services
#
password   sufficient pam_ldap.so
password   required   pam_unix.so nullok obscure md5  try_first_pass

………………………….4°/ —-> debian:/# vim /etc/pam.d/common-session
Ce fichier prend en compte toutes les tâches à effectuer avant que l'utilisateur accède ou se retire d'un service afin de l'autoriser ou non.
# /etc/pam.d/common-session - session-related modules common to all services
#
session required pam_mkhomedir.so skel=/etc/skel/ umask=0026
session required pam_limits.so
session required pam_unix.so
session optional pam_mount.so
session optional pam_ldap.so

3.4 Ajout dans l'annuaire LDAP

—-> debian:/# smbldap-useradd -am jojo
-a = ajoute un utilisateur windows spécifiquement.
-m = crée un répertoire pour l'utilisateur jojo dans /home.

—-> debian:/# smbldap-passwd jojo
On demande d'ajouter un mot de passe pour l'utilisateur jojo et une invite nous demande de saisir 2 fois le mot de passe.

—-> debian:/# smbldap-useradd -w win2000$
-w = ajoute le nom de machine windows (=nom Netbios).
$ = indique que c'est une machine windows. Même si on oublie d'ajouter ce caractère manuellement, celui-ci sera ajouté automatiquement grâce à -w.

—-> debian:/# getent passwd
Cette commande permet de lister les différents utilisateurs et machines présents dans l'annuaire.
Donc, ces derniers, devront impérativement être présents pour pouvoir être authentifiés et ce par LDAP.


La sortie de la commande nous montre:
  • Les comptes présent par défaut crées lors de la conception de l'annuaire.
  • Ainsi que l'utilisateur windows jojo et la machine win2000 que nous avons rajouter manuellement.

3.5 Redémarrage des services

—-> debian:/# /etc/init.d/samba restart
Pour un bon fonctionnement de Samba, vérifier que les 2 démons nmdd et smbd tournent.

Stopping Samba daemons: nmbd smbd.
Starting Samba daemons: nmbd smbd.

—-> debian:/# /etc/init.d/slapd restart

Stopping OpenLDAP: slapd.
Starting OpenLDAP: slapd.

NB: Bien que nous avions déjà démarré ces services, nous les relançons pour s'assurer tout bon fonctionnement

3.6 Vérification des ports en écoute

—-> debian:/# netstat -ano | grep tcp

tcp        0      0 0.0.0.0:389                0.0.0.0:*                 LISTEN     
tcp        0      0 127.0.0.1:389           127.0.0.1:33867         ESTABLISHED 
tcp        0      0 127.0.0.1:389           127.0.0.1:33868         ESTABLISHED 
tcp        1      0 127.0.0.1:51889         127.0.0.1:389           CLOSE_WAIT  
tcp        0      0 127.0.0.1:33868         127.0.0.1:389           ESTABLISHED 
tcp6       0      0 :::389                      :::*                        LISTEN      
tcp6       0      0 :::139                      :::*                        LISTEN      
tcp6       0      0 ::1:631                     :::*                        LISTEN      
tcp6       0      0 :::445                      :::*                         LISTEN

"389" = service OpenLdap.
"139" = service de session NetBios pour l'echange de message en mode connecté.
"445" = service CIFS pour la résolution de noms basés sur DNS dynamique et non NetBios

—-> debian:/# netstat -ano | grep udp

udp        0      0 172.16.1.1:137          0.0.0.0:*                          
udp        0      0 192.168.1.3:137         0.0.0.0:*                           
udp        0      0 0.0.0.0:137                 0.0.0.0:*                           
udp        0      0 172.16.1.1:138          0.0.0.0:*                           
udp        0      0 192.168.1.3:138         0.0.0.0:*                           
udp        0      0 0.0.0.0:138                 0.0.0.0:*

"137" = service nmbd (Samba) pour la résolution de nom NetBios.
"138" = service smbd (Samba) pour le partage de fichiers et imprimantes.

4. Connexion du Client Windows

1°/ Régler l'interface sur le même LAN que notre serveur LDAP => 172.16.1.2
2°/ Se connecter en tant qu'administrateur.
3°/ Poste de travail/Propriété
…………Onglet "identificateur réseau"/Modifier
…………Introduire: nom de machine = win2000
…………Introduire: nom de domaine = testldap (c'est celui du PDC Samba définit dans smb.conf à la ligneworkgroup = testldap)

Si "testldap" est reconnu comme un nom de domaine existant, un login et un mot de passe sera demandé.

4°/ On introduit le login = root et mot de passe = rootldap
Attention: Il est possible qu'à la 1ère tentative cela ne fonctionne pas, apparemment pour des raisons de mise en cache. A la 2ième tentative, cela devrait rentrer dans l'ordre.

NB: Cliquer sur l'image pour l'agrandir
ldap013.bmp

5°/ Si l'authentification à réussi, un message de bienvenue dans le domaine apparait.

ldap014.bmp

6°/ On redémarre.
7°/ On introduit le login et mot de passe de l'utilisateur jojo ajouté dans l'annuaire précédemment, en choississant de se connecter au domaine "testldap".
Ainsi, nous ouvrons la session de jojo.

ldap015.bmp

5. Astuce

1°/ NSCD est un service qui met en cache les résultats des requêtes LDAP.
Dans les grandes Entreprises, lorsque le serveur OpenLdap sera fort sollicité, la mise en cache des requêtes pourra l'aider à se soulager.

  • Installation du service : aptitude install nscd
  • Démarrage du service se fait par /etc/init.d/nscd start
  • Son fichier de configuration : /etc/nscd.conf

2°/ IL EST TRES IMPORTANT de toujours faire une copie des originaux des fichiers NSS et PAM avant toute manipulation de ceux-ci.
En effet, une mauvaise configuration de ces fichiers, conduira au fait que l'on ne pourra plus s'authentifier, même avec notre utilisateur local.
Si cela devait tout de même arriver:

  • Soit on redémarre avec un Live CD et on remet les configuration NSS/PAM originales.
  • Soit on utilise le mode "single-user mode" que propose notre distribution Debian au démarrage et on remet les configurations NSS/PAM originales.

3°/ dpkg-reconfigure debconf: Cette commande permet, lors de l'installation d'un paquet, de choisir son mode d'installation: Critical - High - Medium - Low.
Suivant le mode choisi, des multitudes de questions ou bien peu ou aucune, nous seront posées, afin de pré-éditer ou non les fichiers correspondant au paquet.

4°/ Pour la connexion au domaine: il est fortement possible de devoir effectuer 2 tentatives pour se connecter (voir plus haut)
5°/ Pour la connexion d'un utilisateur à sa session: si la connexion ne s'établit pas, il est possible qu'il faudra redémarrer le système de la machine Debian. Pour nous, cela a été le cas. (N.B: seulement si ce n'est pas un problème dans les configurations).

6. Bibliographie

http://www.supinfo-projects.com/fr/2004/auth_unix_windows_ldap/2/
http://www.vogelweith.com/debian_server/050_openldap.php
http://www.com.univ-mrs.fr/ssc/sic/IMG/pdf/ldap_au_com.pdf
http://cjt.eljako.org/doc/samba3ldap.php
http://arnofear.free.fr/linux/template.php?tuto=2&page=2
http://contribs.martymac.org/samba2.2-Ldap/html/5/
http://doc.fedora-fr.org/wiki/Configuration_d%27un_serveur_d%27authentification_Openldap_Samba (Pour Fedora, mais peut offrir une petite aide pour Debian)

Sauf mention contraire, le contenu de cette page est protégé par la licence Creative Commons Attribution-ShareAlike 3.0 License