openldap
Présentation
LDAP est un protocole basé sur TCP/IP qui permet de partager des bases de données d'information sur un réseau interne (intranet) ou externe (internet). Ces bases de données sont appelées annuaire électronique (Directory en anglais), elles peuvent contenir tout type d'informations, des informations sur les personnes, à des données systèmes. Qui dit base de données, dit recherche, il est donc possible de faire des recherches dans la base en employant plusieurs critères, mais aussi bien sûr de la modifier, mais contrairement à un SGBD, un annuaire est très rapide en lecture, mais l'est beaucoup moins en écriture, en effet comme un annuaire est plutôt lu que modifier il a été optimisé pour la lecture et ne possède pas les mécanismes de transaction complexe que les SGBD possèdent pour traiter de gros volumes de données.Le LDAP ou Lightweight Directory Access Protocol est la version TCP/IP du protocole DAP, ce dernier étant le protocole pour accéder au protocole OSI du service d'annuaire
X500. Dans un premier temps LDAP s'est contenté d'être l'interface à des annuaires X500, mais maintenant LDAP peut gérer complètement les bases (standalone LDAP).
Installation d'OpenLDAP
libldap2-2.1.25-6mdk
openldap-2.1.25-6mdk
perl-ldap-0.31-2mdk
openldap-servers-2.1.25-6mdk
openldap-clients-2.1.25-6mdk
Choix du suffixe
Le rootDSE ou suffixe correspond à l'entrée tout en haut de l'arbre (DIT) de l'annuaire, on
utilise généralement le nom de domaine, avec la syntaxe suivante dc=menara, dc=ma pour
le domaine kervao.fr (dc correspond à Domain Component).
Configuration du serveur LDAP
On va créer un annuaire LDAP pour votre domaine privé menara.ma. On doit modifier les
fichiers slapd.conf.
#######################################################################
# database definitions
#######################################################################
database ldbm
suffix "dc=menara,dc=ma"
rootdn "cn=Manager,dc=menara,dc=ma"
#mot de passe en clair, on verra plus loin comment le crypter
rootpw secret
Le mot de passe de l'administrateur est secret en clair, si ça ne vous convient pas et que vous
voulez le mettre crypté, il faudra taper (exemple avec secret) :
slappasswd -v -s secret -h {CRYPT}
Voilà le résultat
{CRYPT}G.H5krNMMw0cc
A la place de
rootpw secret
Dans slapd.conf, vous mettrez donc:
rootpw {CRYPT}G.H5krNMMw0cc
# Droits d'accès que j'ai rajoutés en plus
access to attr=userPassword
by self write
by anonymous auth
by dn="cn=Manager,dc=kervao,dc=fr" write
by * none
access to *
by dn="cn=Manager,dc=kervao,dc=fr" write
by * read
Lancement du serveur
Chkconfig ldap on
Service ldap start
Ajouter un enregistrement
On va par exemple utiliser la classe breizPerson définie plus haut pour décrire une nouvelle
personne Veronique Hoarau qu'on va rajouter dans l'annuaire. Elle appartient au service
(organizationalUnit ) staff, ce même service appartenant à l'organisation kervao.fr
Soit le fichier entree.ldif
dn: dc=kervao, dc=fr
objectClass: dcObject
objectClass: organization
dc: kervao
o: kervao.fr
dn: ou=staff, dc=kervao, dc=fr
objectclass: organizationalUnit
ou: staff
dn: cn=Veronique Hoarau, ou=staff, dc=kervao, dc=fr
objectclass: person
objectclass: breizhPerson
cn: Veronique Hoarau
sn: Hoarau
title: madame
Quelques commentaires, le premier groupe correspond à la définition de votre organisation,
le deuxième à celui du groupe de travail (organizationalUnit) et le dernier à la personne.
Celle-ci est définie par son dn (Distinguished Name), on part du sommet bz (suffixe du nom de domaine), puis le nom de domaine, le groupe de travail et enfin la personne. L'arbre
(DIT) pourrait ressembler à ça:
cn=Véroniqu
e Hoarau
cn=Olivie
r Hoarau
Au niveau de la définition de la personne:
objetclass: person définit la classe père de la classe breizPerson,
objetclass: breizPerson classe décrivant la personne,
cn et sn sont des attributs à renseigner obligatoirement,
title est un attribut obligatoire
On rajoutera l'enregistrement en utilisant la syntaxe suivante (en tant que simple utilisateur):
ldapadd -x -D "description du dn de l'administrateur" -W -f nom-du-fichier-ldif
Exemple concret:
ldapadd -x -D "cn=Manager, dc=kervao, dc=fr" -W -f entree.ldif
Enter LDAP Password: secret
adding new entry "dc=kervao, dc=fr"
adding new entry "ou=staff, dc=kervao, dc=fr"
adding new entry "cn=Veronique Hoarau, ou=staff, dc=kervao, dc=fr"
Pour rajouter par la suite un autre enregistrement dans le groupe staff , il sera plus nécessaire
de rajouter la définition du groupe et de l'organisation. Soit le fichier entree.ldif
dn: cn=Olivier Hoarau, ou=staff, dc=kervao, dc=fr
objectclass: person
objectclass: breizhPerson
cn: Olivier Hoarau
sn: Hoarau
title: monsieur
On tape ensuite la commande:
ldapadd -x -D "cn=Manager, dc=kervao, dc=fr" -W -f entree.ldif
Enter LDAP Password:
adding new entry "cn=Olivier Hoarau, ou=staff, dc=kervao, dc=fr
Rechercher un enregistrement
On utilisera la fonction ldapsearch. Pour visualiser tout l'annuaire on peut taper :
ldapsearch -x -b 'dc=kervao, dc=fr' '(objectclass=*)'
Voilà le résultat
# extended LDIF
#
# LDAPv3
# filter: (objectclass=*)
# requesting: ALL
#
# kervao, fr
dn: dc=kervao, dc=fr
objectClass: dcObject
objectClass: organization
dc: kervao.fr
o: kervao.fr
# staff, kervao, fr
dn: ou=staff, dc=kervao, dc=fr
objectClass: organizationalUnit
ou: staff
# Veronique Hoarau, staff, kervao, fr
dn: cn=Veronique Hoarau, ou=staff, dc=kervao, dc=fr
objectClass: person
objectClass: breizhPerson
cn: Veronique Hoarau
sn: Hoarau
title: madame
# Olivier Hoarau, staff, kervao, fr
dn: cn=Olivier Hoarau, ou=staff, dc=kervao, dc=fr
objectClass: person
objectClass: breizhPerson
cn: Olivier Hoarau
sn: Hoarau
title: monsieur
# search result
search: 2
result: 0 Success
# numResponses: 5
# numEntries: 4
Modifier un enregistrement
Rajouter un attribut à un enregistrement
On va rajouter l'attribut facultatif location (l) à l'enregistrement Veronique Hoarau. On va
créer un fichier modif.ldif contenant:
dn: cn=Veronique Hoarau, ou=staff, dc=kervao, dc=fr
add: l
title: bureau36
On tape ensuite
ldapmodify -x -D "cn=Manager, dc=kervao, dc=fr" -W -f modif.ldif
Enter LDAP Password:secret
modifying entry "cn=Veronique Hoarau, ou=staff, dc=kervao, dc=fr"
Modifier un attribut
On va modifier l'attribut titre (title) à l'enregistrement Veronique Hoarau. On va créer un
fichier modif.ldif contenant:
dn: cn=Veronique Hoarau, ou=staff, dc=kervao, dc=fr
changetype: modify
replace: title
title: mademoiselle
On tape ensuite
ldapmodify -x -D "cn=Manager, dc=kervao, dc=fr" -W -f modif.ldif
Enter LDAP Password:secret
modifying entry "cn=Veronique Hoarau, ou=staff, dc=kervao, dc=fr"
Supprimer un attribut
On va supprimer l'attribut location (l) à l'enregistrement Veronique Hoarau. On va créer un
fichier modif.ldif contenant:
dn: cn=Veronique Hoarau, ou=staff, dc=kervao, dc=fr
delete: l
On tape ensuite
ldapmodify -x -D "cn=Manager, dc=kervao, dc=fr" -W -f modif.ldif
Enter LDAP Password:secret
modifying entry cn=Veronique Hoarau, ou=staff, dc=kervao, dc=fr
Supprimer un enregistrement
Pour supprimer l'enregistrement Veronique hoarau, on va créer un fichier modif.ldif
contenant
dn: cn=Veronique Hoarau, ou=staff, dc=kervao, dc=fr
changetype: delete
On tape ensuite:
ldapmodify -x -D "cn=Manager, dc=kervao, dc=fr" -W -f modif.ldif
Enter LDAP Password:secret
deleting entry cn=Veronique Hoarau, ou=staff, dc=kervao, dc=fr
ATTENTION Vous ne pouvez pas supprimer un attribut obligatoire comme title pour la
classe breizhPerson.
A présent dans le répertoire /usr/share/openldap/migration (si installation par package,
sinon dans le répertoire MigrationTools-46) , on va modifier le fichier
migrate_common.ph, on doit y indiquer son nom de domaine, comme ceci :
# Default DNS domain
$DEFAULT_MAIL_DOMAIN = "kervao.fr";
# Default base
$DEFAULT_BASE = "dc=kervao,dc=fr";
Eventuellement vous pouvez modifier la ligne suivante spécifiant le serveur de mail bien que
ce ne soit pas absolument nécessaire.
$DEFAULT_MAIL_HOST = "mail.padl.com";
A présent il faut rentrer les utilisateurs et groupes du système dans la base de données
LDAP. Commençons d'abord par créer des fichiers temporaires au format ldif. On tape
maintenant en tant que root (pour pouvoir lire /etc/shadow)
ETC_SHADOW=/etc/shadow
export ETC_SHADOW
./migrate_passwd.pl /etc/passwd /tmp/passwd.ldif
./migrate_group.pl /etc/group /tmp/group.ldif
Configuration serveur et client
Editer le fichier /etc/ldap.conf
# Your LDAP server. Must be resolvable without using LDAP.
# ici vous devez mettre l'adresse IP de votre serveur
host 192.168.13.11
# The distinguished name of the search base.
# votre nom de domaine
base dc=kervao,dc=fr
# The distinguished name to bind to the server with.
# Optional: default is to bind anonymously.
# pour pouvoir se connecter à votre base
binddn cn=Manager,dc=kervao,dc=fr
# The credentials to bind with.
# Optional: default is no credential.
# le mot de passe qui va bien
bindpw secret
(...)
# Filter to AND with uid=%s
pam_filter objectclass=account
# The user ID attribute (defaults to uid)
pam_login_attribute uid
(...)
# Hash password locally; required for University of
# Michigan LDAP server, and works with Netscape
# Directory Server if you're using the UNIX-Crypt
# hash mechanism and not using the NT Synchronization
# service.
# type de cryptage du mot de passe
pam_password crypt
# RFC2307bis naming contexts
# Syntax:
# nss_base_XXX base?scope?filter
# where scope is {base,one,sub}
# and filter is a filter to be &'d with the
# default filter.
nss_base_passwd ou=People,dc=kervao,dc=fr?one
nss_base_shadow ou=People,dc=kervao,dc=fr?one
nss_base_group ou=Group,dc=kervao,dc=fr?one
Dans le fichier /etc/nsswitch.conf on modifiera les lignes suivantes pour lire
passwd: files nis ldap
shadow: files nis ldap
group: files nis ldap
Reprenons donc notre fichier login (rajoutez uniquement les lignes concernant pam_ldap et
laissez les autres), il doit ressembler à ça :
#%PAM-1.0
auth required pam_securetty.so
auth required pam_stack.so service=system-auth
auth required pam_nologin.so
auth sufficient /lib/security/pam_ldap.so
account sufficient /lib/security/pam_ldap.so
account required pam_stack.so service=system-auth
password sufficient /lib/security/pam_ldap.so
password required pam_stack.so service=system-auth
session sufficient /lib/security/pam_ldap.so
session required pam_stack.so service=system-auth
session optional pam_console.so
Le fichier su (rajoutez uniquement les lignes concernant pam_ldap et laissez les autres)
ressemble à ça
#%PAM-1.0
auth sufficient pam_rootok.so
auth required pam_stack.so service=system-auth
auth sufficient /lib/security/pam_ldap.so
account sufficient /lib/security/pam_ldap.so
account required pam_stack.so service=system-auth
password sufficient /lib/security/pam_ldap.so
password required pam_stack.so service=system-auth
session sufficient /lib/security/pam_ldap.so
session required pam_stack.so service=system-auth
session optional pam_xauth.so
Modifiez aussi le fichier /etc/pam.d/smtp (rajoutez uniquement les lignes concernant
pam_ldap et laissez les autres) car sinon vos mails vont se perdre dans la nature, le serveur
smtp a besoin d'authentifier les utilisateurs.
#%PAM-1.0
auth required /lib/security/pam_stack.so service=system-auth
auth sufficient /lib/security/pam_ldap.so
account sufficient /lib/security/pam_ldap.so
account required /lib/security/pam_stack.so service=system-auth
Modifiez les autres fichiers sous /etc/pam.d qui seraient susceptibles de faire appel à
l'authentification LDAP sur le même modèle.
Test de fonctionnement
C'est simple que ce soit sur le serveur ou le client, supprimer les lignes qui correspondent à
vos utilisateur dans /etc/passwd, et /etc/shadow et faites de même pour vos groupes
utilisateurs dans /etc/group. N'oubliez pas de faire une sauvegarde de ces fichiers au cas où !
Maintenant essayer de vous loguer en tant que simple utilisateur, et là normalement, vous
devriez vous loguer sans problème.