{{tag>fr fr:linux fr:serveur fr:authentification}} ====== 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 : * [[linux:phpldapadmin|PhpLdapAdmin]] est un site php permettant de browser et editer des serveurs LDAP, il est très simple d'installation * [[http://www.jxplorer.org/|JXplorer]] : un client LDAP open source relativement riche. * D'autres outils présentés [[http://www.zytrax.com/books/ldap/apb/#tools|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 [[#Exporter des données LDIF|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 [[linux:phpldapadmin|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 ####################################################################### # 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 # 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 ===== * Serveur web : voir [[Serveur Web]] * Serveur FTP : voir [[Proftpd]] * Dokuwiki : voir [[linux:dokuwiki:ldap]] ===== Backup ===== * /etc/ldap/slapd.conf * /etc/ldap/schema/mbo.schema * /var/lib/ldap ===== Links ===== * [[linux:phpldapadmin|PhpLdapAdmin]] * [[http://www.openldap.org/]] * [[http://www.openldap.org/doc/admin23/]] * [[http://www-unix.mcs.anl.gov/~gawor/ldap/]]