Mettre en place l'authentification LDAP
Auteur : Olivier BOYER - oboyer () ajoute ! org
—- EN COURS —- A faire :
- authentification via ldap over TLS/SSL
- faire des scripts pour synchroniser les bases
/etc/master.passwdet LDAP
Mots clés
OpenBSD, OpenLDAP, LDAP, authentification, login_ldap
Introduction
Ce document décrit comment authentifier un utilisateur dans un annuaire LDAP sous OpenBSD 3.9
Présentation de la maquette
Les éléments suivants vont être mis en oeuvre :
- Un serveur OpenBSD 3.9
- Le serveur d'annuaire LDAP OpenLDAP
- Le module d'authentification
login_ldap
Le serveur OpenBSD authentifie ses utilisateurs via l'annuaire LDAP.
Paramètres réseau du serveur :
- adresse IP : 192.168.1.1/24
- FQDN : smoking.leaves.org
- alias : ldap.leaves.org
Paramètres LDAP :
- domaine : dc=leaves,dc=org
- serveur : ldap.leaves.org
Le tableau suivant fait la correspondance entre les fichiers système standards et les entrées de l'annuaire LDAP.
| Fonction | Fichier système | Conteneur de l'annuaire |
|---|---|---|
| Utilisateurs “humains” | /etc/master.passwd | ou=People,dc=leaves,dc=org |
| Goupes utilisateurs | /etc/group | ou=Group,dc=leaves,dc=org |
| Résolution de noms | /etc/hosts | ou=Hosts,dc=leaves,dc=org |
| Aliases mail | /etc/aliases | ou=Aliases,dc=leaves,dc=org |
| Automontage | /etc/amd/* | ou=Mounts,dc=leaves,dc=org |
Note
Toutes les commandes présentées ici, sont à exécuter, sauf mention contraire, en tant qu'administrateur de la machine.
Pré-requis
- Un serveur OpenBSD 3.9 installé et fonctionnel
- Un serveur OpenLDAP installé et fonctionnel. Voir le document Installer un serveur OpenLDAP dans un chroot.
Configurer l'annuaire LDAP
Dans le document présenté dans la section précédente, le serveur OpenLDAP a été installé dans un environement à racine déplacé, et configuré. Cependant, aucune donnée n'a été insérée dans l'annuaire.
Cette section a pour but de présenter la configuration minimale de l'annaire LDAP pour authentifier des utilisateurs.
Le daemon slapd(8) doit être inactif.
Créer les conteneurs
La première étape de définition de données dans un annuaire LDAP consiste à créer les objets conteneurs, c'est-à-dire ceux qui vont organiser les données dans l'arbre.
Créez le fichier base.ldif comme suit :
dn: dc=leaves,dc=org dc: leaves objectClass: top objectClass: domain dn: ou=People,dc=leaves,dc=org ou: People objectClass: top objectClass: organizationalUnit dn: ou=Group,dc=leaves,dc=org ou: Group objectClass: top objectClass: organizationalUnit dn: ou=Hosts,dc=leaves,dc=org ou: Hosts objectClass: top objectClass: organizationalUnit dn: ou=Aliases,dc=leaves,dc=org ou: Aliases objectClass: top objectClass: organizationalUnit dn: ou=Mounts,dc=leaves,dc=org ou: Mounts objectClass: top objectClass: organizationalUnit
Insérez les données dans l'annuaire :
# slapadd -b "dc=leaves,dc=org" -l base.ldif
Les conteneurs créés, il est maintenant possible de définir les objets.
Définir les utilisateurs
Créez le fichier passwd.ldif, qui regroupe les informations du fichier système /etc/master.passwd, comme suit :
dn: uid=user1,ou=People,dc=leaves,dc=org
uid: user1
cn: GECOS user1
objectClass: account
objectClass: posixAccount
objectClass: top
userPassword: {crypt}xxxxxxxx
loginShell: /bin/sh
uidNumber: 5000
gidNumber: 5000
homeDirectory: /home/user1
gecos: GECOS user1
dn: uid=user2,ou=People,dc=leaves,dc=org
uid: user2
cn: GECOS user2
objectClass: account
objectClass: posixAccount
objectClass: top
userPassword: {crypt}xxxxxxxx
loginShell: /bin/sh
uidNumber: 5001
gidNumber: 5000
homeDirectory: /home/user2
gecos: GECOS user2
Insérez les données dans l'annuaire :
# slapadd -b "dc=leaves,dc=org" -l passwd.ldif
Définir les groupes d'utilisateurs
Créez le fichier group.ldif, qui regroupe les informations du fichier système /etc/group, comme suit :
dn: cn=ldapusers,ou=Group,dc=leaves,dc=org
objectClass: posixGroup
objectClass: top
cn: ldapusers
userPassword: {crypt}*
gidNumber: 5000
Insérez les données dans l'annuaire :
# slapadd -b "dc=leaves,dc=org" -l group.ldif
Définir les machines
Créez le fichier hosts.ldif, qui regroupe les informations du fichier système /etc/hosts, comme suit :
dn: cn=localhost,ou=Hosts,dc=leaves,dc=org objectClass: top objectClass: ipHost objectClass: device ipHostNumber: 127.0.0.1 cn: localhost cn: localhost. dn: cn=smoking.leaves.org,ou=Hosts,dc=leaves,dc=org objectClass: top objectClass: ipHost objectClass: device ipHostNumber: 192.168.1.1 cn: smoking.leaves.org cn: smoking cn: ldap
Insérez les données dans l'annuaire :
# slapadd -b "dc=leaves,dc=org" -l hosts.ldif
Créer un utilisateur de recherche
Créez un utilisateur qui aura un acceès en lecture seule à toutes les entrées de l'annuaire. C'est très utile pour éviter les accès annonyme à toutes les bases.
Générez tout d'abord un mot de passe pour cet utilisateur, comme suit :
# slappasswd -s secret
{SSHA}LTkJrmdw2W8ZdJ4SvzWatZVIy158Xgar
Créez le fichier user_search.ldif comme suit :
## Entry for the special user for user-lookups
dn: cn=read,dc=leaves,dc=org
objectClass: organizationalRole
objectClass: simpleSecurityObject
cn: read
description: LDAP user for lookups (read access to all)
#copier/coller le mot de passe crypte genere plus haut.
userPassword: {SSHA}LTkJrmdw2W8ZdJ4SvzWatZVIy158Xgar
Insérez les données dans l'annuaire :
# slapadd -b "dc=leaves,dc=org" -l user_search.ldif
Mettre en place l'authentification LDAP
Installer le module d'authentification LDAP
Le module login_ldap du mécanisme bsd_auth(5) permet d'authentifier un utilisateur via un annuaire LDAP.
Comment fonctionne ce module ?
Tout d'abord, getty(8) et login(1) demandent le couple “login/password” comme pour toute authentification. Une fois ces paramètres obtenus de l'utilisateur, login_ldap parcoure l'annuaire LDAP à la recherche de l'entrée correspondante au login saisi. S'il trouve cette entrée, login_ldap essaie de s'authentifier dans l'annuaire avec le couple “login/password” donné. Si l'authentification réussie, le mot de passe saisi par l'utilisateur est validé, et l'utilisateur est authorisé à ouvrir une session.
Pour installer le module login_ldap, exécutez la commande suivante :
# export PKG_PATH="ftp://ftp.de.openbsd.org/unix/OpenBSD/3.9/packages/i386/" # pkg_add login_ldap login_ldap-3.3p0: complete
Installer le module d'authentification LDAP sans SSL/TLS
La version 3.3p0 du package login_ldap a un bug connu, non corrigé par le mainteneur. Cette version ne fonctionne pas pour s'authentifier via un annuaire LDAPv3 sans TLS/SSL. Voir la page : http://marc.theaimsgroup.com/?l=openbsd-ports&m=113770627801618&w=2
Pour utiliser login_ldap dans un environnement sans SSL/TLS, il faut installer la version 3.4 de login_ldap, disponible à l'url : http://www.ifost.org.au/~peterw/login_ldap-3.4.tar.gz
Cependant, cette archive n'est pas un port OpenBSD. Si vous la compilez, et l'installez, les fichiers seront copiés directement dans /usr/local et /usr/local/libexec/auth/ sans engeristrement du package. Cette solution n'est pas très élégante.
Vous trouverez en ANNEXE comment créer un port pour login_ldap-3.4. La suite de ce document utilise login_ldap en version 3.4.
Modifier le fichier login.conf
Le fichier /etc/login.conf décrit les différentes classes d'utilisateurs et les méthodes à employer pour les authentifier. Voir la page de manuel login.conf(5) pour plus de détails.
Pour authentifier les utilisateurs via un annuaire LDAP, il faut ajouter les lignes suivantes au fichier /etc/loging.conf :
## LDAP authentification
ldap:\
:auth=-ldap:\
:x-ldap-server=ldap.leaves.org:\
:x-ldap-basedn=ou=People,dc=leaves,dc=org:\
:x-ldap-binddn=cn=read,dc=leaves,dc=org:\
:x-ldap-bindpw=secret:\
:x-ldap-filter=(&(objectclass=posixAccount)(uid=%u)):\
:tc=default:
Le fichier /etc/login.conf contient maintenant les paramètres de connexions de l'utilisateur read qui a accès en lecture complète à toutes les bases, y compris au champ userPassword des utilisateurs. Il est donc nécessaire de changer les permissions de ce fichier. Procédez comme suit :
# chmod 640 /etc/login.conf
Créer un utilisateur en local
L'inconvénient d'OpenBSD (jusqu'au moins la version 3.9) est qu'il ne dispose pas de méncanisme équivalent à la libnss des autres Unix. Le modules login_ldap permet d'authentifier un utilisateur via un annuaire LDAP, mais n'offre pas la possibilité d'y chercher les informations (uid,gid,home directory, shell, …) des utilisateurs.
Le développement des ces fonctionnalités est en cours. En attendant qu'elles soient livrées, il faut créer les utilisateurs à l'identique dans l'annuaire et dans le fichier local /etc/master.passwd.
Pour créer un utilisateur local, exécutez la commande suivante :
# groupadd -g 5000 ldapusers # useradd -m -d /home/user1 -c "GECOS user1" -s /bin/sh -L ldap -u 5000 -g 5000 user1
L'option -L ldap est très importante. Elle spécifie que l'utilisateur fait partie de la classe ldap ajoutée au fichier /etc/login.conf. Ainsi, le mot de passe de cet utilisateur sera cherché dans l'annuaire LDAP, et non dans le fichier /etc/master.passswd.
Tester l'authentification
Exécutez la commande suivante :
# /usr/local/libexec/auth/login_-ldap -d user1 ldap
[..]
bind success!
usearch:
ufilter (&(objectclass=posixAccount)(uid=user1))
scope: sub
0: search (ou=People,dc=leaves,dc=org, (&(objectclass=posixAccount)(uid=user1)))
1: msgid 0, type 64
1: SEARCH_ENTRY userdn uid=user1,ou=People,dc=leaves,dc=org
1: msgid 1, type 65
1: returning userdn = uid=user1,ou=People,dc=leaves,dc=org
userdn uid=user1,ou=People,dc=leaves,dc=org
user bind success!
no group filter
authorize
Tâches courantes
Changer le mot de passe d'un utilisateur
Pour qu'un utilisateur puisse changer son mot de passe, il doit tout d'abord s'authentifier, puis saisir la commande suivante :
$ ldappasswd -x -D "uid=user1,ou=People,dc=leaves,dc=org" -W -A -S \ "uid=user1,ou=People,dc=leaves,dc=org"
Vous pouvez aussi utiliser le script shell donné en ANNEXE.
Ajouter un utilisateur
Lister le contenu d'une OU
Pour lister les membres de l'OU Group, exécutez la commande suivante :
$ ldapsearch -x -LLL -s sub -b "ou=Group,dc=leaves,dc=org"
Liens
ANNEXE
Script pour changer le mot de passe d'un utilisateur
#!/bin/sh -
# ldappasswd.sh
# Change user password in LDAP tree
#
## SETTINGS
#
## Environment
PATH=""
IFS='
'
## Commands aliases
_id=/usr/bin/id
_rm=/bin/rm
_ldappasswd=/usr/local/bin/ldappasswd
## Global variables
USERID=`${_id} -nu`
DOMAIN="dc=ajoute,dc=org"
USER_OU="ou=People,${DOMAIN}"
USER_DN="uid=${USERID},${USER_OU}"
## MAIN
if [ -x ${_ldappasswd} ] ; then
echo "Changing password for user ${USERID}"
${_ldappasswd} -x -D "${USER_DN}" -W -A -S "${USER_DN}" >/dev/null 2>&1
if [ "$?" -ne "0" ] ; then
echo "Error while changing ${USERID}'password"
[ -f ldappasswd.core ] && ${_rm} ldappasswd.core
echo "Exiting now."
exit 1
else
echo "Succeed"
fi
else
echo "Can not execute ${_ldappasswd}"
echo "Exiting now."
exit 1
fi
#EOF
Créer un port OpenBSD pour login_ldap-3.4
Pré-requis : les sources des ports doivent être décompressées dans le répertoire /usr/ports.
Créer le répertoire du port
Exécutez la commande suivante :
# mkdir /usr/ports/mystuff
Copier le port login_ldap-3.3
Exécutez les commandes suivantes :
# cd /usr/ports/mystuff # cp -rp /usr/ports/sysutils/login_ldap . # mv login_ldap login_ldap-3.4
Modifier le port
Exécutez la commande suivante :
# cd /usr/ports/mystuff/login_ldap-3.4
Fichier Makefile
Appliquez les modifications suivantes au fichier /usr/ports/mystuff/login_ldap-3.4/Makefile :
--- /usr/ports/sysutils/login_ldap/Makefile Sat Oct 1 19:12:30 2005
+++ Makefile Mon Jun 12 18:25:44 2006
@@ -2,8 +2,8 @@
COMMENT= "provide ldap authentication type"
-DISTNAME= login_ldap-3.3
-PKGNAME= ${DISTNAME}p0
+DISTNAME= login_ldap-3.4
+PKGNAME= ${DISTNAME}
CATEGORIES= sysutils
HOMEPAGE= http://www.ifost.org.au/~peterw/
Fichier distinfo
Appliquez les modifications suivantes au fichier /usr/ports/mystuff/login_ldap-3.4/distinfo :
-MD5 (login_ldap-3.3.tar.gz) = 52e905d54a136c3d850158f4f7548a3f -RMD160 (login_ldap-3.3.tar.gz) = 9d2574eb5d2d116ce5575f4f8744902cfda13901 -SHA1 (login_ldap-3.3.tar.gz) = a1e0156b7eba22047ef2d706913b76d06a884074 -SIZE (login_ldap-3.3.tar.gz) = 10532 +MD5 (login_ldap-3.4.tar.gz) = d4cc16928fb8bfaa8e0197e0a9cf4c3f +RMD160 (login_ldap-3.4.tar.gz) = 7ccd456877811fb9d0a4a6f0b880bcb28f1e7af7 +SHA1 (login_ldap-3.4.tar.gz) = dc4840f2ed73589047213097be9f004cb296c271 +SIZE (login_ldap-3.4.tar.gz) = 13560
Compiler et installer le port
Exécutez les commandes suivantes :
# cd /usr/ports/mystuff/login_ldap-3.4 # # make install # make clean clean-depends
Activer login_ldap
Exécutez la commande suivante :
# /usr/local/bin/enable-login_ldap Successfully installed /usr/libexec/auth/login_-ldap You will have to manually remove it if you delete the login_ldap package
Informations sur le port
Exécutez les commandes suivantes :
# pkg_info |grep login_ldap login_ldap-3.4 provide ldap authentication type # # # pkg_info -L login_ldap Information for login_ldap-3.4 Files: /usr/local/bin/enable-login_ldap /usr/local/libexec/auth/login_-ldap /usr/local/man/cat8/login_ldap.0 /usr/local/share/login_ldap/active-directory.login_ldap.conf /usr/local/share/login_ldap/login_ldap.conf