Sur Debian et Ubuntu, Nginx consigne à /var/log/nginx/access.log et error.log, et Apache à /var/log/apache2/access.log et error.log. Sur RHEL, Rocky et Alma, Apache utilise /var/log/httpd/access_log et error_log, avec des underscores et sans extension. Dans les conteneurs construits à partir de l’image officielle Nginx, il n’y a pas de fichiers log du tout : tout va à stdout et stderr, donc les logs docker sont votre exportation.
Le journal du serveur web est souvent le premier endroit où une intrusion laisse une trace : le scanner balayant les fichiers .env, la chaîne d’exploitation, le POST vers un fichier qui ne devrait pas exister. Prime Core dispose de 812 règles de détection pour les journaux de serveurs web, mappées à 337 techniques ATT&CK de MITRE. Parmi elles : exploitation d’applications exposées au public (T1190), web shells (T1505.003) et scan de vulnérabilités (T1595.002).
Avant de commencer
Trouvez les chemins réels. Les hôtes virtuels consignant souvent ailleurs, demandez au serveur lui-même :
# Nginx : videz la configuration effective complète et extrayez les directives de journaux
sudo nginx -T 2>/dev/null | grep -E 'access_log|error_log'
# Apache
sudo apachectl -S
sudo grep -Ri -E 'CustomLog|ErrorLog' /etc/apache2/ /etc/httpd/ 2>/dev/null
Sur Apache basé sur Debian, les hôtes virtuels sans leur propre CustomLog finissent dans other_vhosts_access.log. Les gens passent souvent à côté de celui-là.
Vérifiez quelle adresse IP vous consignez. Derrière un équilibrage de charge, un CDN ou un proxy inverse, chaque requête peut sembler provenir du proxy. Cela est vrai sauf si le serveur est configuré pour consigner le vrai client : set_real_ip_from et real_ip_header dans Nginx, mod_remoteip dans Apache. Si chaque ligne affiche les mêmes quelques IP internes, l’adresse de l’attaquant est uniquement dans X-Forwarded-For, si vous la consignez, ou dans les propres journaux du proxy.
Vérifiez le format. Les deux serveurs utilisent par défaut le format « combiné », mais de nombreuses configurations le personnalisent (log_format dans Nginx, LogFormat dans Apache). Notez à quoi ressemble le vôtre avant de téléverser.
Autorisations. Sur Debian et Ubuntu, ces journaux sont lisibles par root et le groupe adm; ailleurs, prévoyez sudo.
Exporter à partir des fichiers journaux
Les journaux tournent quotidiennement ou hebdomadairement, incluez donc les fichiers tournés. zcat -f lit à la fois les fichiers en clair et compressés au format gzip :
# Nginx, actuels et tournés, les plus anciens en premier
sudo zcat -f $(ls -tr /var/log/nginx/access.log*) > web-03_nginx_access.log
# Apache sur RHEL
sudo zcat -f $(ls -tr /var/log/httpd/access_log*) > web-03_httpd_access.lo
Pour une seule journée, les horodatages au format combiné rendent grep suffisant :
grep '19/Oct/2026' web-03_nginx_access.log > web-03_access_1019.log
Prenez également le journal des erreurs. Les échecs en amont, les erreurs PHP et certaines tentatives d’exploitation n’apparaissent que là.
Exporter à partir des conteneurs
# Docker : stdout est le journal d'accès, stderr le journal d'erreurs
docker logs --since 2026-10-19T00:00:00 --until 2026-10-20T00:00:00 nginx > nginx_access.log 2> nginx_error.log
# Kubernetes
kubectl logs deploy/nginx --since=24h > nginx.log
Les journaux de conteneurs disparaissent avec le conteneur à moins que quelque chose ne les collecte. Si le pod a été remplacé, vérifiez le collecteur de journaux de votre cluster.
Que rechercher
| Motif | Ce que cela signifie généralement |
|---|---|
| Explosions de 404 pour /.env, /.git/config, /wp-login.php, /phpmyadmin | Scan automatisé |
| ../, ${jndi:, union select, <script> dans l’URL | Tentatives d’exploitation : traversée, Log4Shell, injection SQL, XSS |
| 200 sur un POST vers un fichier étrange dans un répertoire de téléchargement | Possible web shell; regardez ce que cette IP a demandé d’autre |
| Agents utilisateurs comme sqlmap, nikto, nuclei | Outils qui ne se sont pas donné la peine de se cacher |
| Une pointe de 5xx juste après des requêtes étranges | Quelque chose s’est cassé, probablement parce qu’une exploitation a abouti |
Téléverser, assainir et examiner dans LogTotal
- Téléverser. Ouvrir logtotal.com et déposez le fichier.
- Assainir. [what gets masked: client IPs, hostnames, usernames and tokens in URLs]. Look it over before you continue. Query strings often carry session tokens.
- Examiner.
Quand ça tourne mal
| Symptôme | Cause probable | Fix |
|---|---|---|
| Pas de /var/log/nginx | Chemin personnalisé, ou il s’exécute dans un conteneur | nginx -T, ou docker logs |
| access.log existe mais est vide | Les journaux vont à stdout, ou access_log off | Vérifiez la configuration et le conteneur |
| Chaque requête vient des mêmes IP | Proxy ou équilibrage de charge devant; vrai IP non configuré | Utilisez X-Forwarded-For ou les journaux du proxy |
| Seulement les derniers jours | Fichiers tournés omis | Utilisez la commande zcat -f avec le * glob |
| Accès refusé | Pas root, pas dans adm | sudo |
FAQ
Qu’est-ce qui importe le plus, le journal d’accès ou le journal des erreurs ?
Le journal d’accès vous dit ce qui a été demandé. Le journal des erreurs vous dit ce qui s’est cassé. Dans un cas d’exploitation, vous voulez les deux, côte à côte.
Et IIS ?
IIS écrit les journaux W3C à C:inetpublogsLogFiles par défaut. Cela a son propre guide.