Tuto supervision avec GoAcces pour Bullseye

De Le Wiki du Forum-Debian.fr
Aller à la navigation Aller à la recherche
GoAccess tuto débutant complet Debian 11 Bullseyes et Apache 

Introduction

Goaccess est un analyseur de fichiers journal spécialisé dans les services réseaux et particulièrement adapté à l'analyse du trafic http. Les statistiques sont accessibles en mode console via un terminal ou en mode navigateur web via une page html. Le logiciel supporte la plupart des format log existant. Il est possible de le lancer en mode démon afin d'obtenir des statistiques du trafic de son site web en temps réel. Goaccess nécessite peu de dépendances, prends peu de place sur le disque et peu de ressources système, il est donc adapté à une petite machine. Dans ce tuto nous allons nous appliquer à configurer Goaccess pour afficher les statistiques de connexions sur un site hébergé avec Apache 2. Dans un premier temps nous allons essayer le mode console, dans un second temps le mode web en instantané et enfin le mode démon pour que goaccess analyse le trafic en temps réel.

pages man (en anglais): http://manpagez.com/man/1/goaccess/

prérequis

Il est possible de l'adapter à une autre distro Linux, cependant l’intérêt de ce tuto est qu'il est spécifiquement écrit pour Débian 11 Bullseyes.

  • Goaccess fonctionne avec AMD64, x86, ARM, etc.
  • Goaccess occupe 957 kB sur le disque.
  • Le tuto utilise la version 1:1.4-1 de GoAccess
  • Écrit en C, il nécessite 5 paquets: libc6, libmaxminddb0, libncursesw6, libssl1.1, libtinfo6 .
  • Facultatif mais conseillé : paquet sudo installé et configuré.
  • Savoir utiliser un éditeur de texte sous Debian.
  • Apache2 installé avec un site déjà opérationnel configuré à partir d'un hôte virtuel (virtualhost).
  • Par défaut Apache2 consigne l'activité du site dans le fichier journal /var/log/apache2/other_vhosts_access.log
  • Pour consulter en ligne le fichier html de statistique il faut copier ce dernier dans un dossier configuré pour être mis en ligne, par convention /var/www/

Installation

sudo apt install goaccess

Description

La configuration de Goaccess par défaut se fait dans le fichier /etc/goaccess/goaccess.conf. Lorsqu'on lance la commande simple "goaccess", le programme va chercher les paramètres dont il a besoin dans goaccess.conf. Toutefois, les paramètres passés dans la ligne de commande sont prioritaires sur les paramètres enregistrés dans le fichier goaccess.conf (mis à part le chemin du fichier journal à analyser)

Essai du mode console

Avant paramétrages, la commande goaccess affiche le mode console. On peut y choisir un format de log à analyser. Mais aucune statistique ne s'affiche parce qu'on n'a pas préciser de fichier journal à analyser. Pour cela la commande est :

goaccess <chemin du fichier>

Dans notre cas on peut essayer :

goaccess /var/log/apache2/other_vhosts_access.log

Il faut alors spécifier le format du log à analyser dans la console. Par défaut ce fichier est au format « combined log format with virtual host » (VCOMBINED). Le programme affiche alors les statistiques numériques d'Apache. Le fichier journal analysé doit contenir de l'activité ; s'il est vide (0 Ko) alors aucune donnée ne remontera et le tableau restera vide aussi. On sort du tableau avec la touche Q.

Essai du mode web

La commande goaccess va cette fois nous servir à générer une page web qu'on pourra ensuite consulter avec un navigateur. Faute de paramétrages dans goaccess.conf il nous faut toujours préciser quel fichier journal analyser. Il faut en plus ajouter deux paramètres :

  • le commutateur « -o », pour « output », suivis du chemin complet du fichier html à générer
  • l'option « --log-format » nécessaire pour préciser le format du fichier journal.

Nous pouvons donc essayer cette commande :

goaccess /var/log/apache2/other_vhosts_access.log -o /var/www/webreport.html --log-format=VCOMBINED

Le fichier webreport.html devrait maintenant être consultable via le navigateur.

Essai du mode démon

Ce mode permet de lancer un démon goaccess en arrière plan qui analyse les connexions en temps réel (real time). Nous allons garder la ligne de commande précédente et lui ajouter deux paramètres qui en fait fonctionnent ensemble:

  • l'option « --real-time-html »
  • l'option « --daemonize »

On obtient donc la commande suivante :

goaccess /var/log/apache2/other_vhosts_access.log -o /var/www/webreport.html --log-format=VCOMBINED --real-time-html --daemonize

Si la commande fonctionne, on obtient en sortie le PID du démon goaccess. Le fichier /var/www/webreport.html relate maintenant l'activité du site en direct. Pour arrêter le démon il faut employer la commande :

sudo kill -9 <PID>

Deux scripts avec goaccess

Lancer le démon goaccess au démarrage de Debian pour reporter les statistiques en temps réel

Il faut respecter 3 étapes.

Script LSB (Linux Standard Base)

Il s'agit d'un script conçu spécialement pour effectuer des tâches au démarrage de la machine telles que lancer un démon. La première ligne contient cette commande :

#!/bin/sh

qui définit le script qui suit comme script Shell. La deuxième ligne contient le chemin complet du script là où ira le chercher le système au démarrage. Nous appellerons ce script goaccessd.sh et son chemin final sera /etc/systemd/system. La seconde ligne est donc :

# /etc/systemd/system/goaccessd.sh

Les lignes suivantes contiennent l'en-tête LSB qu'il faut paramétrer :

### BEGIN INIT INFO
# Provides: goaccessd.sh
# Required-Start: $local_fs
# Required-Stop: $local_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: génération en temps réel d'une page web synthétique des logs
# Description:  génération en temps réel d'une page web synthétique des logs
### END INIT INFO

Explication de chaque ligne :

  • "### BEGIN INIT INFO" marque le début de l'en tête, "### END INIT" INFO marque la fin de l'en-tête et chaque ligne commence par un "#".
  • Provides : goaccessd.sh : nom du script, obligatoire
  • Required-Start : Ici il faut nommer les dépendances du script, obligatoire. Cela peut être une valeur comme $local_fs (système de fichier local), $syslog (journalisation), $network (réseau), $name (la machine est nommée), $remote_fs (système de fichier distant), ...Nous choisirons $local_fs.
  • Required-Stop : les dépendances du script qui doivent être achevées dans la séquence de boot, ce champs, obligatoire aussi, peut prendre les mêmes valeurs que le précédant et nous choisissons $local_fs.
  • Default-Start : les étapes du démarrage (ou runlevel ) disponibles pour démarrer le service
  • Default-Stop : les runlevel lors desquels le service doit être éteint.

Nous pouvons maintenant passer à la dernière étape du script : la ligne de commande à lancer. Pour lancer le démon et pour une analyse en temps réel du fichier journal other_vhosts_access.log la commande est :

/bin/goaccess /var/log/apache2/other_vhosts_access .log -a -o /var/www/webreport.html --log-format=COMBINED --real-time-html --daemonize

(On peut ajouter l'option « -a » qui permet d'afficher les agents utilisés par les clients)


Une fois enregistré il faut rendre le script exécutable avec la commande :

sudo chmod +x goaccessd.sh

On peut essayer le script par la commande :

./goaccessd.sh

Si elle fonctionne elle renvoie le PID du démon qu'on termine avec la commande :

sudo kill -9 <PID>

Création d'un service

Maintenant que nous avons le script à exécuter nous devons créer un service pour Debian, c'est à dire pour systemd. (bonne doc : http://lea-linux.org/documentations/Systemd). Cela consiste à créer un fichier nommé <nom du script>.service dans le dossier /usr/lib/systemd/system/. Créons donc le fichier /usr/lib/systemd/system/goaccessd.sh.service. Ce fichier doit contenir le paramétrage suivant :

[Unit]
Description=Run goaccess daemonized
After=getty.target

[Service]
Type=simple
ExecStart=/etc/systemd/system/goaccessd.sh
TimeoutStartSec=0 

[Install]
WantedBy=multi-user.target

La section [Unit]
  • Description : fournit une description du service
  • After : ce paramètre désigne une ou plusieurs cibles (target) qui, dans le processus de démarrage, correspondent à un ou plusieurs moments de la séquence ; ce champs accepte au moins un élément obligatoire «  getty.target » correspond au moment où le système affiche le prompt.

.

La section [Service]
  • Type : Systemd distingue plusieurs type de services (simple, forking, oneshot, dbus et notify) qui ne se lancent pas de la même façon; nous pouvons garder la paramètre "simple".
  • ExecStart :Commandes qui sont exécutées lorsque l'on démarre le service.
  • TimeoutStartSec: Délais (en ms) respecté avant de démarrer le service.
La section [Install]
  • WantedBy: Argument obligatoire qui désigne une cible de la séquence de démarrage. "multi-user.target" correspond à un runlevel de 2,3 ou 4.

Pour plus d'explication on peut se référer au manuel : https://manpages.debian.org/stretch/systemd/systemd.service.5.en.html .

Activation du script et autres commandes

Maintenant que le service est prêt nous allons l'activer par cette commande :

sudo systemctl enable goaccess.sh.service

Ceci créé un lien symbolique à partir de la copie du fichier de service du système (généralement dans /lib/systemd/system ou /etc/systemd/system) à l'emplacement du disque où systemd cherche les fichiers de démarrage automatique. Il faut aussi recharger la configuration des démons :

sudo systemctl daemon-reload

Nous pouvons alors vérifier si le service se lance bien au démarrage en redémarrant la machine :

sudo systemctl reboot

La machine redémarrée, vérifions si le service a démarrer correctement. Pour afficher les informations sur notre service la commande est :

sudo systemctl status goaccess.sh.service

Consternation ! On obtient un message d'erreur !

Active : failed

et

goaccessd.sh.service: Failed with result 'exit-code'

Cependant systemd nous indique la cause de l'erreur : la variable d'environnement « HOME » ne semble pas définie. (On sort de la commande avec la touche Q) On peut regarder aussi si le processus goaccess est lancé avec la commande :

ps -aux | goaccess

Là il n'apparaît que la ligne de la commande « grep goaccess ». Le service a bel et bien échoué son démarrage mais nous avons une piste pour la cause de l'erreur. Quelques recherches plus tard sur Internet nous apprennent à ce sujet qu'il s'agit d'un bug du programme. On peut facilement le corriger en initialisant la variable d'environnement HOME dans notre script. On édite donc le fichier /etc/systemd/system/goaccess.sh et, entre l'entête LSB et la ligne de commande nous insérons cette ligne :

export $HOME=/home

A ce stade voilà notre script goaccess.sh :

#!/bin/sh
# /etc/systemd/system/goaccessd.sh
### BEGIN INIT INFO
# Provides: goaccessd.sh
# Required-Start: $local_fs
# Required-Stop: $local_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: génération en temps réel d'une page web synthétique des logs
# Description:  génération en temps réel d'une page web synthétique des logs
### END INIT INFO
export HOME=/home
/bin/goaccess /var/log/apache2/other_vhosts_access .log -a -o /var/www/webreport.html --log-format=VCOMBINED --real-time-html –daemonize

Une fois le script corrigé, essayons à nouveau de rebooter :

sudo systemctl reboot

Le système redémarre


Là nous réessayons les commandes de vérification précédentes :

sudo systemctl status goaccess.sh.service

Satisfaction ! Le service semble s'être lancé convenablement :

Active:active

Systemd nous donne diverses informations sur le service lancé. Notons que le champs « Main PID » indique le PID du processus père du démon. Le PID du démon est indiqué deux fois, dans la section « CGroup » et à la fin de la dernière ligne d'information « Daemonized GoAccess <PID> ».

Lancer goaccess tout les jours pour reporter les statistiques de la veille

Pour l'instant nous avons travaillé sur le fichier journal other_vhosts_access.log qui reporte l'activité actuelle et récente. Le mode temps réel était adapté à cela. Par le jeu de la rotation des logs (logrotate) Apache consigne des données plus anciennes et exploitables dans le fichier other_vhosts_access_log.1. La rotation des fichiers journaux d'apache est paramétrée dans le fichier /etc/logrotate.d/apache2. La ligne « daily » nous confirme que la rotation des logs est quotidienne. Le fichier other_vhosts_access.log.1 concerne donc les connexions de la veille. Nous allons paramétrer goaccess pour reporter chaque jour les statistiques de ce fichier journal.

Écriture du script

Editons le fichier goaccess2.sh il s'agit comme précédemment d'un script shell, la première ligne est donc l'en-tête :

#!/bin/sh

Il faut maintenant écrire la ligne de commande de lancement de goaccess. Le fichier à lire est /var/log/apache2/ other_vhosts_access_log.1 . Nous nommerons le fichier html à écrire « yesterdaywebreport.html ». Pour que la ligne de commande ne renvoie ni information ni erreur, nous pouvons rediriger la sortie de la commande avec « > /dev/null 2>&1 ». Ce qui donne :

/bin/goaccess /var/log/apache2/ other_vhosts_access_log.1 -a -o /var/www/yesterdaywebreport.html --log-format=VCOMBINED > /dev/null 2>&1

une fois la commande lancée et traitée nous pouvons sortir du script proprement avec la commande :

exit 0

Notre script qui contient 3 lignes est presque prêt, il faut le rendre exécutable avec la commande :

sudo chmod +x script.sh

Si on exécute le script :

sudo ./goaccess2.sh

et que la commande se passe bien, alors le fichier yesterdaywebreport.html affiche les statistiques de la veille.

Ajout au cron

le cron s'occupe des tâches régulières, qu'elles soient quotidiennes, hebdomadaires ou mensuelles. Les scripts à exécuter quotidiennement doivent être présents dans le dossier /etc/cron.daily/. On copie donc notre script vers ce dossier avec la commande :

sudo cp goaccess2.sh /etc/crondaily/

Remarque à propos de l'ordre d'exécution dans cron.daily : il est possible dans ce dossier de nommer les scripts de façon à gérer leur ordre d'exécution. Cette ordre dépend d'un indice entre 00 et 99 en début du nom du script. Par exemple le script 00logwatch.sh s'exécutera avant le script 10goaccess. Cependant dans le cas présent il n'est normalement pas nécessaire de s'occuper du moment d'exécution du script goaccess2.sh.

Une page html nommée yesterdaywebreport.html sera générée tout les matins vers 6h25 reprenant les statistiques de la veille contenues dans other_hosts_access.log.1.

Configurations facultatives

Nous avons pour l'instant fait fonctionné goaccess sans toucher à son fichier de configuration qui est /etc/goaccess/goaccess.conf. Celui-ci permet de paramétrer goaccess plus finement. Les paramètres enregistrés dans le fichier de configuration prennent effet mais les paramètres contradictoires passés dans la ligne de commande sont prioritaires. Une exception toutefois : lorsqu'on définit le champs « log file » dans la section « file options » celui ci prend le pas sur la ligne de commande. Définir ce champs peut être utile si on n'analyse qu'un seul fichier journal, ce qui n'est pas notre cas ; cela permet de se dispenser de préciser le fichier en entré dans la ligne de commande.

Activation des formats de log par défaut

Si on se sert de goaccess en mode console, une option intéressante peut être d'activer les formats de log dont on peut avoir besoin dans le fichier conf. Ce paramétrage sert à ne pas avoir besoin de spécifier le format de log dans la ligne de commande à l'aide de la directive « log-format », goaccess essaie alors les formats activés dans son fichier de configuration.

  • se rendre dans la section «  Log Format Options (required) » .
  • décommenter (effacer le # en début de ligne) la ligne qui correspond au bon format et qui commence par la commande « log-format » suivis de paramètre.
  • Décommenter la ligne plus bas dans le fichier qui correspond au format souhaité

. Exemple : activer les formats Combined, Vcombined, Common et Vcommon par défaut.

######################################
# Log Format Options (required)
######################################
#
# The log-format variable followed by a space or \t for
# tab-delimited, specifies the log format string.
#
# NOTE: If the time/date is a timestamp in seconds or microseconds
# %x must be used instead of %d & %t to represent the date & time.  
# NCSA Combined Log Format
log-format %h %^[%d:%t %^] "%r" %s %b "%R" "%u"
 # NCSA Combined Log Format with Virtual Host
log-format %v:%^ %h %^[%d:%t %^] "%r" %s %b "%R" "%u"
# Common Log Format (CLF)
log-format %h %^[%d:%t %^] "%r" %s %b
# Common Log Format (CLF) with Virtual Host
log-format %v:%^ %h %^[%d:%t %^] "%r" %s %b
# W3C
#log-format %d %t %h %^ %^ %^ %^ %r %^ %s %b %^ %^ %u %R
# Squid native log format
#log-format %^ %^ %^ %v %^: %x.%^ %~%L %h %^/%s %b %m %U
# AWS | Amazon CloudFront (Download Distribution)
#log-format %d\t%t\t%^\t%b\t%h\t%m\t%^\t%r\t%s\t%R\t%u\t%^
# Google Cloud Storage
#log-format "%x","%h",%^,%^,"%m","%U","%s",%^,"%b","%D",%^,"%R","%u"
# AWS | Elastic Load Balancing
#log-format %dT%t.%^ %^ %h:%^ %^ %T %^ %^ %^ %s %^ %b "%r" "%u"
# AWSS3 | Amazon Simple Storage Service (S3)
#log-format %^[%d:%t %^] %h %^"%r" %s %^ %b %^ %L %^ "%R" "%u"
# Virtualmin Log Format with Virtual Host
#log-format %h %^ %v %^[%d:%t %^] "%r" %s %b "%R" "%u"
# Kubernetes Nginx Ingress Log Format
#log-format %^ %^ [%h] %^ %^ [%d:%t %^] "%r" %s %b "%R" "%u" %^ %^ [%v] %^:%^ %^ %T %^ %^
# In addition to specifying the raw log/date/time formats, for
# simplicity, any of the following predefined log format names can be
# supplied to the log/date/time-format variables. GoAccess  can  also
# handle  one  predefined name in one variable and another predefined
# name in another variable.
#
log-format COMBINED
log-format VCOMBINED
log-format COMMON
log-format VCOMMON
#log-format W3C
#log-format SQUID
#log-format CLOUDFRONT
#log-format CLOUDSTORAGE
#log-format AWSELB
#log-format AWSS3
######################################
# UI Options
######################################

Une fois que ceci est fait, si on omet de préciser le format de log avec la directive « log-format » dans la ligne de commande, goaccess essaie les formats de log activés. Cela peut être tentant d'activer tout les formats mais dans ce cas goaccess met beaucoup plus de temps à effectuer sa tache et prends davantage de ressources. N'activer que le(s) log-format qu'on utilise accroît la rapidité du processus mais risque de renvoyer une erreur si on souhaite analyser un fichier journal rédigés dans un format de log non activé.

Cacher les panneaux inutiles dans la page html

Par défaut la page html générée par goaccess contient de nombreux panneaux ; certains sont plus utiles que d'autres, cacher les panneaux qu'on juge inutiles accroît de beaucoup la lisibilité des informations. Dans la section « Parse Options » il y a un bloc « ignore-panel » en bas ; il est possible de décommenter des lignes pour ignorer telle ou telle donnée. L'exemple suivant ignore les panneaux « Requests static », « Not Found », « Referreres », « Keaphrases » et « status_codes » :

######################################
# Parse Options
######################################
...
# Ignore parsing and displaying the given panel.
#
#ignore-panel VISITORS
#ignore-panel REQUESTS
ignore-panel REQUESTS_STATIC
ignore-panel NOT_FOUND
#ignore-panel HOSTS
#ignore-panel OS
#ignore-panel BROWSERS
#ignore-panel VISIT_TIMES
#ignore-panel VIRTUAL_HOSTS
ignore-panel REFERRERS
#ignore-panel REFERRING_SITES
ignore-panel KEYPHRASES
ignore-panel STATUS_CODES
#ignore-panel REMOTE_USER
#ignore-panel CACHE_STATUS
#ignore-panel GEO_LOCATION 

Changer le format des logs d'Apache

dans apache il faut éditer le fichier /etc/apache2/conf-available/other-vhost Editer ce fichier qui contient une ligne :

log-format COMBINED

On peut changer ici le log-format ou, ce qui peut être utile aussi, ajouter un log dans un format différent.

Conclusion

GoAccess est léger, sans base de données et facile à configurer. Il semble convenir pour surveiller un simple site web. Pour ma part je surveille un site avec peu de trafic à l’intérieure d'un vpn et finalement il ne me sert pas à grand chose. Je regrette l'interface belle mais peu claire.

Remerciement spécial à lol pour la résurrection de mon compte ;) copyleft Petitchat