Guide Universel de Diagnostic — GLPI + LDAP/LDAPS sur Debian 13
Diagnostic universel pour GLPI sur Debian 13
CHECKLIST RAPIDE — À exécuter en début d'épreuve
systemctl status apache2 mariadb slapd
ss -tlnup | grep -E ':80|:443|:389|:636'
curl -s -o /dev/null -w "%{http_code}" http://support.mpr-if.infra
mysql -u root -e "SHOW DATABASES;" 2>&1
ldapsearch -x -H ldap://localhost -b "dc=mpr-if,dc=infra" "(objectClass=*)" 2>&1 | head -20
ldapsearch -x -H ldaps://localhost -b "dc=mpr-if,dc=infra" "(objectClass=*)" 2>&1 | head -20
tail -n 30 /var/log/apache2/error.log
journalctl -p err -n 30 --no-pager
ARBRE DE DÉCISION GLOBAL
Site inaccessible (pas de réponse ou erreur réseau)
└── SI port 80 fermé → Phase 2 : Apache
└── SI Apache actif mais erreur HTTP → Phase 3 : PHP ou Phase 5 : GLPI
Erreur HTTP 500 ou page blanche
└── SI log Apache mentionne PHP → Phase 3 : PHP
└── SI log Apache mentionne GLPI → Phase 5 : GLPI
└── SI erreur base de données → Phase 4 : MariaDB
Erreur HTTP 403
└── SI permissions refusées → Phase 5 : permissions fichiers GLPI
GLPI accessible mais login impossible
└── SI compte local fonctionne → Phase 6 : LDAP
└── SI LDAP répond mais LDAPS échoue → Phase 7 : certificat TLS
LDAP inaccessible
└── SI port 389 fermé → Phase 6 : slapd arrêté
└── SI port 389 ouvert mais erreur → Phase 6 : configuration slapd
LDAPS inaccessible
└── SI port 636 fermé → Phase 7 : slapd non configuré pour TLS
└── SI TLS handshake failed → Phase 7 : certificat invalide ou ldap.conf
PHASE 1 — Accès Web (GLPI)
1.1 Test de réponse HTTP
curl -v http://support.mpr-if.infra
Attendu : code HTTP 200 et contenu HTML de GLPI.
SI aucune réponse réseau :
ping -c 3 support.mpr-if.infra
cat /etc/hosts | grep support
SI le nom n'est pas résolu : ajouter l'entrée manquante dans /etc/hosts :
echo "127.0.0.1 support.mpr-if.infra" >> /etc/hosts
1.2 Code HTTP retourné
curl -s -o /dev/null -w "%{http_code}" http://support.mpr-if.infra
| Code obtenu | Action | |-------------|----------------------------------------| | 200 | Accès web fonctionnel — tester login | | 403 | Problème de permissions → Phase 5 | | 500 | Erreur PHP ou GLPI → Phase 3 / Phase 5 | | 000 | Apache ne répond pas → Phase 2 |
PHASE 2 — Serveur Web Apache
2.1 État du service
systemctl status apache2
Attendu : Active: active (running).
SI inactif :
systemctl start apache2
systemctl status apache2
SI démarrage en échec :
journalctl -u apache2 -n 50 --no-pager
apache2ctl configtest
Attendu de configtest : Syntax OK.
SI erreur de syntaxe : noter la ligne indiquée et corriger le virtualhost concerné.
2.2 Port 80 en écoute
ss -tlnup | grep ':80'
Attendu : LISTEN 0 ... 0.0.0.0:80 ... apache2
SI port absent malgré Apache actif :
cat /etc/apache2/ports.conf
Attendu : Listen 80 présent.
SI absent :
echo "Listen 80" >> /etc/apache2/ports.conf
systemctl restart apache2
2.3 Virtualhost actif
ls -lh /etc/apache2/sites-enabled/
Attendu : un lien symbolique vers la configuration de support.mpr-if.infra.
SI absent :
ls /etc/apache2/sites-available/
a2ensite <nom_du_fichier_de_conf>
systemctl reload apache2
2.4 Contenu du virtualhost
cat /etc/apache2/sites-available/support.mpr-if.infra.conf
Points à vérifier :
- ServerName correspond à support.mpr-if.infra
- DocumentRoot pointe vers /var/www/support.mpr-if.infra
- AllowOverride All est défini
- Require all granted est présent
- ErrorLog et CustomLog sont définis
2.5 Modules Apache nécessaires
apache2ctl -M | grep -E 'rewrite|php|ssl|headers'
Attendu : rewrite_module, php8.2_module (ou proxy_fcgi), présents.
SI module manquant :
a2enmod rewrite
a2enmod headers
systemctl restart apache2
2.6 Logs Apache
tail -n 50 /var/log/apache2/error.log
tail -n 50 /var/log/apache2/access.log
tail -n 50 /var/log/apache2/support.mpr-if.infra_error.log 2>/dev/null
PHASE 3 — PHP
3.1 Version et disponibilité
php -v
Attendu : PHP 8.2.x actif.
SI version incorrecte ou absente :
apt list --installed 2>/dev/null | grep php
3.2 Module PHP pour Apache
apache2ctl -M | grep php
Attendu : php8.2_module ou équivalent présent.
SI absent :
a2enmod php8.2
systemctl restart apache2
3.3 Extensions PHP requises par GLPI 10
php -m | grep -E 'mysqli|curl|gd|intl|ldap|mbstring|xml|zip|json|session|fileinfo|opcache'
Attendu : toutes ces extensions présentes.
SI une extension manque, par exemple ldap :
apt install php8.2-ldap
systemctl restart apache2
Liste complète des extensions à vérifier :
mysqli, curl, gd, intl, ldap, mbstring, xml, zip, json, session, fileinfo, opcache
3.4 Paramètres critiques php.ini
grep -E 'max_execution_time|memory_limit|post_max_size|upload_max_filesize|date.timezone' \
/etc/php/8.2/apache2/php.ini
Valeurs recommandées pour GLPI :
max_execution_time = 600
memory_limit = 256M
post_max_size = 20M
upload_max_filesize = 20M
date.timezone = Europe/Paris
SI valeur incorrecte : modifier le fichier, puis :
systemctl restart apache2
3.5 Test PHP fonctionnel
echo "<?php phpinfo(); ?>" > /var/www/support.mpr-if.infra/test.php
curl -s http://support.mpr-if.infra/test.php | grep -i "PHP Version"
rm /var/www/support.mpr-if.infra/test.php
SI pas de sortie PHP : Apache ne traite pas le PHP — vérifier le module et le virtualhost.
PHASE 4 — Base de données MariaDB
4.1 État du service
systemctl status mariadb
Attendu : Active: active (running).
SI inactif :
systemctl start mariadb
systemctl status mariadb
SI démarrage en échec :
journalctl -u mariadb -n 50 --no-pager
4.2 Port en écoute
ss -tlnup | grep ':3306'
Attendu : MariaDB en écoute sur 127.0.0.1:3306 ou 0.0.0.0:3306.
4.3 Connexion à la base
mysql -u root -e "SHOW DATABASES;"
SI erreur d'authentification :
mysql -u root -p -e "SHOW DATABASES;"
SI accès refusé sans mot de passe, tenter :
mysql -u root --socket=/var/run/mysqld/mysqld.sock -e "SHOW DATABASES;"
4.4 Vérification de la base GLPI
mysql -u root -e "SHOW DATABASES;" | grep -i glpi
Attendu : une base nommée glpi (ou équivalent défini dans la config GLPI).
SI absente : la base a été supprimée ou n'a jamais été créée.
mysql -u root -e "CREATE DATABASE glpi CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
Puis relancer l'installation GLPI si nécessaire.
4.5 Vérification de l'utilisateur GLPI
mysql -u root -e "SELECT user, host FROM mysql.user WHERE user LIKE 'glpi%';"
Attendu : utilisateur glpi avec host localhost.
SI absent :
mysql -u root -e "CREATE USER 'glpi'@'localhost' IDENTIFIED BY 'motdepasse';"
mysql -u root -e "GRANT ALL PRIVILEGES ON glpi.* TO 'glpi'@'localhost';"
mysql -u root -e "FLUSH PRIVILEGES;"
4.6 Test de connexion avec l'utilisateur GLPI
mysql -u glpi -p -e "USE glpi; SHOW TABLES;" 2>&1
Attendu : liste des tables GLPI sans erreur.
4.7 Vérification de la configuration GLPI côté base
cat /var/www/support.mpr-if.infra/config/config_db.php 2>/dev/null \
|| find /var/www/support.mpr-if.infra -name "config_db.php" 2>/dev/null
Points à vérifier :
- host : correspond à localhost ou 127.0.0.1
- user : correspond à l'utilisateur MariaDB existant
- password : correspond au mot de passe défini
- dbname : correspond au nom de la base existante
PHASE 5 — GLPI (fichiers et configuration interne)
5.1 Existence du répertoire web
ls -lh /var/www/support.mpr-if.infra/
Attendu : répertoire présent avec les sous-dossiers GLPI (config, files, plugins, public, etc.).
SI absent : GLPI n'est pas déployé — restaurer les fichiers.
5.2 Permissions des fichiers
stat /var/www/support.mpr-if.infra
ls -lh /var/www/support.mpr-if.infra/ | head -20
Attendu : propriétaire www-data:www-data sur l'ensemble du répertoire.
SI incorrect :
chown -R www-data:www-data /var/www/support.mpr-if.infra/
5.3 Permissions des sous-dossiers critiques
ls -lhd /var/www/support.mpr-if.infra/files/
ls -lhd /var/www/support.mpr-if.infra/config/
ls -lhd /var/www/support.mpr-if.infra/marketplace/
Attendu : drwxr-xr-x minimum, propriétaire www-data.
SI répertoires non accessibles en écriture par Apache :
chmod -R 755 /var/www/support.mpr-if.infra/
chmod -R 770 /var/www/support.mpr-if.infra/files/
chmod -R 770 /var/www/support.mpr-if.infra/config/
5.4 Fichier .htaccess
cat /var/www/support.mpr-if.infra/public/.htaccess 2>/dev/null \
|| cat /var/www/support.mpr-if.infra/.htaccess 2>/dev/null
Attendu : fichier présent avec les règles de réécriture GLPI.
SI absent ou corrompu : vérifier que AllowOverride All est bien dans le virtualhost Apache.
5.5 Logs internes GLPI
find /var/www/support.mpr-if.infra/files/_log/ -name "*.log" 2>/dev/null \
| xargs ls -lt | head -5
tail -n 50 /var/www/support.mpr-if.infra/files/_log/php-errors.log 2>/dev/null
5.6 Point d'entrée GLPI 10
GLPI 10 utilise /public comme DocumentRoot. Vérifier le virtualhost :
grep -i DocumentRoot /etc/apache2/sites-available/support.mpr-if.infra.conf
Attendu :
DocumentRoot /var/www/support.mpr-if.infra/public
SI DocumentRoot pointe sur la racine et non sur /public :
sed -i 's|DocumentRoot /var/www/support.mpr-if.infra$|DocumentRoot /var/www/support.mpr-if.infra/public|' \
/etc/apache2/sites-available/support.mpr-if.infra.conf
systemctl reload apache2
PHASE 6 — LDAP (connectivité)
6.1 État du service slapd
systemctl status slapd
Attendu : Active: active (running).
SI inactif :
systemctl start slapd
systemctl status slapd
SI démarrage en échec :
journalctl -u slapd -n 50 --no-pager
6.2 Port 389 en écoute
ss -tlnup | grep ':389'
Attendu : LISTEN ... slapd sur le port 389.
SI absent : slapd ne déclare pas le port LDAP — vérifier /etc/default/slapd :
cat /etc/default/slapd
Attendu :
SLAPD_SERVICES="ldap:/// ldaps:/// ldapi:///"
SI ldap:/// est absent :
sed -i 's/SLAPD_SERVICES=.*/SLAPD_SERVICES="ldap:\/\/\/ ldaps:\/\/\/ ldapi:\/\/\/"/' \
/etc/default/slapd
systemctl restart slapd
6.3 Test de connexion LDAP anonyme
ldapsearch -x -H ldap://localhost -b "dc=mpr-if,dc=infra" "(objectClass=*)" 2>&1 | head -30
Attendu : retour d'entrées LDAP sans erreur.
SI Can't contact LDAP server : slapd arrêté ou port fermé — revenir 6.1 / 6.2.
SI No such object : la base LDAP est vide ou le suffixe est incorrect.
Vérifier le suffixe configuré :
ldapsearch -x -H ldap://localhost -b "" -s base namingContexts 2>&1
6.4 Test de bind LDAP avec un compte
ldapsearch -x -H ldap://localhost \
-D "cn=admin,dc=mpr-if,dc=infra" \
-W \
-b "dc=mpr-if,dc=infra" \
"(objectClass=person)" cn 2>&1 | head -30
Attendu : liste d'entrées cn sans erreur.
SI Invalid credentials : mot de passe du compte bind incorrect ou DN mal formé.
SI Insufficient access : le compte bind n'a pas les droits nécessaires — vérifier les ACL slapd.
6.5 Vérification de la configuration slapd
slapcat -n 0 | grep -E 'olcSuffix|olcRootDN|olcRootPW' 2>/dev/null
Attendu : suffixe, DN admin, et hash du mot de passe présents et cohérents.
6.6 Vérification de ldap.conf
cat /etc/ldap/ldap.conf
Points à vérifier :
BASE dc=mpr-if,dc=infra
URI ldap://localhost
PHASE 7 — LDAPS (certificat et chiffrement)
7.1 Port 636 en écoute
ss -tlnup | grep ':636'
Attendu : LISTEN ... slapd sur le port 636.
SI absent : LDAPS non activé dans /etc/default/slapd — voir Phase 6.2.
7.2 Test de connexion LDAPS
ldapsearch -x -H ldaps://localhost -b "dc=mpr-if,dc=infra" "(objectClass=*)" 2>&1 | head -20
SI Can't contact LDAP server : port 636 fermé — voir 7.1.
SI certificate verify failed : le certificat auto-signé n'est pas reconnu — voir 7.3.
7.3 Vérification TLS_REQCERT dans ldap.conf
grep TLS_REQCERT /etc/ldap/ldap.conf
Attendu (pour certificat auto-signé) :
TLS_REQCERT never
ou :
TLS_REQCERT allow
SI absent ou défini à demand :
echo "TLS_REQCERT never" >> /etc/ldap/ldap.conf
7.4 Test du certificat avec OpenSSL
openssl s_client -connect localhost:636 -showcerts 2>&1 | head -40
Points à vérifier :
- Certificate chain présente
- subject et issuer du certificat
- Dates de validité (Not Before / Not After)
- Verify return code: 0 (ok) ou code d'erreur
SI certificat expiré :
openssl x509 -in /chemin/vers/certificat.pem -noout -dates
Régénérer si nécessaire (certificat auto-signé) :
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \
-keyout /etc/ssl/private/slapd.key \
-out /etc/ssl/certs/slapd.crt \
-subj "/CN=support.mpr-if.infra"
7.5 Configuration TLS dans slapd
slapcat -n 0 | grep -E 'olcTLS' 2>/dev/null
Attendu :
olcTLSCACertificateFile: /chemin/vers/ca.crt
olcTLSCertificateFile: /chemin/vers/slapd.crt
olcTLSCertificateKeyFile: /chemin/vers/slapd.key
SI absent ou chemins incorrects : modifier via ldapmodify ou reconfigurer slapd.
7.6 Permissions sur les certificats
ls -lh /etc/ssl/private/slapd.key
ls -lh /etc/ssl/certs/slapd.crt
Attendu : clé privée accessible uniquement par root ou l'utilisateur openldap.
SI incorrect :
chown openldap:openldap /etc/ssl/private/slapd.key
chmod 600 /etc/ssl/private/slapd.key
chown openldap:openldap /etc/ssl/certs/slapd.crt
chmod 644 /etc/ssl/certs/slapd.crt
systemctl restart slapd
7.7 Test LDAPS avec vérification désactivée (test de contournement)
LDAPTLS_REQCERT=never ldapsearch -x -H ldaps://localhost \
-b "dc=mpr-if,dc=infra" "(objectClass=*)" 2>&1 | head -20
SI ce test réussit mais le test normal échoue : le problème est uniquement la vérification du certificat côté client.
Corriger TLS_REQCERT dans /etc/ldap/ldap.conf (voir 7.3).
SECTION — Interprétation rapide des erreurs
Connection refused
Signification : le port est fermé ou le service n'écoute pas.
Contextes possibles :
- Apache arrêté → port 80 fermé
- slapd arrêté → port 389 ou 636 fermé
- MariaDB arrêté → port 3306 fermé
Actions :
- Vérifier systemctl status du service concerné
- Vérifier ss -tlnup
- Démarrer le service si inactif
Timeout (aucune réponse)
Signification : les paquets n'arrivent pas à destination.
Contextes possibles :
- Pare-feu bloquant silencieusement
- Service écoute sur mauvaise interface
- Problème de routage
Actions :
- Vérifier nft list ruleset ou iptables -L -n
- Vérifier que le service écoute sur 0.0.0.0 et pas seulement 127.0.0.1
500 Internal Server Error
Signification : erreur côté serveur, non exposée au navigateur.
Contextes possibles :
- Erreur PHP fatale
- Fichier GLPI manquant ou corrompu
- Problème de permissions
Actions :
- tail -n 50 /var/log/apache2/error.log
- tail -n 50 /var/www/support.mpr-if.infra/files/_log/php-errors.log
- Vérifier les permissions (Phase 5)
403 Forbidden
Signification : Apache refuse l'accès au répertoire ou fichier.
Contextes possibles :
- Directive "Require all denied" dans la config
- Permissions fichiers trop restrictives
- AllowOverride None empêche le .htaccess
Actions :
- Vérifier le virtualhost (Require all granted, AllowOverride All)
- Vérifier chown et chmod sur /var/www/support.mpr-if.infra
LDAP bind failed / Invalid credentials
Signification : le compte de service GLPI ne peut pas s'authentifier sur LDAP.
Contextes possibles :
- Mauvais DN ou mot de passe dans la configuration GLPI
- Compte désactivé ou inexistant dans l'annuaire
- Mauvais suffixe de base LDAP
Actions :
- Tester le bind manuellement (Phase 6.4)
- Vérifier la configuration LDAP dans GLPI (Administration > Annuaires LDAP)
- Vérifier que le compte existe : ldapsearch -x -D "..." -W -b "..." "(cn=compte)"
Can't contact LDAP server
Signification : connexion impossible au serveur LDAP.
Contextes possibles :
- slapd arrêté
- URI incorrecte dans la configuration GLPI ou ldap.conf
- Pare-feu bloquant le port 389 ou 636
Actions :
- systemctl status slapd
- ss -tlnup | grep -E ':389|:636'
- nc -zv localhost 389
TLS handshake failed / certificate verify failed
Signification : le certificat TLS ne peut pas être validé.
Contextes possibles :
- Certificat auto-signé non reconnu
- TLS_REQCERT défini à "demand" dans ldap.conf
- Certificat expiré
- Mauvais CN dans le certificat
Actions :
- openssl s_client -connect localhost:636 -showcerts
- Vérifier TLS_REQCERT dans /etc/ldap/ldap.conf
- Vérifier les dates du certificat
- Définir TLS_REQCERT never pour les certificats auto-signés
Page blanche (aucune sortie)
Signification : PHP s'exécute mais retourne rien, ou erreur muette.
Contextes possibles :
- display_errors désactivé dans php.ini
- Erreur PHP fatale sans affichage
- Fichier index vide ou absent
Actions :
- grep display_errors /etc/php/8.2/apache2/php.ini
- Activer temporairement : ini_set('display_errors', 1) dans le fichier d'entrée
- Consulter /var/log/apache2/error.log
PROCÉDURE DE VALIDATION COMPLÈTE
Étape 1 — Services actifs
systemctl is-active apache2 mariadb slapd
Attendu : active pour les trois services.
Étape 2 — Ports ouverts
ss -tlnup | grep -E ':80|:389|:636|:3306'
Attendu : les quatre ports en écoute.
Étape 3 — Réponse HTTP
curl -s -o /dev/null -w "%{http_code}" http://support.mpr-if.infra
Attendu : 200.
Étape 4 — Base de données accessible
mysql -u glpi -p -e "USE glpi; SELECT COUNT(*) FROM glpi_users;" 2>&1
Attendu : un nombre d'utilisateurs sans erreur.
Étape 5 — LDAP fonctionnel
ldapsearch -x -H ldap://localhost -b "dc=mpr-if,dc=infra" "(objectClass=person)" cn 2>&1 | grep "^cn:"
Attendu : liste de noms d'utilisateurs LDAP.
Étape 6 — LDAPS fonctionnel
LDAPTLS_REQCERT=never ldapsearch -x -H ldaps://localhost \
-b "dc=mpr-if,dc=infra" "(objectClass=person)" cn 2>&1 | grep "^cn:"
Attendu : mêmes résultats qu'en LDAP simple.
Étape 7 — Certificat valide
openssl s_client -connect localhost:636 -showcerts 2>&1 | grep -E 'subject|issuer|Verify return code'
Attendu : Verify return code: 0 (ok) ou code attendu selon la politique TLS.
Étape 8 — Test navigateur
1. Ouvrir http://support.mpr-if.infra
2. Vérifier l'affichage de la page de connexion GLPI
3. Se connecter avec un compte local (glpi / glpi par défaut)
4. Se connecter avec un compte LDAP
5. Vérifier Administration > Annuaires LDAP > Tester la connexion
PROCÉDURE D'ANALYSE SUR DEMANDE
Lorsqu'une sortie de commande, un log ou un fichier de configuration est fourni, préciser :
1. La commande exécutée ou le fichier concerné
2. La phase en cours et le symptôme observé
3. La sortie complète sans troncature
Format de soumission attendu :
Commande : systemctl status slapd
Contexte : LDAPS inaccessible, port 636 absent de ss
[coller la sortie ici]
L'analyse portera sur :
- Messages d'erreur et codes retour
- Incohérences de configuration
- Chemins, permissions et propriétaires de fichiers
- Ports, interfaces et protocoles mal configurés
- Validité et correspondance des certificats TLS