Apache : ajouter le contenu d’un header dans les logs

I. Introduction

Afin de gérer un serveur web de façon efficace, les logs sont indispensables. Les logs (ou journaux) permettent en effet de connaitre l'activité d'un serveur web, et notamment les requêtes qu'il a eu à traiter. Voici un extrait des logs d'IT-Connect.fr par exemple :

logs-it-connect

Le service apache2 est très flexible en ce qui concerne la façon dont les logs sont écrits et notamment le contenu de ceux-ci. On peut en effet gérer efficacement le contenu des logs à garder ou à oublier, les composants d'une requêtes HTTP à garder ou à oublier, différents les logs par vhost, en fonction de leur status (logs d'accès ou logs d'erreur), etc.

Dans ce tutoriel, nous allons apprendre à modifier les logs d'un vhost Apache dans le but d'y inscrire des headers HTTP qui n'y sont pas inscrits par défaut.

II. Quelques mots à propos des headers HTTP

Les header HTTP, sont des données qui composent une requêtes HTTP et dont le but est de passer des informations entre un client et un serveur. Par exemple, le header HTTP "User-Agent" est envoyé à chaque requête d'un client (un navigateur web) et contient des informations à propos du navigateur utilisé (Firefox, sur Windows, avec telle version). Le header "Location" est lui par exemple envoyé par un serveur HTTP lors d'une réponse 301 ou 302 (redirection), il indique au navigateur (client HTTP) où celui-ci est redirigé.

Il existe une énorme quantité de header HTTP, certains sont standardisés, comme les headers User-Agent et Location, d'autres sont propres à l'implémentation d'un site web, d'un CMS ou d'une solution spécifique qui va utiliser les headers HTTP pour passer des informations quelconques.

Par défaut, les logs d'Apache n'inscrivent pas le contenu de tous les headers reçus lorsqu'un client effectue une requête. Par exemple, le header "User-Agent" est sauvegardé, comme nous pouvons le voir ici :

logs-apache-header

Ici, on voit plusieurs informations à propos de mon navigateur web, il s'agit d'une information que mon navigateur à ajouté à ma requête HTTP en tant que header.

Note : Les "messages headers" sont décrit dans la RFC2616 décrivant le protocole HTTP1.1, écrite en juin 1999 ! Voici le lien vers cette RFC : https://tools.ietf.org/html/rfc2616

La partie décrivant les message header est à la page 31 : https://tools.ietf.org/html/rfc2616#page-31

Si j'ajoute un header spécifique à ma requête, celui-ci ne sera pas automatiquement inscrit dans le fichier access.log de mon serveur Apache car ce dernier n'est pas configuré pour inscrire cette information dans les logs.

Pour du debug, du monitor ou seulement à titre informatif, il est parfois nécessaire d'inscrire le contenu d'autres headers dans les logs Apache, voyons comment faire cela 🙂

III. Ajout de headers spécifiques dans les logs Apache

Pour une application web, j'ai besoin d'un header nommé "appli-client" qui contiendra la valeur "Appli_A" ou "Appli_B" en fonction de différents critères. Afin d'effectuer à jolie graph grâce à ma solution de monitoring, j'ai besoin de récupérer le contenu du header "appli-client" pour chaque requête.

Première requêtes HTTP contenu mon header, je constate que le contenu de celui-ci n'est pas inscrit dans les logs alors qu'il figure bien dans les headers de ma requête :

logs-apache-header01

A droite, nous voyons en en détail ma requête HTTP et ses headers. A gauche, nous voyons les logs Apache correspondant. Nous voyons alors bien le contenu du header "User-Agent", mais pas celui des autres headers et notamment du header "appli-client".

A présent, nous allons nous rendre dans la configuration de notre vhost, (il s'agit du vhost "default", présent par défaut, dans mon cas). Pour le vhost par défaut, il s'agit de /var/log/mods-available/000-default.conf

Qu'allons donc ajouter dans ce fichier de configuration ? Nous trouverons une partie de la réponse dans la documentation du module apache "mod_log_config", présent et actif par défaut. Celui-ci permet, comme son nom l'indique, de gérer la configuration des logs Apache.

Le tableau présent sur cette partie de la documentation (http://httpd.apache.org/docs/2.0/mod/mod_log_config.html#formats) nous indique les caractères qui peuvent être utilisés lors de la déclaration du format des logs Apaches. On peut voir par exemple %v pour l'affiche du nom du serveur, %a pour l'adresse distante (celle du client), %H pour le nom du protocole (HTTP ou HTTPS), etc. et notamment ceci :

logs-apache-header02La documentation nous informe ici qu'une certaine string, contenant le nom du header à récupérer suivi d'un "i" permet de récupérer le contenu du header tel qu'envoyé par le client, voila qui est parfait.

Une autre source d'information est la configuration par défaut d'apache (/etc/apache2/apache2.conf sous Debian). Celui-ci contient par défaut une configuration qui affiche le User-Agent par exemple, voici ce que nous pourrons trouver aux alentours de la directive "LogFormat" :

logs-apache-header03

Nous voyons ici la mention du User-Agent et un formatage tel que décrit dans la documentation, il nous suffit donc d'appliquer la même configuration au niveau de notre vhost !

Note : Pour une configuration s'appliquant à un seul vhost, une configuration spécifique peut être utilisée dans la configuration de celui-ci.

Nous allons à présent dans la configuration d'Apache pour y ajouter la directive suivante :

Log Format "%h %l %u %t \"r\r %>s %O \"%{Referer}i\" \"{User-Agent}i\"" combined

en celle-ci

Log Format "%h %l %u %t \"r\r %>s %O \"%{appli-client}i\" \"%{Referer}i\" \"{User-Agent}i\"" combined

Nous pourrons ensuite vérifier notre configuration apache avec la commande suivante :

apachectl configtest

Si celle-ci renvoie "Syntax OK", on peut redémarrer le service apache2 sans danger :

service apache2 restart

Une fois cela fait nous pourrons générer des requêtes pour aller constater la présence de notre header dans les logs.

logs-apache-header04

Nous voyons ici l'impact direct de notre modification en visualisant le contenu de notre header dans les logs.

Note : Lors de changements de configuration mineurs, préférez apache2 "reload" plutôt que "restart. En effet, "reload" va simplement recharger les fichiers de configuration alors que "restart" va fermer le processus apache2 et ainsi fermer toutes les connexions actives, ce qui peut engendrer des micro-instruction de service côté utilisateur.

La gestion des logs avec Apache2 est très complète et peut parfois être complexe. Je vous conseille de vous pencher sur le sujet, notamment dans le but, par exemple, de gérer cette configuration pour un seul vhost ou en jouant avec toutes les strings proposées dans la documentation du module mod_log_config.

N'hésitez pas à partager votre avis dans les commentaire ou à poser vos questions sur notre forum.

Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Partager sur Google+ Envoyer par mail

Mickael Dorigny

Co-fondateur d'IT-Connect.fr. Auditeur/Pentester chez Orange Cyberdéfense.

Nombre de posts de cet auteur : 527.Voir tous les posts

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.