Services Linux 2026-04-28

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