OpenLDAP

OpenLDAP est un serveur LDAP assez répandu. Le protocole LDAP permet de d'interroger un annuaire centralisé.

Les annuaires sont très souvent utilisés pour stocker les comptes utilisateurs d'un système d'information.

Installation

Les paquets suivants sont nécessaires pour installer un serveur LDAP :

  • slapd
  • ldap-utils

Lors de l'installation, le mot de passe du super administrateur est saisi. Le compte administrateur est “cn=admin” directement à la racine de l'arbre.

Par défaut l'accès anonyme au serveur LDAP est autorisé.

Pour vérifier que le serveur LDAP répond, utiliser la commande :

ldapsearch -x

Exemple :

:~# ldapsearch -x
# extended LDIF
#
# LDAPv3
# base <> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# search result
search: 2
result: 32 No such object

# numResponses: 1
:~#

Configuration

Afin de reconfigurer la racine de l'arbre, le plus simple consiste à utiliser dpkg-reconfigure.

# dpkg-reconfigure slapd
 Voulez-vous omettre la configuration d'OpenLDAP ? non
 Nom de domaine : bouthors.fr
 Nom de l'organisation : Matthieu Bouthors
 Mot de passe de l'administrateur : XXX
 Mot de passe de l'administrateur : XXX
 Module de base de données à utiliser : HDB
 Faut-il supprimer la base de données à la purge du paquet ? non
 Faut-il déplacer l'ancienne base de données ? oui
 Faut-il autoriser le protocole LDAPv2 ? non

Une fois cette manipulation effectuée, vérifier ensuite que le compte administrateur fonctionne avec la commande :

ldapsearch -x -D [admin user] -W

Exemple :

:~# ldapsearch -x -D "cn=admin,dc=bouthors,dc=fr" -W
Enter LDAP Password:
# extended LDIF
#
# LDAPv3
# base <> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# search result
search: 2
result: 32 No such object

# numResponses: 1
:~#

Il est ensuite possible de désactiver le BIND anonyme en ajoutant les commandes suivantes :

#######################################################################
# Disable Anonymous Bind
require authc
disallow bind_anon

Le bind anonyme est alors interdit :

:~# ldapsearch -x
ldap_bind: Inappropriate authentication (48)
        additional info: anonymous bind disallowed
:~#

Debug des requêtes LDAP

Pour comprendre pourquoi une requête LDAP ne fonctionne pas, il est souvent nécessaire de tracer les appels LDAP au serveur. La méthode la plus simple consiste à définir le niveau de debug du serveur. Par exemple en lançant le serveur avec la ligne suivante :

slapd -d 256

Cela affichera l'ensemble des requêtes reçues par le serveur ainsi que leurs réponses.

De plus, pour afficher le dump des paquets, il est possible d'utiliser :

slapd -d 272

Voici la liste des debug, pour en activer plusieurs à la fois, il suffit d'additionner les valeurs :

levels are additive, and available levels are:
    1      (0x1 trace) trace function calls
    2      (0x2 packet) debug packet handling
    4      (0x4 args) heavy trace debugging (function args)
    8      (0x8 conns) connection management
    16     (0x10 BER) print out packets sent and received
    32     (0x20 filter) search filter processing
    64     (0x40 config) configuration file processing
    128    (0x80 ACL) access control list processing
    256    (0x100 stats) stats log connections/operations/results
    512    (0x200 stats2) stats log entries sent
    1024   (0x400 shell) print communication with shell backends
    2048   (0x800 parse) entry parsing
    4096   (0x1000 cache) caching (unused)
    8192   (0x2000 index) data indexing (unused)
    16384  (0x4000 sync) LDAPSync replication
    32768  (0x8000  none)  only  messages that get logged whatever
           log level is set
    -1     (any) log all

Clients LDAP

Afin de simplifier l'administration et la modification de l'arbre, les outils suivants sont très pratiques :

  • PhpLdapAdmin est un site php permettant de browser et editer des serveurs LDAP, il est très simple d'installation
  • JXplorer : un client LDAP open source relativement riche.
  • D'autres outils présentés ici

Manipuler des éléments dans le LDAP

Une fois que le serveur fonctionne, il faut ensuite définir son arborescence et y ajouter des entrées.

Importer des données LDIF avec slapadd

slapadd permet d'importer directement des données dans la base de donnée de slapd. Cela a pour avantage de pouvoir modifier des attributs internes (date de création/modification) très utile pour une restauration de base.

C'est en particulier la commande idéale pour réimporter le résultat de la commande slapcat décrit plus bas.

Le principal inconvénient de slapadd est qu'il nécessite l'arrêt du serveur ldap pour pouvoir être utilisé.

:!: vérifier que slapd est bien propriétaire des fichiers après utilisation de slapadd, sinon il refusera de redémarrer.

Exemple :

:/var/lib/ldap# /etc/init.d/slapd stop
Stopping OpenLDAP: slapd.
:/var/lib/ldap# ps aux|grep ldap
root     32212  0.0  0.0   6480   776 pts/0    R+   11:27   0:00 grep ldap
:/var/lib/ldap# rm -Rf *
:/var/lib/ldap# l
total 0
:/var/lib/ldap# slapadd -l /root/ldif
/etc/ldap/slapd.conf: line 109: rootdn is always granted unlimited privileges.
/etc/ldap/slapd.conf: line 127: rootdn is always granted unlimited privileges.
:/var/lib/ldap# chown openldap:openldap *
:/var/lib/ldap# l
total 1100
-rw-r--r-- 1 openldap openldap    2048 2007-12-16 11:29 alock
-rw------- 1 openldap openldap    8192 2007-12-16 11:28 __db.001
-rw------- 1 openldap openldap 2629632 2007-12-16 11:28 __db.002
-rw------- 1 openldap openldap   98304 2007-12-16 11:28 __db.003
-rw------- 1 openldap openldap  868352 2007-12-16 11:28 __db.004
-rw------- 1 openldap openldap   24576 2007-12-16 11:28 __db.005
-rw-r--r-- 1 openldap openldap      96 2007-12-16 11:28 DB_CONFIG
-rw------- 1 openldap openldap   20480 2007-12-16 11:28 dn2id.bdb
-rw------- 1 openldap openldap   81920 2007-12-16 11:28 id2entry.bdb
-rw------- 1 openldap openldap  188602 2007-12-16 11:28 log.0000000001
-rw------- 1 openldap openldap    8192 2007-12-16 11:28 objectClass.bdb
:/var/lib/ldap# /etc/init.d/slapd start
Starting OpenLDAP: slapd.
:/var/lib/ldap# ps aux|grep sla
openldap 32335  0.0  0.3  48820  3440 ?        Ssl  11:32   0:00 /usr/sbin/slapd -g openldap -u openldap
root     32338  0.0  0.0   6476   776 pts/0    R+   11:32   0:00 grep sla
:/var/lib/ldap#

Importer des données LDIF avec ldapadd

La commande ldapadd permet d'ajouter des nouvelles entrées à l'arbre :

ldapadd -D [user] -W

Exemple :

:~# ldapadd -x -D "cn=admin,dc=bouthors,dc=fr" -W
Enter LDAP Password:
dn: cn=user1,ou=Users,dc=bouthors,dc=fr
cn: user1
sn: first user
objectClass: inetOrgPerson
objectClass: top

adding new entry "cn=user1,ou=Users,dc=bouthors,dc=fr"

:~#

Exporter des données LDIF

slapcat permet d'exporter le contenu du serveur LDAP au format LDIF.

slapcat -l fichier

:!: 2011-01-16 Il y a actuellement un bug dans debian avec la commande slapcat (http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=598361), le message d'erreur suivant apparaît :

hdb_db_open: database "dc=bouthors,dc=fr": unclean shutdown detected; attempting recovery.
hdb_db_open: database "dc=bouthors,dc=fr": recovery skipped in read-only mode. Run manual recovery if errors are encountered.

Ce problème peut être contourné en arrêtant la slapd pendant l'exécution de slapcat.

Exemple

Voici un exemple de création de 2 OU et quelques entrées :

  • OU=Users
    • CN=user1
    • CN=user2
  • OU=Groups
    • CN=Nomades

Les 2 utilisateurs sont membre du groupe Nomades.

Pour cet exemple, les utilisateurs sont de type inetOrgPerson et les groupes de type GroupOfUniqueName

Voici les données brutes (au format LDIF) que nous souhaitons importer :

dn: ou=Users,dc=bouthors,dc=fr
ou: Users
objectClass: organizationalUnit
objectClass: top

dn: ou=Groups,dc=bouthors,dc=fr
ou: Groups
objectClass: organizationalUnit
objectClass: top

dn: cn=user1,ou=Users,dc=bouthors,dc=fr
cn: user1
sn: first user
objectClass: inetOrgPerson
objectClass: top

dn: cn=user2,ou=Users,dc=bouthors,dc=fr
cn: user2
sn: second user
objectClass: inetOrgPerson
objectClass: top

dn: cn=Nomades,ou=Groups,dc=bouthors,dc=fr
cn: Nomades
objectClass: groupOfUniqueNames
objectClass: top
uniqueMember: cn=user1,ou=Users,dc=bouthors,dc=fr
uniqueMember: cn=user2,ou=Users,dc=bouthors,dc=fr

Il suffit d'utiliser ldapadd comme indiqué ci-dessus pour les ajouter.

En utilisant slapcat, les nouvelles entrées doivent apparaîtrent dans l'export LDIF.

Modifier le schéma

Le schéma LDAP définit les structures utilisables pour les entrées de l'annuaire. Il arrive fréquemment que les types prédéfinit par les RFC ne suffisent pas.

Par exemple, voici définit 2 nouveaux types :

Le type mboUser contient les champs suivants :

  • cn (obligatoire) : login de l'utilisateur et identifiant unique
  • sn : nom complet
  • mail : email
  • uidNumber : numéro UID
  • gidNumber : numéro de group GID
  • description : description
  • userPassword : mot de passe
  • homeDirectory : répertoire personnel
  • loginShell : shell
  • preferredLanguage : language
  • memberOf : groupes de l'utilisateur (attribut personnalisé)

Le type mboGroup contient les champs suivants :

  • cn (obligatoire) : nom du groupe et identifiant unique
  • gidNumber : numéro du groupe
  • uniqueMember : liste des DN appartenant au groupe (en particulier est entrées de type mboUser)
  • description : description

Voici comment configurer OpenLDAP :

  • créer un fichier de schéma /etc/ldap/schema/mbo.schema avec le contenu suivant :
#attribut exemple de type nom
attributetype (1.3.6.1.4.1.200579.1.101 NAME 'mboNom'
        DESC 'attribut exemple de type nom'
        SUP name )

#attribut exemple de type date
attributetype ( 1.3.6.1.4.1.200579.1.102 NAME 'mboDate'
        DESC 'attribut exemple de type date'
        EQUALITY generalizedTimeMatch
        ORDERING generalizedTimeOrderingMatch
        SYNTAX 1.3.6.1.4.1.1466.115.121.1.24
        SINGLE-VALUE
        )

#attribut de type DN multivalue
attributetype ( 1.3.6.1.4.1.200579.1.1 NAME 'memberOf'
        DESC 'list groups DN of the user'
        SUP uniqueMember )

objectclass ( 1.3.6.1.4.1.200579.2.1 NAME 'mboUser'
        DESC 'Define a user for bouthors.fr'
        SUP top
        STRUCTURAL
        MUST (cn)
        MAY (
                sn $ mail $ uidNumber $ gidNumber $ description $
                userPassword $ homeDirectory $ loginShell $
                preferredLanguage $ memberOf
                 )
        )

objectclass ( 1.3.6.1.4.1.200579.2.2 NAME 'mboGroup'
        DESC 'Define a group for bouthors.fr'
        SUP top STRUCTURAL
        MUST (cn)
        MAY (gidNumber $ uniqueMember $ description) )
  • charger ce schéma dans openldap, dans /etc/ldap/slapd.conf, ajouter :
include         /etc/ldap/schema/mbo.schema

Ces types sont ensuite utilisables pour créer des entrées, ils apparaissent notamment dans le schéma PhpLdapAdmin.

Exemple de LDIF avec schéma personnalisé de bender

version: 1

# Exportation LDIF pour : dc=bouthors,dc=fr
# Généré par phpLDAPadmin ( http://phpldapadmin.sourceforge.net/ ) pour December 22, 2007 11:50 am
# Serveur: My LDAP Server (localhost)
# Portée de la recherche: sub
# Filtre de recherche: (objectClass=*)
# Entrées totales: 50

dn: dc=bouthors,dc=fr
objectClass: top
objectClass: dcObject
objectClass: organization
o: bouthors.fr
dc: bouthors

dn: cn=admin,dc=bouthors,dc=fr
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator
userPassword:

dn: ou=groups,dc=bouthors,dc=fr
ou: groups
objectClass: organizationalUnit
objectClass: top

dn: cn=web,ou=groups,dc=bouthors,dc=fr
cn: web
objectClass: mboGroup
uniqueMember: cn=matthieu,ou=users,dc=bouthors,dc=fr

dn: ou=services,dc=bouthors,dc=fr
ou: services
objectClass: organizationalUnit
objectClass: top

dn: cn=apache,ou=services,dc=bouthors,dc=fr
cn: apache
sn: apache
objectClass: person
objectClass: top
userPassword:

dn: ou=users,dc=bouthors,dc=fr
ou: users
objectClass: organizationalUnit
objectClass: top

dn: cn=matthieu,ou=users,dc=bouthors,dc=fr
cn: matthieu
sn: Matthieu Bouthors
objectClass: mboUser
loginShell: /bin/false
preferredLanguage: fr
uidNumber: 1000
gidNumber: 1000
homeDirectory: /ftp
mail: matthieu@bouthors.fr
userPassword:

Exemple de fichier slapd.conf

# This is the main slapd configuration file. See slapd.conf(5) for more
# info on the configuration options.

#######################################################################
# Global Directives:

# Features to permit
#allow bind_v2

# Schema and objectClass definitions
include         /etc/ldap/schema/core.schema
include         /etc/ldap/schema/cosine.schema
include         /etc/ldap/schema/nis.schema
include         /etc/ldap/schema/inetorgperson.schema
include         /etc/ldap/schema/mbo.schema

# Where the pid file is put. The init.d script
# will not stop the server if you change this.
pidfile         /var/run/slapd/slapd.pid

# List of arguments that were passed to the server
argsfile        /var/run/slapd/slapd.args

# Read slapd.conf(5) for possible values
loglevel        none

# Where the dynamically loaded modules are stored
modulepath      /usr/lib/ldap
moduleload      back_hdb

# The maximum number of entries that is returned for a search operation
sizelimit 500

# The tool-threads parameter sets the actual amount of cpu's that is used
# for indexing.
tool-threads 1

#######################################################################
# Disable Anonymous Bind
require authc
disallow bind_anon

#######################################################################
# Specific Backend Directives for hdb:
# Backend specific directives apply to this backend until another
# 'backend' directive occurs
backend         hdb

#######################################################################
# Specific Backend Directives for 'other':
# Backend specific directives apply to this backend until another
# 'backend' directive occurs
#backend                <other>

#######################################################################
# Specific Directives for database #1, of type hdb:
# Database specific directives apply to this databasse until another
# 'database' directive occurs
database        hdb

# The base of your directory in database #1
suffix          "dc=bouthors,dc=fr"

# rootdn directive for specifying a superuser on the database. This is needed
# for syncrepl.
# rootdn          "cn=admin,dc=bouthors,dc=fr"

# Where the database file are physically stored for database #1
directory       "/var/lib/ldap"

# The dbconfig settings are used to generate a DB_CONFIG file the first
# time slapd starts.  They do NOT override existing an existing DB_CONFIG
# file.  You should therefore change these settings in DB_CONFIG directly
# or remove DB_CONFIG and restart slapd for changes to take effect.

# For the Debian package we use 2MB as default but be sure to update this
# value if you have plenty of RAM
dbconfig set_cachesize 0 2097152 0

# Sven Hartge reported that he had to set this value incredibly high
# to get slapd running at all. See http://bugs.debian.org/303057 for more
# information.

# Number of objects that can be locked at the same time.
dbconfig set_lk_max_objects 1500
# Number of locks (both requested and granted)
dbconfig set_lk_max_locks 1500
# Number of lockers
dbconfig set_lk_max_lockers 1500

# Indexing options for database #1
index           objectClass eq

# Save the time that the entry gets modified, for database #1
lastmod         on

# Checkpoint the BerkeleyDB database periodically in case of system
# failure and to speed slapd shutdown.
checkpoint      512 30

# Where to store the replica logs for database #1
# replogfile    /var/lib/ldap/replog

# The userPassword by default can be changed
# by the entry owning it if they are authenticated.
# Others should not be able to see it, except the
# admin entry below
# These access lines apply to database #1 only
access to attrs=userPassword,shadowLastChange
        by dn="cn=admin,dc=bouthors,dc=fr" write
        by anonymous auth
        by self write
        by * none

# Ensure read access to the base for things like
# supportedSASLMechanisms.  Without this you may
# have problems with SASL not knowing what
# mechanisms are available and the like.
# Note that this is covered by the 'access to *'
# ACL below too but if you change that as people
# are wont to do you'll still need this if you
# want SASL (and possible other things) to work
# happily.
access to dn.base="" by * read

# The admin dn has full write access, everyone else
# can read everything.
access to *
        by dn="cn=admin,dc=bouthors,dc=fr" write
        by * read

# For Netscape Roaming support, each user gets a roaming
# profile for which they have write access to
#access to dn=".*,ou=Roaming,o=morsnet"
#        by dn="cn=admin,dc=bouthors,dc=fr" write
#        by dnattr=owner write

#######################################################################
# Specific Directives for database #2, of type 'other' (can be hdb too):
# Database specific directives apply to this databasse until another
# 'database' directive occurs
#database        <other>

# The base of your directory for database #2
#suffix         "dc=debian,dc=org"

Performances et Index

En cas de problème de performance ou de message du type “bdb_equality_candidates”, il est possible de les résoudre par génération des index pour les recherches fréquentes dans le ldap.

Les étapes sont les suivantes :

  • ajouter les index dans slapd.conf :
# Indexing options for database #1
index           objectClass eq
index           cn eq
index           gidNumber eq
  • arrêter slapd
# /etc/init.d/slapd stop
Stopping OpenLDAP: slapd.
#
  • construire les index
# sudo -u openldap slapindex
  • démarrer slapd
# /etc/init.d/slapd start
Starting OpenLDAP: slapd.
#

Configurer les services pour l'authentification LDAP

Backup

  • /etc/ldap/slapd.conf
  • /etc/ldap/schema/mbo.schema
  • /var/lib/ldap

Links

linux/openldap.txt · Dernière modification: 2011/07/30 08:54 par matthieu
Recent changes RSS feed Debian Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki