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.passwd et 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

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
 
doc/openbsd/login_ldap.txt · Dernière modification: 2009/12/23 22:36 (édition externe)     Haut de page