LDAP : Installation et configuration d'un Annuaire LDAP

From Deimos.fr / Bloc Notes Informatique
Jump to: navigation, search
Flattr-badge-large.png

OpenLDAP

Software version 2.4.23+
Operating System Debian 6
Website OpenLDAP Website
Last Update 28/03/2013
Others

1 Introduction

Lightweight Directory Access Protocol (LDAP) est un protocole permettant l'interrogation et la modification des services d'annuaire. Ce protocole repose sur TCP/IP. Un annuaire LDAP respecte généralement le modèle X.500 édicté par l'UIT-T : c'est une structure arborescente dont chacun des nœuds est constitué d'attributs associés à leurs valeurs.

Le nommage des éléments constituant l'arbre (racine, branches, feuilles) reflète souvent le modèle politique, géographique ou organisationnel de la structure representée. La tendance actuelle est d'utiliser le nommage DNS pour les éléments de base de l'annuaire (racine et premières branches). Les branches plus profondes de l'annuaire peuvent représenter des personnes (people), des unités organisationnelles (organizational units), des groupes (groups), ...

           dc=fr
             |
         dc=example
        /          \
  ou=people     ou=groups

2 Installation

Pour installer OpenLDAP :

Command
apt-get install ldap-server ldap-client

Ceci va nous installer :

  • ldap-utils
  • slapd
  • libiodbc2
  • libldap-2.3-0

3 Configuration

3.1 slapd.conf

3.1.1 Méthode récente

Voici la méthode récente[1] pour configurer votre OpenLDAP (enfin...le début) :

Command dpkg-reconfigure
dpkg-reconfigure -plow slapd

Suivez ensuite les instructions

3.1.2 Ancienne méthode

Tout d'abord, nous allons générer un mot de passe crypté car nous allons avoir besoin de le mettre dans le fichier de configuration. Nous avons le choix de le mettre également en clair, mais pour des raisons de sécurité, il sera crypté :

Command slappasswd
# slappasswd
New password:
Re-enter new password:
{SSHA}5y67xJ/t7esuGKUD7TQPcgykd8xiYMO2

Copiez la dernière ligne {SSHA}5y67x... qui correspond au mot de passe crypté. Ici le mot de passe est admin.
Editez le fichier /etc/ldap/slapd.conf :

Configuration File /etc/ldap/slapd.conf
# La ligne suivante permet d’autoriser l’utilisation de la norme V2 de LDAP :
allow bind_v2

# La ligne suivante donne la racine de la base LDAP
suffix "dc=deimos,dc=fr"

# La ligne suivante qu’il faut ajouter manuellement donne le login de l’administrateur (admin avec le rappel de la racine).
# Cette ligne et la suivante sont obligatoires pour avoir un accès root sur la base depuis un programme externe (ex : PHP)
rootdn "cn=admin,dc=deimos,dc=fr"

# Collez le mot de passe que nous avons généré tout à l'heure :
# Admin password for OpenLDAP
rootpw {SSHA}5y67xJ/t7esuGKUD7TQPcgykd8xiYMO2

# Paramétrage de l’accès en écriture de la base. Il faut indiquer le bon login et la racine de la base :
access to attrs=userPassword,shadowLastChange
       by dn="cn=admin,dc=deimos,dc=fr" write
       by anonymous auth
       by self write
       by * none

#Paramétrage de l’accès en lecture seule de la base. Il faut indiquer le bon login et la racine de la base :
access to *
       by dn="cn=admin,dc=deimos,dc=fr" write
       by * read

Maintenant, pour que la configuration soit prise en compte, nous allons redémarrer le serveur :

Command
/etc/init.d/slapd restart

3.2 LDIF

Ce format de fichier est utilisé pour faire des imports / exports entre plusieurs bases ou pour modifier ou ajouter des données dans une base.

ATTENTION : Il est obligatoire de coder les données en UTF-8. Si lors de l’importation une erreur est rencontrée, celle-ci est abandonnée à l’endroit où elle en était.

3.2.1 Importer un schéma

Voici la structure d’un fichier LDIF :

dn: <distinguished name
   objectClass: <object class
   objectClass: <object class
   ...
   <attribute type:<attribute value
   <attribute type:<attribute value
   ...

Voici un exemple de fichier LDIF "AjoutRacine.ldif" pour créer la racine de l’arbre LDAP :

dn: dc=deimos,dc=fr
objectClass: dcObject
objectClass: organization
o: deimos Corporation
dc: deimos

Commande pour ajouter la racine :

Command ldapadd
ldapadd -x -D "cn=admin,dc=deimos,dc=fr" -w admin -f AjoutRacine.ldif

Vous pouvez également ne pas écrire en clair le mot de passe en demandant le prompt :

Command ldapadd
ldapadd -x -D "cn=admin,dc=deimos,dc=fr" -W -f AjoutRacine.ldif

Voici un exemple de fichier LDIF "AjoutFiche.ldif" pour créer une nouvelle fiche :

dn: cn=Pierre MAVRO,dc=deimos,dc=fr
objectClass: inetOrgPerson
cn: Pierre MAVRO
givenName: Pierre
sn: MAVRO

Certains champs du slapcat ne doivent figurer sous peine d'avoir l'erreur 19[2]. Nous allons donc utiliser sed pour faire le ménage :

Configuration File sed_ldif
/^creatorsName:/d
/^createTimestamp:/d
/^modifiersName:/d
/^modifyTimestamp:/d
/^structuralObjectClass:/d
/^entryUUID:/d
/^entryCSN:/d

Puis nous allons faire ce sed sur la totalité de notre ldif :

Command sed
sed -f sed_ldif import_unclear.ldif > import_clear.ldif

Maintenant nous pouvons importer le LDIF :

Command ldapadd
ldapadd -h localhost -x -W -D "cn=admin,dc=deimos,dc=fr" -c -f import_clear.ldif

3.2.2 Importer des enregistrements

Commande pour ajouter la fiche :

Command ldapadd
ldapadd -x -D "cn=admin,dc=deimos,dc=fr" -w admin -f AjoutFiche.ldif

3.2.3 Modifier des enregistrements

Les commandes de modification ont la syntaxe suivante :

dn: distinguished name
 changetype  {{TYPE}}
 change operation identifier
 list of attributes...
 ...
-
 change operation identifier
 list of attributes
 ...

TYPE peu avoir l’une des valeurs suivantes :

  • add (ajout d’une entrée),
  • delete (suppression),
  • modrdn (modification du RDN),
  • modify (modification : add, replace, delete d’un attribut)

Le fichier "ModifFiche.ldif" ci-dessous permet d’ajouter le numéro de téléphone :

dn: cn=Père Noël,dc=deimos,dc=fr
changetype: modify
add: telephonenumber
telephonenumber: 08 36 65 65 65

Commande pour modifier la fiche :

Command ldapadd
ldapadd -x -D "cn=admin,dc=deimos,dc=fr" -w admin -f ModifFiche.ldif

3.2.4 Supprimer des enregistrements

Le fichier "SuppFiche.ldif" ci-dessous permet de supprimer une fiche :

dn: cn=Pierre MAVRO,dc=deimos,dc=fr
changetype: delete

Commande pour supprimer la fiche :

Command ldapadd
ldapadd -x -D "cn=admin,dc=deimos,dc=fr" -w admin -f SuppFiche.ldif

4 Rechercher des enregistrements

Rechercher les enregistrements contenant un attribut objectclass (donc tous) depuis la racine :

Command ldapsearch
ldapsearch -x -b "dc=deimos,dc=fr" "objectclass=*"

Rechercher les enregistrements contenant un attribut cn dans la branche deimos :

Command ldapsearch
ldapsearch -x -b "o=deimos Corporation,dc=deimos,dc=fr" "cn=*"

Rechercher les enregistrements donc l’attribut dc se termine par gray depuis la racine :

Command ldapsearch
ldapsearch -x -b "dc=deimos,dc=fr" "dc=*gray"

5 Sauvegarde d’une base de données LDAP

La commande suivante permet de générer un fichier .LDIF contenant la base complète (sans le schéma ou la configuration) :

Command ldapcat
slapcat -l DumpLDAP.ldif -b "dc=deimos,dc=fr"

Pour sauvegarder schéma et configuration[3] :

Command slapcat
slapcat -b cn=config -l config.ldif

Pour sauvegarder le schéma uniquement :

Command slapcat
slapcat -b cn=schema -l config.ldif

6 Restaurer une base LDAP

Pour restaurer une configuration, voici la marche à suivre[4] :

Command
/etc/init.d/slapd stop
rm -rf /etc/ldap/slapd.d/*
su - openldap -c "slapadd -F /etc/ldap/slapd.d -b cn=config -l config.ldif"
/etc/init.d/slapd start

7 Scripts PHP

  • Exemple de script PHP pour se connecter au serveur LDAP :
Configuration File
$server="localhost";
$port="389";
$dn="dc=deimos,dc=fr";
$rootdn="cn=admin,$dn";
$rootpw="admin";

$ds=ldap_connect($server,$port);
ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);
$r=ldap_bind($ds,$rootdn,$rootpw)
        or die ("Impossible de se connecter au serveur ! \n");
echo "Authentification sur le serveur OpenLDAP -> OK \n\n";

  • Exemple de script PHP pour rechercher des enregistrements :
Configuration File
$sr=ldap_search($ds,$dn,"(objectclass=*)");
if ($sr) {
        $info=ldap_get_entries($ds,$sr);
        echo $info["count"]." enregistrements dans OpenLDAP \n";
        for ($i=0;$i<=$info["count"];$i++) {
                echo "$i - ".$info[$i]["dn"]." \n";
        }
}

8 Liste partielle d'attributs

8.1 Classe organization

Ldap att org.jpg

8.2 Classe inetOrgPerson

Ldap att inetOrgPerson.jpg

9 Clients

9.1 Installation

9.1.1 Debian

Pour pouvoir se connecter à l'annuaire OpenLDAP, nous aurons besoin de plusieurs choses :

Command apt-get
aptitude install libnss-ldapd libpam-smbpass libpam-mount

9.1.2 Red Hat

Sur Red Hat, il n'y a pas grand chose à installer :

Command yum
yum install nss-pam-ldapd

9.2 Configuration

D'une manière générale, les clients unix peuvent s'authentifier en utilisant les informations contenues dans l'annuaire LDAP via PAM et NSS. Il sufft donc d'installer et de configurer ces composants sur les différents systèmes.

9.2.1 Debian

Vous avez le choix d'installer libpam-ldapd ou libpam-ldap. libpam-ldapd est plus récent et évite quelques bugs vu sur libpam-ldap. A vous de voir ce que vous voulez :-)

9.2.1.1 libpam-ldapd

Si vous optez pour libnss-ldapd, alors vous n'avez simplement qu'a installer ceci et répondre aux questions.

Command aptitude
aptitude install libnss-ldapd

9.2.1.2 libpam-ldap

Si vous avez choisi d'installer libpam-ldap à la place de libpam-ldapd, vous allez devoir faire ceci à la main.

Par défaut, debian créé deux fichiers de configuration différents pour libpam-ldap et libnss-ldap. Ceci est inutile vu que ces deux fichiers vont contenir la même chose. Il faut supprimer les fichiers de configuration libpam-ldap et créer des liens depuis ceux de libnss-ldap ver ceux de libpam-ldap:

Command
rm /etc/pam_ldap.*
ln -s /etc/libnss-ldap.conf /etc/pam_ldap.conf
ln -s /etc/libnss-ldap.secret /etc/pam_ldap.secret

Editer /etc/libnss-ldap.conf et y mettre (il ne doit contenir que ces lignes) :

Configuration File /etc/libnss-ldap.conf
uri ldap://ldap.mydomain.local/
base dc=openldap,dc=mydomain,dc=local
ldap_version 3
rootbinddn cn=admin,dc=openldap,dc=mydomain,dc=local
scope sub
nss_paged_results yes
pagesize 1000
nss_base_passwd dc=openldap,dc=mydomain,dc=local?sub?&(&(objectClass=posixAccount)(!(objectClass=computer)))
nss_base_shadow dc=openldap,dc=mydomain,dc=local?sub

Dans /etc/libnss-ldap.secret, indiquer le mot de passe de l'utilisateur indiquer sur la ligne rootdn du fichier /etc/libnss-ldap.conf.

Vous devez ensuite modifier le fichier /etc/nsswitch.conf afin d'y indiquer que la recherche se fera entre autre dans l'annuaire ldap pour les différents services. Cela donne par exemple :

Configuration File /etc/nsswitch.conf
passwd:         files ldap
group:          files ldap
shadow:         files ldap

hosts:          files dns
networks:       files

protocols:      db files
services:       db files
ethers:         db files
rpc:            db files

netgroup:       nis

9.2.1.3 libpam-ldapd et libpam-ldap

Enfin, il faut modifier les chaines pam pour que celles-ci permettent l'authentification via l'annuaire ldap. Ceci se fait en copiant les différents fichier /etc/pam.d/common-* vers /etc/pam.d/common-*-ldap :

Command
cd /etc/pam.d
cp common-account{,-ldap}        
cp common-auth{,-ldap}
cp common-pammount{,-ldap}
cp common-password{,-ldap}
cp common-session{,-ldap}

Editer les différents fichiers /etc/pam.d/common-*-ldap pour avoir :

  • /etc/pam.d/common-account-ldap :
Configuration File /etc/pam.d/common-account-ldap
account sufficient      pam_ldap.so
account sufficient      pam_unix.so use_first_pass
account required        pam_deny.so

  • /etc/pam.d/common-auth-ldap
Configuration File /etc/pam.d/common-auth-ldap
auth    required        pam_nologin.so
auth    sufficient      pam_unix.so nullok_secure
auth    optional        pam_mount.so debug use_first_pass
auth    optional        pam_smbpass.so migrate use_first_pass
auth    sufficient      pam_ldap.so use_first_pass
auth    required        pam_deny.so

  • /etc/pam.d/common-password-ldap
Configuration File /etc/pam.d/common-password-ldap
password   required   pam_smbpass.so migrate
password   sufficient pam_ldap.so try_first_pass
password   sufficient pam_unix.so try_first_pass nullok obscure min=4 max=8 md5
password   required   pam_deny.so

  • /etc/pam.d/common-session-ldap
Configuration File /etc/pam.d/common-session-ldap
session required        pam_unix.so
session required        pam_ldap.so
session required        pam_mkhomedir.so skel=/etc/skel/ umask=0022
session optional        pam_mount.so

  • /etc/pam.d/common-session
Configuration File /etc/pam.d/common-session
session required        pam_mkhomedir.so skel=/etc/skel/ umask=0022
session sufficient      pam_ldap.so
session required        pam_unix.so

Une fois ces fichiers common-*-ldap créés, on peut éditer les fichiers des différents services pour lesquels on veut autoriser l'authentification par ldap... Si par exemple on veut permettre aux utilisateurs contenus dans l'annuaire LDAP de se connecter en ssh sur la machine, on edite le fichier /etc/pam.d/ssh et on remplace les common-qqc en common-qqc-ldap.

Pour l'automount des partitions en fonction de l'utilisateur, éditez le fichier /etc/security/pam_mount.conf :

Configuration File /etc/security/pam_mount.conf
volume * cifs 192.168.0.30 &$ /media/windows/& sfu - -

Si vous ne pouvez toujours pas vous connecter, redémarrer le service nscd :

Command
/etc/init.d/nscd restart

La commande suivante doit fonctionner correctement :

Command getent
getent passwd mon_user

9.2.1.4 Autoriser un groupe LDAP en particulier

Une des méthodes courantes est de n'autoriser qu'un ou certains groupes du LDAP à accéder à une machine. Pour celà, il faudra que les groupes aient comme attribut posixGroup nommé login.

9.2.1.4.1 Debian

Installez libpam-modules si ce n'est pas déjà fait :

Command aptitude
aptitude install libpam-modules

Ensuite ajoutez cette ligne dans le fichier /etc/pam.d/common-auth :

Configuration File /etc/pam.d/common-auth
...
auth required    pam_access.so

9.2.1.4.2 Red Hat

Installez ce package :

Command yum
yum install pam-devel

Et ajoutez cette ligne sur le service que vous souhaitez (sshd par exemple), la restriction :

Configuration File /etc/pam.d/sshd
auth       include      password-auth
account    required     pam_access.soaccount    required     pam_nologin.so

9.2.1.4.3 Configuration

Celà va nous permettre d'utiliser le fichier /etc/security/access.conf. Et voici le genre de ligne qu'il faut rajouter :

Configuration File /etc/security/access.conf
...
# disallow all except people in the login group and root
-:ALL EXCEPT root (sysadmin):ALL EXCEPT LOCAL

Ceci permet de désactiver tous les comptes sauf :

  • root
  • Le groupe sysadmin (pas l'utilisateur grâce aux parenthèses)
  • LOCAL : les utilisateurs locaux

9.2.2 Red Hat

Il existe 2 méthodes. La première passe par un script Red Hat qui va nous faire tout pour nous, tandis que la deuxième est la solution manuelle.

9.2.2.1 Méthode 1

Pour configurer PAM avec LDAP, utilisez cette commande et adaptez la à vos besoins :

Command authconfig
authconfig --enableldap --enableldapauth --ldapserver=ldap://openldap-server.deimos.fr:389 --ldapbasedn="dc=openldap,dc=deimos,dc=fr" --enableldaptls --ldaploadcacer=http://serveur-web/deimosfr.crt --enablemkhomedir --update

  • --ldapserver : rentrez l'adresse de votre serveur web
  • --ldapbasedn : le DN de votre serveur
  • --enableldaptls : si vous utilisez des connections LDAP sécurisées
  • --ldaploadcacer : le certificat à utiliser (si vous n'avez pas moyen de le récupérer de cette façon, regardez la procédure un peu plus bas)

ou une version sans ssl/tls :

Command authconfig
authconfig --enableldap --enableldapauth --disablenis --disableshadow --enablecache  --passalgo=sha512 --disableldaptls --disableldapstarttls --disablesssdauth --enablemkhomedir --enablepamaccess --enablecachecreds --enableforcelegacy --disablefingerprint  --ldapserver=192.168.0.1 --ldapbasedn=dc=openldap,dc=deimos,dc=fr --updateall

Pour récupérer le certificat ssl demandé plus haut, voici une solution :

Command openssl
> openssl s_client -connect openldap-server.deimos.fr:636CONNECTED(00000003)
depth=0 C = FR, ST = IDF, L = Paris, O = DEIMOS, CN = openldap-server.deimos.fr, emailAddress = deimos@deimos.fr
verify error:num=18:self signed certificate
verify return:1
depth=0 C = FR, ST = IDF, L = Paris, O = DEIMOS, CN = openldap-server.deimos.fr, emailAddress = deimos@deimos.fr
verify return:1
---
Certificate chain
 0 s:/C=FR/ST=IDF/L=Paris/O=DEIMOS/CN=openldap-server.deimos.fr/emailAddress=deimos@deimos.fr
   i:/C=FR/ST=IDF/L=Paris/O=DEIMOS/CN=openldap-server.deimos.fr/emailAddress=deimos@deimos.fr
---
Server certificate
-----BEGIN CERTIFICATE-----MIIDpTCCAw6gAwIBAgIJAJJUJLhNM1/XMA0GCSqGSIb3DQEBBQUAMIGUMQswCQYDVQQGEwJGUjEMMAoGA1UECBMDSURGMQ4wDAYDVQQHEwVQYXJpczEPMA0GA1UEChMGVUxMSU5LMREwDwYDVQQLEwh1bHN5c25ldDEcMBoGA1UEAxMTdGFzbWFuaWEMdWxsaW5rLmxhbjElMCMGCSqGSIb3DQEJARYWaW503XJuYWwtaXRAdWxsaW5rLmNvbTAeFw0xMTEyMDUxMjQzMzVaFw0yMTEyMDIxMjQzMzVaMIGUMQswCQYDVQQGEwJGUjEMMAoGA1UECBMDSURGMR4wDAYDVQQHEwVQYXJpczEPMA0GA1UEChMGVUxMSU5LMREwDwYDVQQLEwh1bHN5c25ldDEcMBoGA1UEAxMTdGFzbWFuaWEudWxsaW5rLmxhbjElMCMGCSqGSIb3DQEJARYWaW50ZXJuYWwtaXRAdWxsaW5rLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA4QoXFn39LhMW7mlA9r3NOX6iTHCCSlZjVQi0mQ5kBVysN8KMFfC0E4vOeG1Z11AYwW7xCOb4Pl+LgfgfdgfgfdJIn92LX0meJcsgWKOhqVAsZNkWn2ss8oDw3t5NEOjKFZ5BKVR2fL4Yj23DmFOAwew5PR5xhxGV5LJ9VErSKs0CAwEAAaOB/DCB+TAdBgNVHQ4EFgQUn5Ig2hFtROXcG3vxux7izNqcUd4wgckGA1UdIwSBwTCBvoAUn5Ig2hFtROXcG3vxux7izNqcUd6hgZqkgZcwgZQxCzAJBgNVBAYTAkZSMQwwCgYDVQQIEwNJREYxDjAMBgNVBAcTBVBhcmlzMQ8wDQYDVQQKEwZVTExJTksxETAPBgNVBAsTCHVsc3lzbmV0MRwwGgYDVQQDExN0YXNtYW5pYS51bGxpbmsubGFuMSUwIwYJKoZIhvcNAQkBFhZpbnRlcm5hbC1pdEB1bGxpbmsuY29tggkAklQkuE0zX9cwDAYCVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOBgQAbjjAbcBezdKyq+Tlf3/DURW0BJhHKyY7UW7L39m/KZRIB2lbgFjslrAL4yNnFgipJ6aKlJFfVBYEu7MhKH2pJZBYFpzuHOdKvDq+Kmn/wGvxeOvzh1GzQPGhQv4cClm2PJNMh/jrKZWNzqyLWYtWAoLu6N6gMER1Bd1Z5uzHl3A==-----END CERTIFICATE-----  subject=/C=FR/ST=IDF/L=Paris/O=DEIMOS/CN=openldap-server.deimos.fr/emailAddress=deimos@deimos.fr
issuer=/C=FR/ST=IDF/L=Paris/O=DEIMOS/CN=openldap-server.deimos.fr/emailAddress=deimos@deimos.fr
---
No client certificate CA names sent
---
SSL handshake has read 1291 bytes and written 311 bytes
---
New, TLSv1/SSLv3, Cipher is AES256-SHA
Server public key is 1024 bit
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1
    Cipher    : AES256-SHA 
    Session-ID: 91E6398F6DE9FBDC1B7EBDF890FE818B09EB79555C9FC1CF64EDC284F7A23B2A
    Session-ID-ctx:
    Master-Key: 51408932336792F4E8F5339BD12F312005022A4B20E6A5FBC56239BC0DD514344449531973B9A8395B1E799196D8F411
    Key-Arg   : None
    Krb5 Principal: None   
    PSK identity: None
    PSK identity hint: None
    Start Time: 1327491823 
    Timeout   : 300 (sec)  
    Verify return code: 18 (self signed certificate)
---

Dans le cas ou le certificat est récupérer de la manière manuelle, copiez le dans /etc/openldap/cacerts/ldap.crt, puis exécutez la commande suivante :

Command cacertdir_rehash
cacertdir_rehash /etc/openldap/cacerts

9.2.2.2 Méthode 2

Modifier /etc/ldap.conf. Ce fichier est l'équivalent de /etc/libnss_pam.conf sous debian. Vous pouvez donc y mettre la même chose.

Modifier le fichier /etc/pam.d/system_auth : c'est l'équivalent des différents common-* sous debian. Cela donne par exemple:

Configuration File /etc/pam.d/system_auth
auth        required      /lib/security/$ISA/pam_env.so
auth        sufficient    /lib/security/$ISA/pam_unix.so likeauth nullok
auth        sufficient    /lib/security/$ISA/pam_ldap.so use_first_pass
auth        required      /lib/security/$ISA/pam_deny.so

account     sufficient    /lib/security/$ISA/pam_unix.so
account     sufficient    /lib/security/$ISA/pam_ldap.so
account     sufficient    /lib/security/$ISA/pam_succeed_if.so uid < 100 quiet
account     required      /lib/security/$ISA/pam_permit.so

password    requisite     /lib/security/$ISA/pam_cracklib.so retry=3
password    sufficient    /lib/security/$ISA/pam_unix.so nullok use_authtok md5 shadow
password    required      /lib/security/$ISA/pam_deny.so

session     optional      /lib/security/$ISA/pam_mkhomedir.so skel=/etc/skel/ umask=0077
session     required      /lib/security/$ISA/pam_limits.so
session     required      /lib/security/$ISA/pam_unix.so

Comme sur debian, il faut également modifier le fichier /etc/nsswitch.conf.

9.2.3 Forcer un shell au login

Si vous avez une authentification de pam via LDAP, il est possible de forcer un shell en particulier au login. Il va donc overrider les informations envoyées par NSS et les remplacer par le shell souhaité. Nous allons utiliser ici lshell pour toutes les personnes se connectant via LDAP :

Configuration File /etc/libnss-ldap.conf ou /etc/ldap.conf
nss_override_attribute_value loginShell /usr/bin/lshell

9.2.4 Solaris

  • Configurer le fichier /etc/pam.conf :

Pour chaque ligne :

Configuration File /etc/pam.conf
service  auth required           pam_unix_auth.so.1

remplacer "required" par "sufficient" et ajouter derrière la ligne :

Configuration File /etc/pam.conf
service auth sufficient pam_ldap.so.1 try_first_pass

Ce qui doit donner quelquechose comme ceci :

Configuration File /etc/pam.conf
#
#ident  "@(#)pam.conf   1.28    04/04/21 SMI"
#
# Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
# Use is subject to license terms.
#
# PAM configuration
#
# Unless explicitly defined, all services use the modules
# defined in the "other" section.
#
# Modules are defined with relative pathnames, i.e., they are
# relative to /usr/lib/security/$ISA. Absolute path names, as
# present in this file in previous releases are still acceptable.
#
# Authentication management
#
# login service (explicit because of pam_dial_auth)
#
login   auth requisite          pam_authtok_get.so.1
login   auth required           pam_dhkeys.so.1
login   auth required           pam_unix_cred.so.1
login   auth sufficient         pam_ldap.so.1 try_first_pass
login   auth sufficient         pam_unix_auth.so.1
login   auth required           pam_dial_auth.so.1
#
# rlogin service (explicit because of pam_rhost_auth)
#
rlogin  auth sufficient         pam_rhosts_auth.so.1
rlogin  auth requisite          pam_authtok_get.so.1
rlogin  auth required           pam_dhkeys.so.1
rlogin  auth required           pam_unix_cred.so.1
rlogin  auth sufficient         pam_ldap.so.1 try_first_pass
rlogin  auth sufficient         pam_unix_auth.so.1
#
# Kerberized rlogin service
#
krlogin auth required           pam_unix_cred.so.1
krlogin auth binding            pam_krb5.so.1
krlogin auth sufficient         pam_ldap.so.1
krlogin auth sufficient         pam_unix_auth.so.1
#
# rsh service (explicit because of pam_rhost_auth,
# and pam_unix_auth for meaningful pam_setcred)
#
rsh     auth sufficient         pam_rhosts_auth.so.1
rsh     auth required           pam_unix_cred.so.1
#
# Kerberized rsh service
#
krsh    auth required           pam_unix_cred.so.1
krsh    auth binding            pam_krb5.so.1
krsh    auth sufficient         pam_ldap.so.1
krsh    auth sufficient         pam_unix_auth.so.1
#
# Kerberized telnet service
#
ktelnet auth required           pam_unix_cred.so.1
ktelnet auth binding            pam_krb5.so.1
ktelnet auth sufficient         pam_ldap.so.1
ktelnet auth sufficient         pam_unix_auth.so.1
#
# PPP service (explicit because of pam_dial_auth)
#
ppp     auth requisite          pam_authtok_get.so.1
ppp     auth required           pam_dhkeys.so.1
ppp     auth required           pam_unix_cred.so.1
ppp     auth sufficient         pam_ldap.so.1
ppp     auth sufficient         pam_unix_auth.so.1
ppp     auth required           pam_dial_auth.so.1
#
# Default definitions for Authentication management
# Used when service name is not explicitly mentioned for authentication
#
other   auth requisite          pam_authtok_get.so.1
other   auth required           pam_dhkeys.so.1
other   auth required           pam_unix_cred.so.1
other   auth sufficient         pam_ldap.so.1
other   auth sufficient         pam_unix_auth.so.1
#
# passwd command (explicit because of a different authentication module)
#
passwd  auth required           pam_passwd_auth.so.1
#
# cron service (explicit because of non-usage of pam_roles.so.1)
#
cron    account required        pam_unix_account.so.1
#
# Default definition for Account management
# Used when service name is not explicitly mentioned for account management
#
other   account requisite       pam_roles.so.1
other   account required        pam_unix_account.so.1
#
# Default definition for Session management
# Used when service name is not explicitly mentioned for session management
#
other   session required        pam_unix_session.so.1
#
# Default definition for  Password management
# Used when service name is not explicitly mentioned for password management
#
other   password required       pam_dhkeys.so.1
other   password requisite      pam_authtok_get.so.1
other   password requisite      pam_authtok_check.so.1
other   password required       pam_authtok_store.so.1
#
# Support for Kerberos V5 authentication and example configurations can
# be found in the pam_krb5(5) man page under the "EXAMPLES" section.
#

  • Configurer le fichier /etc/nsswitch.ldap

Laisser "ldap" uniquement là où c'est utile : pour le moment sur les lignes passwd: et group:.
Pour le reste, mettre le contenu du fichier /etc/nsswitch.dns.
Ce qui donne :

Configuration File /etc/nsswitch.ldap
#
# Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
# Use is subject to license terms.
#
 
#
# /etc/nsswitch.dns:
#
# An example file that could be copied over to /etc/nsswitch.conf; it uses
# DNS for hosts lookups, otherwise it does not use any other naming service.
#
# "hosts:" and "services:" in this file are used only if the
# /etc/netconfig file has a "-" for nametoaddr_libs of "inet" transports.
 
# DNS service expects that an instance of svc:/network/dns/client be
# enabled and online.
 
passwd:     files ldap
group:      files ldap
 
# You must also set up the /etc/resolv.conf file for DNS name
# server lookup.  See resolv.conf(4).
hosts:      files dns 
 
# Note that IPv4 addresses are searched for in all of the ipnodes databases
# before searching the hosts databases.
ipnodes:   files dns 
 
networks:   files
protocols:  files
rpc:        files
ethers:     files
netmasks:   files
bootparams: files
publickey:  files
# At present there isn't a 'files' backend for netgroup;  the system will 
#   figure it out pretty quickly, and won't use netgroups at all.
netgroup:   files
automount:  files
aliases:    files
services:   files
printers:       user files
 
auth_attr:  files
prof_attr:  files
project:    files
 
tnrhtp:     files
tnrhdb:     files

Une fois que cela est fait, nous allons pouvoir mettre en place la configuration. Attention : si vous êtes en environnement cluster, adapatez à la conf initiale ! :

Command
cp /etc/nsswitch.ldap /etc/nsswitch.conf

  • Lancer la configuration du client ldap

Il suffit de taper la commande :

Command ldapclient
ldapclient manual -v -a authenticationMethod=simple -a proxyDN=cn=admin,dc=openldap,dc=mydomain,dc=local -aproxyPassword=bidon -a defaultSearchBase=dc=openldap,dc=mydomain,dc=local -a defaultServerList=ldap.mydomain.local -a serviceSearchDescriptor=passwd:dc=openldap,dc=mydomain,dc=local?sub -a serviceSearchDescriptor=shadow:dc=openldap,dc=mydomain,dc=local?sub -a serviceSearchDescriptor=group:dc=openldap,dc=mydomain,dc=local?sub -a serviceAuthenticationMethod=pam_ldap:simple<nowiki>=</nowiki>

Attention : il semble que la commande ldapclient soit buggée et nécéssite les paramètres proxyDN et proxyPassword même s'ils sont inutilisés ! (et même s'ils contiennent n'importe quoi)

Command /etc/auto_home
#
# Copyright 2003 Sun Microsystems, Inc.  All rights reserved.
# Use is subject to license terms.
#
# ident "@(#)auto_home  1.6     03/04/28 SMI"
#
# Home directory map for automounter
#
+auto_home
* localhost:/export/home/&

Au cas où vous voudriez créer automatiquement le home directory, vous devez effectuer un portage du pam_mkhomedir de linux :

Une bonne idée serait aussi de monter automatiquement le home depuis un serveur nfs.

Il faut que les comptes utilisateurs dans l'annuaire LDAP aient dans leur liste d 'objectClass la classe « shadowAccount » pour pouvoir être pris en compte par solaris.

10 FAQ

10.1 Comment débugger ?

Il existe un moyen très efficace de débugger :

Command slapd
slapd -d 17

10.2 ldap_bind: Invalid credentials (49)

Là clairement il y a un problème avec votre login et votre mot de passe ! Vérifiez le tout et faites bien attention si le mot de passe est en crypté ou non.

10.3 ldap_add: Naming violation (64)

Si vous avez un message du genre, lors de la création racine :

adding new entry "dc=deimos,dc=fr"
ldap_add: Naming violation (64)
       additional info: value of naming attribute 'dc' is not present in entry

C'est que vous avez un problème au niveau du "dc". En effet, si votre "dn" contient 2 arguments comme ici (deimos et fr pour deimos.fr), alors vous devez indiquer pour votre "dc" le premier arguement de votre "dn". Ex :

dc=deimos,dc=fr

mon dc est alors deimos dans mon fichier d'import ldif.

10.4 operation not permitted during recovery

Suite à une coupure brutale du serveur, le serveur ldap n’est pas reparti. Voici le message que j’avais au démarrage en mode débugage :

# slapd -d 1
bdb_db_open: dbenv_open(/var/lib/ldap)
bdb(dc=mondomaine,dc=com): operation not permitted during recovery
bdb_db_open: db_open(/var/lib/ldap) failed: Invalid argument (22)
backend_startup: bi_db_open failed! (22)
bdb_db_destroy: close failed: Invalid argument (22)
slapd stopped.

En fait, c’était la base ldap qui était corrompue et pour régler ce problème, je l’ai simplement ré-indexée avec ces commandes :

Command
/etc/init.d/slapd stop
slapindex
/etc/init.d/slapd start

10.5 Purger les logs

Il m'est arrivé de n'avoir plus de place sur un de mes disques à cause des logs qui prennent trop de place. Pour flusher automatiquement les logs, 2 méthodes existent : auto et manuelle.

10.5.1 Méthode automatique

Il suffit d'insérer ceci dans ce fichier /var/lib/ldap/DB_CONFIG :

Configuration File /var/lib/ldap/DB_CONFIG
set_flags DB_LOG_AUTOREMOVE

10.5.2 Méthode manuelle

Il faut que le serveur ldap soit arrêter. Mais avant, il va déjà falloir installer ceci :

Command apt-get
apt-get install db4.2-util

Arrêtez maintenant le serveur ldap.

Pour lister les logs qui peuvent être supprimer, faites cette commande :

Command
cd /var/lib/ldap/
db4.2_archive

Pour supprimer les logs qui peuvent être supprimer :

Command
cd /var/lib/ldap/
db4.2_archive -d

Pour purger au maximum :

Command db4.2_checkpoint
db4.2_checkpoint -1

10.6 Vider le cache

Il peut arriver d'avoir plusieurs utilisateurs qui se font la male suite à une malencontreuse synchronisation foireuse. Par exemple un slapcat vous montrera les utilisateurs et groupes ldap, mais pas la commande getent.

Tout ceci est du au cache. Pour corriger le problème, il faut donc le vider. La commande nscd :

Command nscd
$ nscd -g
nscd configuration:
 
         0  server debug level
"/dev/null"  is server log file
 
 
CACHE: passwd
 
         CONFIG:
         enabled: yes
         per user cache: no
         avoid name service: no
         check file: yes
         check file interval: 0
         positive ttl: 600
         negative ttl: 5
         keep hot count: 20
         hint size: 2048
         max entries: 0 (unlimited)
 
         STATISTICS:
         positive hits: 28
         negative hits: 0
         positive misses: 5
         negative misses: 0
         total entries: 5
         queries queued: 0
         queries dropped: 0
         cache invalidations: 0
         cache hit rate:       84,8
 
 
CACHE: group
 
         CONFIG:
         enabled: yes
         per user cache: no
         avoid name service: no
         check file: yes
         check file interval: 0
         positive ttl: 3600
         negative ttl: 5
         keep hot count: 20
         hint size: 2048
         max entries: 0 (unlimited)
...

La liste des caches disponible peut être donnée via un help sur la commande :

Command nscd
        Supported caches:
          audit_user, auth_attr, bootparams, ethers
          exec_attr, group, hosts, ipnodes, netmasks
          networks, passwd, printers, prof_attr, project
          protocols, rpc, services, tnrhtp, tnrhdb
          user_attr

Si on souhaites donc vider par exemple le cache des groupes, il suffit de faire :

Command nscd
nscd -i group

Vous pouvez redémarrer le service si vous souhaitez tout flusher.

10.7 err -30978. Restore from backup

Quand on a ce genre de messages, c'est souvent la panique :

Command slapd -d 17
...
send_ldap_result: conn=-1 op=0 p=0
backend_startup_one: starting "dc=openldap,dc=mycompany,dc=lan"
bdb_db_open: unclean shutdown detected; attempting recovery.
bdb_db_open: dbenv_open(/var/lib/ldap/mycompany)
bdb(dc=openldap,dc=deimos,dc=fr): Log sequence error: page LSN 319 5223075; previous LSN 319 10485269
bdb(dc=openldap,dc=deimos,dc=fr): Recovery function for LSN 320 480 failed on forward pass
bdb(dc=openldap,dc=deimos,dc=fr): PANIC: Invalid argument
bdb(dc=openldap,dc=deimos,dc=fr): PANIC: fatal region error detected; run recovery
bdb(dc=openldap,dc=deimos,dc=fr): PANIC: fatal region error detected; run recovery
bdb(dc=openldap,dc=deimos,dc=fr): PANIC: fatal region error detected; run recovery
bdb_db_open: Database cannot be recovered, err -30978. Restore from backup!
====> bdb_cache_release_all
bdb(dc=openldap,dc=mycompany,dc=lan): DB_ENV->lock_id_free interface requires an environment configured for the locking subsystem
bdb(dc=openldap,dc=mycompany,dc=lan): txn_checkpoint interface requires an environment configured for the transaction subsystem
bdb_db_close: txn_checkpoint failed: Invalid argument (22)
backend_startup_one: bi_db_open failed! (-30978)
slapd shutdown: initiated
====> bdb_cache_release_all
====> bdb_cache_release_all
bdb_db_close: alock_close failed
slapd destroy: freeing system resources.
slapd stopped.
connections_destroy: nothing to destroy.

Pour réparer tout ce petit monde, nous avons la commande db_recover. Adaptez la selon votre version :

Command db4.2_recover
db4.2_recover

Vous pouvez encore rencontrer des soucis après celà. Pour ma part, la commande slapcat fonctionne. On peut donc extraire le contenu pour en faire un ldif, repartir base vide et réinjecter ce ldif (je n'ai pas testé, mais dans l'idée, ça doit marcher). Pour repartir base vide, voici comment faire :

  • S'assurer que le serveur ldap est bien éteint
  • Backupper son ancienne base /var/lib/ldap
  • Créer tous les dossiers de vos bases avec un dossier logs dedans (ex: /var/lib/ldap/base/logs)
  • Se placer /var/lib/ldap et lancer la commande db_recover
  • Se placer dans chaque base et lancer la commande db_recover
  • Lancez le serveur ldap
  • Réinjectez le ldif et ça doit être bon :-)

10.8 LDAP search descriptors and ‘user_attr’

Si vous avez ce type de message d'erreur :

[ID 293258 user.warning] libsldap: Status: 4 Mesg: Service search descriptor for service 'passwd' contains filter, which can not be used for service 'user_attr'.

C'est simplement qu'il vous manque 2 lignes dans votre fichier de configuration ldap client :

Configuration File /var/ldap/ldap_client_file
#
# Do not edit this file manually; your changes will be lost.Please use ldapclient (1M) instead.
#
NS_LDAP_FILE_VERSION= 2.0
NS_LDAP_SERVERS= ldap-1, ldap-2
NS_LDAP_SEARCH_BASEDN= dc=openldap,dc=mycompany,dc=lan
NS_LDAP_AUTH= simple
NS_LDAP_CACHETTL= 0
NS_LDAP_SERVICE_SEARCH_DESC= passwd:dc=openldap,dc=mycompany,dc=lan?sub?&(&(objectClass=posixAccount)(!(objectClass=computer)))
NS_LDAP_SERVICE_SEARCH_DESC= shadow:dc=openldap,dc=mycompany,dc=lan?sub
NS_LDAP_SERVICE_SEARCH_DESC= group:dc=openldap,dc=mycompany,dc=lan?sub
NS_LDAP_SERVICE_SEARCH_DESC= user_attr:dc=openldap,dc=mycompany,dc=lan?sub?&(acctActive=yes)
NS_LDAP_SERVICE_SEARCH_DESC= audit_user:dc=openldap,dc=mycompany,dc=lan?sub?&(acctACtive=yes)
NS_LDAP_SERVICE_AUTH_METHOD= pam_ldap:simple

Puis killez le service nscd pour qu'il reboot.

10.9 ldap_add: No such object (32)

Si vous avez ce genre d'erreur lors de l'import d'un LDIF dans une instance LDAP :

ldap_add: No such object (32)

C'est tout simplement que les ajouts (utilisateurs par exemple) n'ont pas leurs entrées prêtes pour y être insérés. Je m'explique, si un utilisateur de ce type :

dn: uid=pmavro,o=test,ou=person,dc=deimos,dc=fr

Il faut que l'Organisation test et l'OU person existent avant de pouvoir importer. Et malheureusement, si la création de ces entrées ne sont pas présente dans l'arborescence, alors l'import échouera.

10.10 ldap_add: Constraint violation (19)

Si vous avez ce genre d'erreur lors de l'import d'un LDIF dans une instance LDAP :

ldap_add: Constraint violation (19)

C'est qu'il y a des informations figurant dans votre LDIF qui ne devraient pas être présentes. Pour corrigez celà, il va falloir supprimer des champs, comme expliqué ici.

10.11 <= bdb_equality_candidates: (uid) not indexed

Si vous rencontrez ce genre de message :

<= bdb_equality_candidates: (uid) not indexed

C'est qu'il y a des champs non indexés lorsqu'une application tente d'y accéder. Pour corriger ceci, il faut rajouter (l'UID ici) à l'index. Nous allons donc éditer ce fichier et rajouter l'uid dans notre cas :

Configuration File /etc/ldap/slapd.d/cn\=config/olcDatabase\=\{1\}hdb.ldif
dn: olcDatabase={1}hdb
objectClass: olcDatabaseConfig
objectClass: olcHdbConfig
olcDatabase: {1}hdb
olcDbDirectory: /var/lib/ldap
olcSuffix: dc=deimos,dc=fr
olcAccess: {0}to attrs=userPassword,shadowLastChange by self write by anonymou
 s auth by dn="cn=admin,dc=deimos,dc=fr" write by * none
olcAccess: {1}to dn.base="" by * read
olcAccess: {2}to * by self write by dn="cn=admin,dc=deimos,dc=fr" write by *
  read
olcLastMod: TRUE
olcRootDN: cn=admin,dc=deimos,dc=fr
olcRootPW:: e1NTSEF9aGxQb1pZMlgrOER0RHZhVW5DQ2dJSlFrUDQ4dGc2QUE=
olcDbCheckpoint: 512 30
olcDbConfig: {0}set_cachesize 0 2097152 0
olcDbConfig: {1}set_lk_max_objects 1500
olcDbConfig: {2}set_lk_max_locks 1500
olcDbConfig: {3}set_lk_max_lockers 1500
olcDbIndex: uid,objectClass eqstructuralObjectClass: olcHdbConfig
entryUUID: 06862874-a659-1031-8d45-07546bbf1905
creatorsName: cn=admin,cn=config
createTimestamp: 20121009123142Z
entryCSN: 20121009123142.557766Z#000000#000#000000
modifiersName: cn=admin,cn=config
modifyTimestamp: 20121009123142Z

Ensuite nous devons redémarrer le LDAP et lancer une commande d'indexation à froid :

Command
/etc/init.d/slapd stop
su - openldap -c slapindex openldap
/etc/init.d/slapd start

11 References

  1. ^ http://wiki.debian.org/LDAP/OpenLDAPSetup?highlight=%28openldap%29
  2. ^ http://virtualtee.blogspot.fr/2012/02/openldap-after-upgrading-debian.html
  3. ^ http://trac.evolix.net/infogerance/wiki/HowtoOpenLDAP
  4. ^ http://wiki.freegeekvancouver.org/article/LDAP

Documentation sur le fonctionnement
Documentation pour une mise en place
OpenLDAP installation on Debian
Documentation sur Fedora Core 7
Formation Linagora OpenLDAP
Formation Linagora sur le Protocole LDAP
Formation Linagora sur l'optimisation d'OpenLDAP