Accueil
Rechercher:
sur developpez.com sur les forums
Forums | Tutoriels | F.A.Q's | Participez | Hébergement | Contacts
Accueil Conception Java DotNET Visual Basic  C  C++ Delphi MS-Office SQL & SGBD Oracle  4D  Business Intelligence
Club Emploi Blogs   TV   Dév. Web PHP XML Python Autres 2D-3D-Jeux Sécurité Windows Linux PC Mac
ACCUEIL BSD FORUM BSD TUTORIELS BSD LIVRES BSD SYSTEMES BSD BSD TV UNIX

Serveur d'authentification basé
sur un annuaire LDAP

Date de publication : 08/08/2006 , Date de mise à jour : 17/10/2006

Par julp (Autres articles)
 

LDAP permet la centralisation de l'authentification et ce quelque soit le service proposé (ftp, ssh, boîte mail, ...). Outre l'avantage de la centralisation, les utilisateurs ne possèdent qu'un seul mot de passe pour accéder à l'ensemble des services qui leur sont offerts.

Cet article se limite à la mise en place de l'authentification système basée sur LDAP pour des systèmes Linux et FreeBSD.


1. Mise en place du serveur LDAP
1.1. Installation d'OpenLDAP
1.2. Configuration du serveur LDAP
1.3. Configuration du client LDAP
1.4. Paramétrage du pare-feu
2. Configuration des clients
2.1. Définitions
2.1.1. PAM
2.1.2. NSS
2.2. Cas d'un client Linux
2.2.1. Installation des modules PAM et NSS
2.2.2. Configuration de PAM
2.2.2.1. Autoriser les utilisateurs LDAP à s'authentifier sur la machine
2.2.2.2. Autoriser les utilisateurs LDAP à utiliser SSH
2.2.3. Configuration de NSS
2.3. Cas d'un client FreeBSD
2.3.1. Installation des modules PAM et NSS
2.3.2. Configuration de PAM
2.3.2.1. Autoriser les utilisateurs LDAP à s'authentifier sur la machine
2.3.2.2. Autoriser les utilisateurs LDAP à utiliser SSH
2.3.3. Configuration de NSS
3. Phase de test
3.1. Le jeu de test
3.2. Démarrage du serveur LDAP
3.3. Test de l'authentification
4. Autoriser le changement de mot de passe avec la commande passwd
4.1. Modification de la configuration du serveur LDAP
4.2. Configuration des clients FreeBSD
4.3. Configuration des clients Linux
Remerciements


1. Mise en place du serveur LDAP


1.1. Installation d'OpenLDAP

Installation directe de l'annuaire, le système de ports s'occupera pour nous des dépendances :
cd /usr/ports/net/openldap<version>-server
# On procède à l'installation
make install

# Création de liens symboliques nécessaires au bon fonctionnement du client LDAP
ln -s /usr/local/etc/openldap/ldap.conf /usr/local/etc/ldap.conf
ln -s /usr/local/etc/openldap/ldap.conf /etc/ldap.conf
info Prenez dans la mesure du possible la dernière version disponible.

1.2. Configuration du serveur LDAP

Pour plus de commodités, nous allons démarrer le serveur LDAP au démarrage de la machine. Pour cela rajouter les lignes ci-dessous dans votre fichier /etc/rc.conf :
# LDAP
slapd_enable="YES"
slapd_flags="-h ldap://<votre adresse IP réseau>" # Ou plus simplement : slapd_flags="-h ldap:///"
Vous trouverez ci-dessous le fichier de configuration du serveur LDAP (/usr/local/etc/openldap/slapd.conf) commenté. Nous supposerons que la racine du serveur LDAP est dc=developpez,dc=com.
# Schémas de base
include        /usr/local/etc/openldap/schema/core.schema
# Schémas requis pour les comptes Posix
include        /usr/local/etc/openldap/schema/cosine.schema
include        /usr/local/etc/openldap/schema/inetorgperson.schema
include        /usr/local/etc/openldap/schema/nis.schema

# Fichiers nécessaires au bon fonctionnement de LDAP
pidfile        /var/run/openldap/slapd.pid
argsfile       /var/run/openldap/slapd.args

##### Les règles d'accès aux données (ou ACL pour les intimes) #####
# Accès restreint aux mots de passe pour éviter les attaques même s'ils sont hashés (attaques par dictionnaire)
access to attr=userPassword
    by dn="cn=manager,dc=developpez,dc=com" write
    by dn="cn=proxyuser,dc=developpez,dc=com" read
    by self write
    by anonymous auth
    by * none

# Sans cette ACL un utilisateur pourrait usurper toute identité en modifiant son uid 
# (Qui a un uid égal à zéro ? root bien sûr !)
# C'est pourquoi tout le monde peut le lire mais seulement le LDAP manager peut les modifier
access to attrs=uidNumber,gidNumber
    by dn="cn=manager,dc=developpez,dc=com" write
    by dn="cn=proxyuser,dc=developpez,dc=com" read
    by * read

# Accès en lecture au reste de l'annuaire pour tout le monde
access to *
    by dn="cn=manager,dc=developpez,dc=com" write
    by self write
    by * read

# Système de stockage utilisé en arrière-plan
database    bdb
# Racine de l'annuaire
suffix      "dc=developpez,dc=com"
# Nom distingué du manager LDAP pour accéder à l'annuaire
rootdn      "cn=manager,dc=developpez,dc=com"
# Son mot de passe en clair ou crypté via la commande slappasswd
# Ici "secret", sous forme hashée, obtenue par la commande "slappasswd -h '{MD5}'"
rootpw      {MD5}Xr4ilOzQ4PCOq3aQ0qbuaQ==
# Emplacement des fichiers de stockage des données
directory   /var/db/openldap-data

# Les attributs indexés
index    objectClass              eq
index    cn,sn,uid,displayName    pres,sub,eq
index    uidNumber,gidNumber      eq

1.3. Configuration du client LDAP

Cette étape n'est en rien vitale au bon fonctionnement de l'annuaire mais elle vous permettra d'écrire des lignes de commandes plus courtes lorsque vous devrez vérifier le bon fonctionnement de l'annuaire ou bien effectuer des tâches administratives. En effet, le fichier /usr/local/etc/openldap/ldap.conf permet de spécifier des valeurs par défaut :
##### Propriétés du serveur LDAP #####
# Racine de l'annuaire
base               dc=developpez,dc=com
# Puisqu'on est en local
uri                ldap://127.0.0.1/
# Version du protocole LDAP utilisée
ldap_version       3

1.4. Paramétrage du pare-feu

Les ports utilisés par défaut par LDAP sont :
  • le port 636 pour les connexions (tcp) SSL (protocole LDAPS)
  • le port 389 pour les connexions (tcp) non sécurisées ou sécurisées utilisant TLS (protocole LDAP)
Pour les utilisateurs de pf qui veulent autoriser les requêtes LDAP et LDAPS entrantes, voici la règle à rajouter :
##### Macros #####
int_net = "192.168.100.0/24" # Machine(s) autorisée(s)
tcpflags = "flags S/SFRA"
int_if = "sis0" # Nom de votre interface réseau (voir ifconfig)

# LDAP (Connections normales ou TLS), LDAPS
pass in quick on $int_if proto tcp from $int_net to $int_if port { ldap ldaps } $tcpflags keep state

2. Configuration des clients


2.1. Définitions


2.1.1. PAM

Pluggable Authentication Modules (en français : modules d'authentification enfichables) est un mécanisme d'authentification flexible, permettant par le biais de modules, de définir des stratégies et de proposer différents médias comme sources pour l'identification des utilisateurs (bases de données, annuaire, clé USB, …). L'administrateur système n'est plus ainsi limité aux fichiers /etc/passwd et /etc/shadow. L'authentification via PAM ne concerne pas seulement l'accès au système mais tout service que la machine héberge.


2.1.2. NSS

Name Service Switch (en français : commutateur de services de nommages), permet de fournir à Linux/Unix non pas des services d'authentification, mais des services de correspondances entre noms, de toutes sortes (noms de machines, utilisateurs, groupes, …), et les identifiants de ces mêmes objets pour la machine (respectivement adresses IP, uid, gid dans l'exemple précédent). NSS, fonctionne de manière similaire à PAM, c'est-à-dire sur la base de modules.


2.2. Cas d'un client Linux


2.2.1. Installation des modules PAM et NSS

Le gestionnaire de paquets étant spécifique à chaque distribution, je vous laisse donc le soin de trouver et installer les paquets nommés pam_ldap et nss_ldap (openldap-client fera partie des dépendances).

info La distribution dont sont tirés les fichiers de configuration est une Mandriva (versions 9.0 et 2006).

2.2.2. Configuration de PAM


2.2.2.1. Autoriser les utilisateurs LDAP à s'authentifier sur la machine

Pour cela modifions /etc/pam.d/system-auth comme suit :
#%PAM-1.0

auth        required      pam_env.so
auth        sufficient    pam_unix.so likeauth nullok
auth        sufficient    pam_ldap.so use_first_pass
auth        required      pam_deny.so

account     required      pam_unix.so
account     sufficient    pam_ldap.so

password    required      pam_cracklib.so retry=3 minlen=2  dcredit=0  ucredit=0
password    sufficient    pam_unix.so nullok use_authtok md5 shadow
password    sufficient    pam_ldap.so use_authtok
password    required      pam_deny.so

session     required      pam_limits.so
session     required      pam_unix.so
session     optional      pam_ldap.so

2.2.2.2. Autoriser les utilisateurs LDAP à utiliser SSH

Il suffit de modifier la configuration de ssh (fichier /etc/ssh/sshd_config) pour rendre l'accès à SSH possible du fait que le module PAM sshd inclus system-auth :
UsePam yes
Puis redémarrez le démon sshd ou envoyez lui le signal HUP (1).


2.2.3. Configuration de NSS

Indiquons au système qu'il doit consulter l'annuaire pour trouver les comptes utilisateur après toutefois avoir d'abord regardé dans les fichiers. Pour cela, modifions /etc/nsswitch.conf pour qu'il soit configuré ainsi :
hosts:          files    dns
networks:       files
protocols:      files
ethers:         files
rpc:            files
netmasks:       files
bootparams:     files
services:       files
passwd:         files    ldap
group:          files    ldap
shadow:         files    ldap
netgroup:       files
Pour éviter toute confusion, et parce que le fichier de configuration du client LDAP et celui de NSS sont très proches, nous allons les lier :
# Conservation du fichier
mv /etc/openldap/ldap.conf /etc/openldap/ldap.conf.bak
# Nous lions les deux fichiers de configuration
ln -s /etc/ldap.conf /etc/openldap/ldap.conf
Nous pouvons maintenant préciser à quel emplacement précis le système peut trouver les données relatives aux utilisateurs et groupes. Pour cela éditez /etc/ldap.conf :
# Propriétés du serveur LDAP
base               dc=developpez,dc=com
uri                ldap://votre adresse IP réseau ou nom la de machine (résolution par DNS ou /etc/hosts)/
ldap_version       3

# Authentification
rootbinddn         cn=proxyuser,dc=developpez,dc=com

# Pour NSS & PAM
pam_password       MD5
nss_base_passwd    ou=Utilisateurs,dc=developpez,dc=com?one
nss_base_shadow    ou=Utilisateurs,dc=developpez,dc=com?one
nss_base_group     ou=Groupes,dc=developpez,dc=com?one
L'utilisateur cn=proxyuser,dc=developpez,dc=com va permettre aux machines clientes de se connecter à votre annuaire afin de vérifier que l'utilisateur qui s'y connecte fourni un couple, login et mot de passe, valide. Afin de protéger les mots de passe stockés dans l'annuaire, bien qu'ils soient hashés, ceux-ci ne seront lisibles qu'à un nombre restreint d'utilisateurs, dont il fait partie. Ce compte est protégé par un mot de passe définit à 'proxy' pour l'exemple. Cependant, il va falloir le fournir pour que NSS procède aux vérifications :
# On enregistre le mot de passe dans le fichier /etc/ldap.secret
echo "proxy" > /etc/ldap.secret
# On le rend lisible que par root
chmod u=rw,go= /etc/ldap.secret

2.3. Cas d'un client FreeBSD


2.3.1. Installation des modules PAM et NSS

Une fois de plus l'installation se fait simplement avec le système de ports :
# Installation de PAM_LDAP
cd /usr/ports/security/pam_ldap
make install

# Installation de NSS_LDAP
cd /usr/ports/net/nss_ldap
make install

2.3.2. Configuration de PAM


2.3.2.1. Autoriser les utilisateurs LDAP à s'authentifier sur la machine

Pour les accès locaux, il nous faut modifier quelque peu /etc/pam.d/system :
# auth
auth        sufficient    pam_opie.so                   no_warn no_fake_prompts
auth        requisite     pam_opieaccess.so             no_warn allow_local
auth        sufficient    /usr/local/lib/pam_ldap.so    no_warn try_first_pass
auth        required      pam_unix.so                   no_warn try_first_pass nullok

# account
account     sufficient    /usr/local/lib/pam_ldap.so
account     required      pam_login_access.so
account     required      pam_unix.so

# session
session     required      pam_lastlog.so                no_fail

# password
password    sufficient    /usr/local/lib/pam_ldap.so    no_warn try_first_pass
password    required      pam_unix.so                   no_warn try_first_pass

2.3.2.2. Autoriser les utilisateurs LDAP à utiliser SSH

En ce qui concerne SSH, ça se passe dans /etc/pam.d/sshd :
# auth
auth        required      pam_nologin.so                no_warn
auth        sufficient    pam_opie.so                   no_warn no_fake_prompts
auth        requisite     pam_opieaccess.so             no_warn allow_local
auth        sufficient    /usr/local/lib/pam_ldap.so    no_warn
auth        required      pam_unix.so                   no_warn try_first_pass

# account
account     required      pam_login_access.so
account     required      pam_unix.so

# session
session     required      pam_permit.so

# password
password    required      pam_unix.so                   no_warn try_first_pass

2.3.3. Configuration de NSS

info D'un client Linux à un client FreeBSD peu de choses changent pour la configuration de NSS. Les seules modifications à apporter concernent les chemins des fichiers de configuration.
Pour indiquer au système de consulter l'annuaire pour trouver les comptes utilisateur après avoir chercher dans les fichiers, nous modifions /etc/nsswitch.conf ainsi :
hosts:          files    dns
networks:       files
protocols:      files
ethers:         files
rpc:            files
netmasks:       files
bootparams:     files
services:       files
passwd:         files    ldap
group:          files    ldap
shadow:         files    ldap
netgroup:       files
Les fichiers de configuration du client LDAP et de NSS étant sensiblement identiques, nous allons les lier pour qu'ils soient plus faciles à maintenir :
# Conservation du fichier
mv /usr/local/etc/nss_ldap.conf /usr/local/etc/nss_ldap.conf.bak
# Nous lions les deux fichiers de configuration
ln -s /usr/local/etc/ldap.conf /usr/local/etc/nss_ldap.conf
Editons /usr/local/etc/ldap.conf afin de préciser à quel emplacement précis le système pourra trouver les données relatives aux utilisateurs et groupes dans l'annuaire.
# Propriétés du serveur LDAP
base               dc=developpez,dc=com
uri                ldap://votre adresse IP réseau ou nom la de machine (résolution par DNS ou /etc/hosts)/
ldap_version       3

# Authentification
rootbinddn         cn=proxyuser,dc=developpez,dc=com

# Pour NSS & PAM
pam_password       MD5
nss_base_passwd    ou=Utilisateurs,dc=developpez,dc=com?one
nss_base_shadow    ou=Utilisateurs,dc=developpez,dc=com?one
nss_base_group     ou=Groupes,dc=developpez,dc=com?one
La machine cliente aura recours à l'utilisateur LDAP nommé cn=proxyuser,dc=developpez,dc=com afin de vérifier que la personne qui s'authentifie sur ce système fourni un couple, login et mot de passe, valide. Ce compte nécessitant un mot de passe (valeur 'proxy' dans cet exemple) pour pouvoir consulter l'annuaire, il faut le fournir à NSS pour qu'il puisse procéder aux vérifications :
# On enregistre le mot de passe dans le fichier /etc/ldap.secret
echo "proxy" > /usr/local/etc/ldap.secret
# On le rend lisible que par root
chmod u=rw,go= /usr/local/etc/ldap.secret

3. Phase de test


3.1. Le jeu de test

# La racine de l'annuaire
dn: dc=developpez,dc=com
dc: developpez
objectclass: top
objectclass: domain
objectclass: domainRelatedObject
description: Mon annuaire
associatedDomain: developpez.com
structuralObjectClass: domain

# Le conteneur pour les utilisateurs
dn: ou=Utilisateurs,dc=developpez,dc=com
objectclass: top
objectclass: organizationalUnit
ou: Utilisateurs
description: Les utilisateurs
structuralObjectClass: organizationalUnit

# Le conteneur pour les groupes
dn: ou=Groupes,dc=developpez,dc=com
objectclass: top
objectclass: organizationalUnit
ou: Groupes
description: Les groupes
structuralObjectClass: organizationalUnit

# Nom distingué, unique, il permet d'identifier l'enregistrement dans l'annuaire
dn: cn=Patrick Poivre d'Arvor,ou=Utilisateurs,dc=developpez,dc=com
# Common Name
cn: Patrick Poivre d'Arvor
# Surnom
sn: ppda
# Les classes parentes
objectclass: top
objectclass: person
objectclass: posixAccount
objectclass: shadowAccount
# Login
uid: ppda
# Identifiant de l'utilisateur
uidnumber: 2000
# Groupe principal de l'utilisateur
gidnumber: 2000
# Nom complet
gecos: Patrick Poivre d'Arvor
# Shell
loginShell: /bin/csh
# Répertoire personnel
homeDirectory: /home/ppda
# Mot de passe
# "ppda" obtenu par "slappasswd -h '{MD5}'"
userpassword: {MD5}tcIIRTe2hjtHpCz0Usaupw==

# Groupe LdapUsers
dn: cn=LdapUsers,ou=Groupes,dc=developpez,dc=com
objectclass: top
objectclass: posixGroup
# Identifiant du groupe
gidNumber: 2000
# Intitule du groupe
cn: LdapUsers
# Membres du groupe
memberUid: ppda

# Notre utilisateur 'proxy' pour vérifier les authentifications
dn: cn=proxyuser,dc=developpez,dc=com
objectClass: top
objectClass: person
cn: proxyuser
# sn est obligatoire
sn: proxyuser
# mot de passe : 'proxy' obtenu grâce avec la commande : slappasswd -h '{MD5}'
userPassword: {MD5}QxOH63Ji4c/HmxJeuKZ8YA==
Pour ajouter ce jeu de test (qui serait ici stocké dans un fichier sous le nom de test.ldif), voici la commande à taper (à exécuter sur la machine hébergeant le serveur LDAP) :
# Importation du jeu de test
slapadd -v -l test.ldif

3.2. Démarrage du serveur LDAP

L'ultime étape avant le démarrage du serveur LDAP afin d'assurer son bon fonctionnement est de modifier le propriétaire des fichiers où sont stockées les données. Le dossier correspondant est désigné par directory (valeur par défaut : /var/db/openldap-data) dans votre fichier /usr/local/etc/openldap/slapd.conf. Voici donc la commande à exécuter :
# Modifier le path selon votre configuration si besoin
chown -R ldap:ldap /var/db/openldap-data
Tout est désormais prêt pour le démarrage du serveur LDAP :
# Démarrage du serveur LDAP comme démon
/usr/local/etc/rc.d/slapd.sh start

3.3. Test de l'authentification

Afin de vérifier que le tout fonctionne, essayez tout d'abord de vous loguer en tant que "ppda" sur une console virtuelle, par un su - ppda ou encore avec la commande id ppda à partir d'une de vos machines clientes.


4. Autoriser le changement de mot de passe avec la commande passwd


4.1. Modification de la configuration du serveur LDAP

Concernant l'annuaire il faut donner à l'utilisateur cn=proxyuser,dc=developpez,dc=com les droits d'écriture sur les attributs userPassword. Il faut alors changer l'ACL suivante dans le fichier de configuration de l'annuaire (/usr/local/etc/openldap/slapd.conf) :
access to attr=userPassword
    by dn="cn=manager,dc=developpez,dc=com" write
    by dn="cn=proxyuser,dc=developpez,dc=com" read
    by self write
    by anonymous auth
    by * none
En :
access to attr=userPassword
    by dn="cn=manager,dc=developpez,dc=com" write
    by dn="cn=proxyuser,dc=developpez,dc=com" write
    by self write
    by anonymous auth
    by * none

4.2. Configuration des clients FreeBSD

Par défaut, le programme passwd refuse le changement de mot de passe par l'utilisation de modules PAM. Pour changer ce comportement, nous devons en modifier quelque peu sa source. Pour cela, éditez /usr/src/usr.bin/passwd/passwd.c afin de changer :
errx(1,
      "Sorry, `passwd' can only change passwords for local or NIS users.");
En :
/*errx(1,
      "Sorry, `passwd' can only change passwords for local or NIS users.");*/
        fprintf(stderr, "Now you can change password via PAM\n");
Puis recompiler le programme passwd :
cd /usr/src/usr.bin/passwd/
make && make install
Enfin modifions /etc/pam.d/passwd tel que :
password    sufficient    pam_unix.so                   no_warn try_first_pass nullok
password    sufficient    /usr/local/lib/pam_ldap.so    use_first_pass

4.3. Configuration des clients Linux

Aucune modification supplémentaire à apporter.


Remerciements

Je remercie Katyucha pour sa relecture attentive.

Ainsi que Larkine, Gorgonite, Ovh, Katyucha et Michaël pour leurs suggestions et leur soutien.



Valid XHTML 1.1!Valid CSS!

Copyright © 2006 julp. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts. Cette page est déposée à la SACD.

Responsables bénévoles de la rubrique BSD : julp et Olivier Régnier - Contacter par EMail :
Vos questions techniques : forum d'entraide BSD - Publiez vos articles, tutoriels et cours
et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones
Nous contacter - Copyright © 2000-2008 www.developpez.com - Legal informations.