Avertissement :
Ce document n'est plus valide ou plus maintenu.
|
L'authentification avec OpenLDAP et Gentoo
1.
Bien démarrer avec OpenLDAP
Qu'est-ce que LDAP ?
LDAP signifie Lightweight Directory Access Protocol (protocole léger
pour l'accès à un annuaire). Il est basé sur X.500 et il offre la plupart de
ses fonctions, mais il lui manque les fonctions plus exotiques de X.500.
Qu'est-ce donc que X.500 et pourquoi y a-t-il un LDAP ?
X.500 est un modèle de service d'annuaire conforme au concept OSI. Il définit
un espace de noms et contient des protocoles pour interroger l'annuaire et
le mettre à jour. Cependant, X.500 s'est révélé trop lourd dans de nombreuses
situations. Ainsi fut créé LDAP. Comme X.500, il fournit un modèle d'espace de
noms et de données pour une gestion d'annuaire. Toutefois, LDAP a été conçu
pour s'appuyer sur la couche TCP/IP. On peut considérer LDAP comme une version
allégée de X.500.
Je ne comprends pas. Qu'est-ce qu'un annuaire ?
Un annuaire est une base de données spécialisée conçue pour des lectures
fréquentes, mais avec peu de mises à jour. Contrairement aux bases de données
classiques, elles ne connaissent pas les transactions. Les annuaires sont
faciles à répliquer pour augmenter la disponibilité et la fiabilité. Quand des
annuaires sont répliqués, les incohérences temporaires sont tolérées pour
autant qu'elles soient finalement synchronisées.
Comment l'information est-elle structurée ?
Un annuaire est organisé de façon hiérarchique.
Pour ajouter une information dans un annuaire, il doit savoir
comment stocker cette information dans sa hiérarchie.
Regardez cet exemple d'une société fictive :
Exemple de code 1.1 : Organigramme de GenFic, une société imaginaire |
dc: com
|
dc: genfic
/ \
ou: people servers
/ \ ..
uid: .. jhon
|
Évidemment, vous ne devez pas entrer l'information avec du texte
comme ci-dessus. Chaque nœud doit être défini. LDAP utilise des
conventions de définition des noms. La plupart des systèmes LDAP (y compris
OpenLDAP) contiennent un certain nombre de conventions, généralement approuvées,
telles que la convention "inetorgperson", souvent utilisées
pour définir des utilisateurs.
Les lecteurs intéressés sont invités à lire le
Guide
d'administration de OpenLDAP.
Bon alors, à quoi ça sert ?
LDAP peut être utilisé pour de nombreuses tâches. Ce document s'intéresse plus
particulièrement à la gestion des utilisateurs, mais d'autres buts peuvent être
atteints grâce à LDAP. À l'aide de LDAP, les comptes utilisateurs seront
centralisés sur un unique serveur LDAP (ce qui ne signifie pas pour autant que
l'hébergement se fait sur un serveur unique puisque LDAP supporte la haute
disponibilité et la redondance). Parmi les applications courantes pour
LDAP :
- Infrastructure de gestion de clefs publiques ;
- Calendrier distribué ;
- Carnet d'adresse distribué ;
- Stockage pour le DHCP, le DNS, etc.
-
Directives de configuration de systèmes (garder une trace des configurations
sur plusieurs serveurs) ;
- ...
2.
Configurer OpenLDAP
Configuration de départ
Note :
Dans ce document, nous utilisons l'adresse genfic.com comme exemple. Vous devez
bien sûr utiliser la vôtre. L'adresse que vous allez utiliser comme noeud
racine doit être un nom de domaine officiel (net, com, cc, be, ...)
|
Commençons par installer les composants sur le serveur :
Exemple de code 2.1 : Installer OpenLDAP |
# emerge openldap pam_ldap nss_ldap migrationtools
# chown ldap:ldap /var/lib/openldap-ldbm /var/lib/openldap-data /var/lib/openldap-slurp
|
Ensuite, modifiez /etc/openldap/slapd.conf et
ajoutez les lignes suivantes juste après core.schema :
Exemple de code 2.2 : /etc/openldap/slapd.conf |
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/inetorgperson.schema
include /etc/openldap/schema/nis.schema
password-hash {md5}
TLSCertificateFile /etc/ssl/ldap.pem
TLSCertificateKeyFile /etc/openldap/ssl/ldap.pem
TLSCACertificateFile /etc/ssl/ldap.pem
database ldbm
suffix "dc=genfic,dc=com"
rootdn "cn=Manager,dc=genfic,dc=com"
rootpw {MD5}Xr4ilOzQ4PCOq3aQ0qbuaQ==
directory /var/lib/openldap-ldbm
index objectClass eq
|
Ensuite, modifions le fichier de configuration de LDAP :
Exemple de code 2.3 : /etc/openldap/ldap.conf |
# nano -w /etc/openldap/ldap.conf
BASE dc=genfic, dc=com
URI ldaps://auth.genfic.com:636/
TLS_REQCERT allow
|
Maintenant, générez le certificat SSL qui protègera votre annuaire. Répondez
aux questions posées du mieux possible. Quand le système vous demande un
Common Name, indiquez le nom que les clients utiliseront pour contacter
le serveur. Généralement, c'est le nom complet de la machine, par exemple
auth.genfic.com.
Exemple de code 2.4 : Générer le certificat SSL |
# cd /etc/ssl
# openssl req -config /etc/ssl/openssl.cnf -new -x509 -nodes -out \
ldap.pem -keyout /etc/openldap/ssl/ldap.pem -days 999999
# chown ldap:ldap /etc/openldap/ssl/ldap.pem
|
Ensuite, ajoutez la ligne qui suit dans le fichier
/etc/conf.d/slapd et mettez la ligne existante en commentaire.
Exemple de code 2.5 : /etc/conf.d/slapd |
OPTS="-h 'ldaps:// ldapi://%2fvar%2frun%2fopenldap%2fslapd.sock'"
|
Démarrez SLAPd :
Exemple de code 2.6 : Démarrer SLAPd |
# /etc/init.d/slapd start
|
Faites le test suivant :
Exemple de code 2.7 : Tester le démon SLAPd |
# ldapsearch -D "cn=Manager,dc=genfic,dc=com" -W
|
Si une erreur survient, essayez d'ajouter -d 255 pour faire afficher
plus de messages d'information et essayer de comprendre le problème.
3.
Migrer les données existantes
Migrer les comptes des utilisateurs
Ensuite, nous migrons les comptes des utilisateurs. Ouvrez le fichier
/usr/share/migrationtools/migrate_common.ph et modifiez-le comme
suit :
Exemple de code 3.1 : /usr/share/migrationtools/migrate_common.ph |
$DEFAULT_BASE = "dc=genfic,dc=com";
$EXTENDED_SCHEMA = 1;
|
Maintenant, exécutez les scripts de migration :
Exemple de code 3.2 : Exécuter les scripts de migration |
# export ETC_SHADOW=/etc/shadow
# cd /usr/share/migrationtools
# ./migrate_base.pl > /tmp/base.ldif
# ./migrate_group.pl /etc/group /tmp/group.ldif
# ./migrate_hosts.pl /etc/hosts /tmp/hosts.ldif
# ./migrate_passwd.pl /etc/passwd /tmp/passwd.ldif
|
Cette étape a copié les fichiers ci-dessus en fichiers ldif utilisés
par LDAP. Ajoutons-les à notre annuaire :
Exemple de code 3.3 : Importer les données dans notre annuaire |
# ldapadd -D "cn=Manager,dc=genfic,dc=com" -W -f /tmp/base.ldif
# ldapadd -D "cn=Manager,dc=genfic,dc=com" -W -f /tmp/group.ldif
# ldapadd -D "cn=Manager,dc=genfic,dc=com" -W -f /tmp/passwd.ldif
# ldapadd -D "cn=Manager,dc=genfic,dc=com" -W -f /tmp/hosts.ldif
|
Si vous rencontrez une erreur dans vos fichiers ldif, vous pouvez reprendre là
où vous en étiez en utilisant ldapadd -c.
4.
Configuration du client
Configurer PAM
Nous allons tout d'abord configurer PAM pour permettre une authentification
LDAP. Installez sys-auth/pam_ldap afin que PAM dispose du support LDAP
et sys-auth/nss_ldap pour que le système puisse utiliser des serveurs
LDAP pour obtenir des informations supplémentaires (utilisé par le fichier
nsswitch.conf).
Exemple de code 4.1 : Installation de pam_ldap et nss_ldap |
# emerge pam_ldap nss_ldap
|
Maintenant, éditez le fichier /etc/pam.d/system-auth pour qu'il
ressemble à ceci :
Exemple de code 4.2 : /etc/pam.d/system-auth |
auth required pam_env.so
auth sufficient pam_unix.so likeauth nullok shadow
auth sufficient pam_ldap.so use_first_pass
auth required pam_deny.so
account requisite pam_unix.so
account sufficient pam_localuser.so
account required pam_ldap.so
password required pam_cracklib.so retry=3
password sufficient pam_unix.so nullok use_authtok shadow md5
password sufficient pam_ldap.so use_authtok use_first_pass
password required pam_deny.so
session required pam_limits.so
session required pam_unix.so
session required pam_mkhomedir.so skel=/etc/skel/ umask=0066
session optional pam_ldap.so
|
Puis, modifiez /etc/ldap.conf comme ceci :
Exemple de code 4.3 : /etc/ldap.conf |
ssl start_tls
ssl on
suffix "dc=genfic,dc=com"
uri ldaps://auth.genfic.com/
pam_password exop
ldap_version 3
pam_filter objectclass=posixAccount
pam_login_attribute uid
pam_member_attribute memberuid
nss_base_passwd ou=People,dc=genfic,dc=com
nss_base_shadow ou=People,dc=genfic,dc=com
nss_base_group ou=Group,dc=genfic,dc=com
nss_base_hosts ou=Hosts,dc=genfic,dc=com
scope one
|
Ensuite, copiez le fichier ldap.conf du server vers les clients
pour que ces derniers puissent utiliser LDAP.
Exemple de code 4.4 : Copier le fichier ldap.conf |
# scp serveur-ldap:/etc/openldap/ldap.conf /etc/openldap
|
Enfin, configurez vos clients pour qu'ils valident les comptes des utilisateurs
via le système LDAP :
Exemple de code 4.5 : /etc/nsswitch.conf |
passwd: files ldap
group: files ldap
shadow: files ldap
|
Faites le test suivant :
Exemple de code 4.6 : Tester l'authentification LDAP |
# getent passwd|grep 0:0
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
|
Vous avez peut-être remarqué qu'une des lignes que vous avez recopiées dans le
fichier /etc/ldap.conf était en commentaire (la ligne avec
rootbinddn). Vous n'en avez besoin que si vous voulez changer le mot de
passe d'un utilisateur en tant que superutilisateur. Dans ce cas, vous devriez
copier le mot de passe de root en clair dans /etc/ldap.secret.
Ceci est DANGEREUX et le fichier doit absolument avoir les
permissions 600 (cf. chmod). Dans la pratique, ce fichier est laissé vide et,
quand le mot de passe d'un utilisateur doit être modifié dans LDAP et dans
/etc/passwd, on y copie le mot de passe root juste le temps
d'effectuer l'opération. Il ne faut évidemment pas oublier de l'enlever sitôt
l'opération terminée.
5.
Configuration de la sécurité du serveur LDAP
Permissions OpenLDAP
Si vous lisez le fichier /etc/openldap/slapd.conf, vous
constaterez que vous pouvez placer des permissions de type ACL (Access Control
List) sur les fichiers :
Exemple de code 5.1 : /etc/openldap/slapd.conf |
access to *
by dn="uid=root,ou=people,dc=genfic,dc=com" write
by users read
by anonymous auth
access to attrs=userPassword,gecos,description,loginShell
by self write
|
Cela attribue les accès appropriés pour un utilisateur normal. De plus, les
utilisateurs ont accès en écriture sur leurs données et en lecture sur celles
des autres. Les utilisateurs anonymes peuvent envoyer un nom d'utilisateur et un
mot de passe pour s'identifier. Les quatre niveaux possibles sont (du plus bas
au plus haut) : auth search read write.
L'exemple suivant est un peu plus sécurisé puis qu'il empêche les utilisateurs
normaux de lire les mots de passe cryptés des autres.
Exemple de code 5.2 : /etc/openldap/slapd.conf |
access to attrs="userPassword"
by dn="uid=root,ou=people,dc=genfic,dc=com" write
by dn="uid=John,ou=People,dc=genfic,dc=com" write
by anonymous auth
by self write
by * none
access to *
by dn="uid=root,ou=People,dc=genfic,dc=com" write
by * search
|
Dans cet exemple, on a donné accès en lecture/écriture/recherche à root et à
John dans l'arbre sous dc=genfic,dc=com. On a aussi autorisé les
utilisateurs à modifier leur propre mot de
passe (userPassword). La dernière instruction permet à
chacun de lancer une recherche, c'est-à-dire qu'un utilisateur peut définir un
filtre de recherche, mais qu'il ne peut pas lire les résultats. Vous pouvez
avoir plusieurs ACL successifs et la règle de base est de procéder de bas en
haut en plaçant le plus restrictif en premier.
6.
Utiliser OpenLDAP
Gérer l'annuaire
Vous pouvez utiliser votre annuaire pour authentifier des utilisateurs dans
apache/proftpd/qmail/samba. Vous pouvez le gérer via Webmin qui dispose d'une
interface très facile à utiliser. Vous pouvez aussi utiliser gq ou le
directory_administrator.
7.
Remerciements
Nous voudrions remercier Matt Heler qui nous a prêté sa machine pour nos tests
lors de la rédaction de ce guide. Merci aussi à tous ceux qui nous ont aidé sur
#ldap @ irc.freenode.net.
Ce document est protégé par la licence Creative
Commons : Paternité - Partage des Conditions Initiales à
l'Identique 2.5.
|