Que faire quand le service LDAP ne marche pas

Points à vérifier

Liste non-exhaustive des points à vérifier :

  • redémarrer le service client : apache, samba, ....
  • vérifier que le service client fonctionne : voir les logs, les messages à l'écran, l'erreur peut venir d'ailleurs.
  • vérifier quel serveur (serveur maître ou serveur(s) esclave(s)) est interrogé dans la configuration du service et qu'il est accessible.
  • lancer un interrogation en ligne de commande pour tester si la connexion au LDAP fonctionne, si la réponse est correcte alors le LDAP fonctionne : (On utilise pour cela le client ldapsearch installé par le paquet ldap-utils).
# -ZZ force l'utilisation de TLS, vous pouvez l'enlever pour tester en clair
ldapsearch -LLL -ZZ -x -h ldap-maitre.guim.info -b "dc=guim,dc=info" uid=mathieu uid sn
ldapsearch -LLL -ZZ -x -h replica.guim.info -b "dc=guim,dc=info" uid=mathieu uid sn
  • la connexion est-elle en TLS ? Si oui, est-ce que le certificat est bien référencé dans la configuration ?
  • Peut-on se connecter en web/ssh/ping sur le serveur ldap concerné ? Si non, c'est sûrement la configuration réseau du client qui est problématique.

Script utile

Voici un script bash qui permet de tester la connectivité au service LDAP, il interroge le serveur désigné, puis vérifie s'il le nom d'hote est un alias DNS auquel cas il interroge les vrais serveurs :

#!/bin/bash
# check-ldap.sh - test la connexion au ldap
function connect {
    ip_addr=$1
    tls=${2:+"-ZZ"}
    cmd=$(ldapsearch -LLL -x -h ${ip_addr} ${tls} -b "dc=guim,dc=info" uid=mathieu uid 2> /dev/null)
    if [ $? -eq 0 ]; then
        echo "   Connexion en ${2:-clair} : OK"
    else
        echo "   Connexion en ${2:-clair} : ERREUR"
    fi
}
host=${1:-'ldap.guim.info'}
echo "Serveur : ${host}"
connect ${host}
connect ${host} "tls"
ping -c 1 ${host} | awk '/icmp_seq/ {print "   Ping "$8" "$9}'
if [ $(host ${host} | grep 'address' | wc -l) -gt 1 ]; then
    nslookup ${host} | awk '/Address/ && !/#/ {print $2}' | while read ip; do
        echo " "
        fqdn=$(nslookup ${ip} | awk '/name =/ {print $4}')
        echo "=> $ip = ${fqdn}"
        connect ${ip}
        connect ${fqdn%.} "tls"
        ping -c 1 ${fqdn%.} | awk '/icmp_seq/ {print "   Ping "$8" "$9}'
    done
fi

Trop de fichiers ouverts

En vérifiant le fichier /var/log/slapd.log, on voit apparaître l'erreur suivante à plusieurs reprise :

Jan 24 15:05:12 ldap slapd[2102]: daemon: accept(7) failed errno=24 (Too many open files)

La commande "ulimit -a" retourne :

core file size        (blocks, -c) 0
data seg size         (kbytes, -d) unlimited
file size             (blocks, -f) unlimited
max locked memory     (kbytes, -l) unlimited
max memory size       (kbytes, -m) unlimited
open files                    (-n) 1024
pipe size          (512 bytes, -p) 8
stack size            (kbytes, -s) 8192
cpu time             (seconds, -t) unlimited
max user processes            (-u) unlimited
virtual memory        (kbytes, -v) unlimited

La commande suivante donne le nombre de fichiers ouvert par slapd :

ls -1 /proc/`pidof slapd`/fd | wc -l
40 

Modification d'un mot de passe

Création d'un ldif pour la modification d'un attribut :

dn: uid=toto,ou=people,dc=guim,dc=info
changetype: modify
replace: userpassword
userpassword: {SSHA}60aL/VKV1/5jOIBErjLvrY+rRY8ilo2n
-

Utilisation de ldapmodify pour modifier :

sudo ldapmodify -x -W -D "cn=admin,dc=guim,dc=info" -h localhost -f fichier.ldif
  • -x : authentification sans SASL
  • -W : prompt du mot de passe
  • -D "dn" : compte pour se connecter au ldap