Monitorer son serveur permet de surveiller les évènements et diverses données relatives aux applications que le serveur fait tourner
Dans ce tutoriel nous allons voir comment monitorer le pare-feu Linux UFW (Uncomplicated Firewall) avec Grafana, Telegraf et InfluxDB. Ce monitoring permettra de visualiser les paquets bloqués par le pare-feu, les IP bloquées et permettra même d'afficher une carte du monde avec la localisation des IP bloquées.
Grafana est un outil puissant permettant de visualiser des données diverses. Grafana n'est qu'un outil de visualisation, il est donc nécessaire d'utiliser d'autres outils qui vont récolter les données, les traiter et les stocker. Prometheus est souvent utilisé en conjonction avec Grafana pour extraire les données de diverses sources et les stocker dans sa base de données interne.
Telegraf est un autre outil plutôt axé sur la lecture de données de fichiers journaux (logs) et de leur traitement. InfluxDB est utilisé en coopération avec Telegraf, cet outil étant chargé de stocker les données envoyées depuis Telegraf et d'effectuer des requêtes sur ces données.
Ici nous allons récolter les données des paquets bloqués depuis le fichier journal d'UFW : /var/log/ufw.log
Le logging de UFW est activé par défaut
Pré-requis
- Un serveur Linux
- Avoir installé Docker sur le serveur
- Un ordinateur ou une machine virtuelle Linux (pour configurer et compiler l'outil telegraf-geoip)
- Durée approximative : 30 minutes à 1h
Installation des outils
Il faut tout d'abord installer les 3 outils : Grafana, Telegraf et InfluxDB
La façon la plus facile de les installer est d'utiliser Docker et de configurer des containers pour ces outils Il est également possible de les installer directement sur le serveur, mais ce tutoriel sera axé sur l'utilisation de Docker.
Installation des outils avec Docker Compose
Voici un exemple de fichier docker-compose.yml
pour installer les 3 outils :
version: "3"
volumes:
grafana_data: {}
networks:
grafana_influxdb:
driver: bridge
services:
grafana:
container_name: grafana
hostname: grafana
image: grafana/grafana-oss:latest
restart: unless-stopped
volumes:
- grafana_data:/var/lib/grafana
ports:
- 3000:3000
networks:
- grafana_influxdb
telegraf:
image: telegraf:alpine
container_name: telegraf
restart: unless-stopped
user: telegraf:4 # Nécessaire pour pouvoir lire le fichier de log UFW
volumes:
- /var/log/ufw.log:/var/log/ufw.log
- ./telegraf.conf:/etc/telegraf/telegraf.conf
- ./geoip:/usr/bin/geoip
- ./GeoLite2-City.mmdb:/var/lib/geoip/GeoLite2-City.mmdb
- ./geoip.conf:/etc/geoip/geoip.conf
networks:
- grafana_influxdb
influx_db:
image: influxdb:alpine
container_name: influx_db
restart: unless-stopped
volumes:
- ./influxdb2:/var/lib/influxdb2
expose:
- 8086
ports:
- 8086:8086
networks:
- grafana_influxdb
Copiez ce fichier exemple dans un fichier nommé docker-compose.yml
.
Dans le fichier de configuration, il y a une ligne avec user: telegraf:4 # Nécessaire pour pouvoir lire le fichier de log UFW
. Le chiffre 4 correspond à l'identifiant du groupe auquel appartient le fichier de log d'UFW (ici /var/log/ufw.log
). Vous pouvez le connaître en lançant la commande stat /var/log/ufw.log
, il apparaîtra ensuite au niveau de GID: ( X/ xxx)
(où X
est le numéro du groupe). Changez ce nombre dans le fichier docker-compose.yml
s'il est différent de 4
.
Créez un dossier sur votre serveur qui stockera les fichiers de configuration et le fichier docker-compose.yml
Lancez ensuite le téléchargement des images, la création des containers et leur lancement en arrière-plan avec la commande docker-compose up -d
Vous aurez peut-être une erreur au lancement de la commande : le container Telegraf ne pourra pas se lancer car il manque les fichiers de configuration indiqués dans le fichier docker-compose.yml
. Nous les créeront au cours de ce tutoriel. Dans tous les cas, les containers InfluxDB et Grafana se lanceront sans soucis.
Pour le moment nous allons devoir configurer InfluxDB avant de pouvoir configurer Telegraf.
Configuration d'InfluxDB
Ouvrez l'adresse suivante sur un navigateur web :
http://ADRESSE-IP-DU-SERVEUR:8086/
Vous devrez peut-être autoriser l'accès au port 8086 sur le pare-feu de votre serveur (sudo ufw allow 8086
).
Vous serez accueilli avec la page initiale d'InfluxDB. Cliquez sur Get Started
.
Entrez ensuite un nom d'utilisateur et un mot de passe.
Entrez ensuite un nom d'organisation (retenez-le bien).
Entrez ensuite ufw_data
dans le champ Initial Bucket Name
.
Validez ensuite, puis cliquez sur Configure later
.
Une fois cela fait, rendez-vous dans la section Data, puis API Tokens :
Cliquez ensuite sur Generate API Token, puis Read/Write API Token.
Une fenêtre s'ouvre, entrez un nom pour le token, puis sélectionnez le bucket ufw_data dans Read et Write :
Cliquez ensuite sur le token dans la liste, puis copiez quelque part le token généré. Il nous sera nécessaire pour paramétrer Telegraf.
C'est tout pour cette partie. Dans la prochaine partie, nous configurerons l'outil Telegraf.
Configuration de Telegraf
Note : il est possible que le démarrage du fichier Docker Compose ait créé des dossiers avec les noms des fichiers de configuration qui seront à créer au cours de ce tutoriel. Pour éviter les problèmes, arrêtez le container Telegraf avec la commande docker container stop telegraf
et supprimez les différents dossiers qui ont été créés avec la commande rm -r dossiers/
.
Fichier de configuration de Telegraf
Créez un fichier de configuration nommé telegraf.conf
et copiez le contenu suivant dans ce fichier :
[agent]
interval = "10s"
debug = false
round_interval = true
flush_interval = "10s"
flush_jitter = "0s"
collection_jitter = "0s"
metric_batch_size = 1000
metric_buffer_limit = 10000
quiet = false
logfile = ""
omit_hostname = false
[[inputs.tail]]
files = ["/var/log/ufw.log"]
from_beginning = true
name_override = "ufw_log"
watch_method = "poll"
grok_patterns = ["%{CUSTOM_LOG_FORMAT}"]
grok_custom_patterns = '''
CUSTOM_LOG_FORMAT %{SYSLOGTIMESTAMP:ufw_timestamp} %{SYSLOGHOST:ufw_hostname} %{DATA:ufw_program}: \[%{NUMBER:kernel_time}\] \[UFW %{WORD:ufw_action}(?: %{WORD:ufw_subaction})?\] IN=%{DATA:ufw_interface}( OUT=%{DATA:ufw_interface_out})?( PHYSIN=%{DATA:ufw_physin})? MAC=%{DATA:ufw_mac} SRC=%{IP:ufw_src_ip} DST=%{IP:ufw_dest_ip} LEN=%{NUMBER:ufw_packet_len} TOS=%{DATA:ufw_tos} PREC=%{DATA:ufw_prec} TTL=%{NUMBER:ufw_ttl} ID=%{NUMBER:ufw_id}( DF)? PROTO=%{WORD:ufw_protocol}( SPT=%{NUMBER:ufw_source_port})?( DPT=%{NUMBER:ufw_dest_port})?( WINDOW=%{NUMBER:ufw_window})?( RES=%{BASE16NUM:ufw_res})?( %{WORD:ufw_flags})?( URGP=%{NUMBER:ufw_urgp})?( TYPE=%{NUMBER:ufw_icmp_type})?( CODE=%{NUMBER:ufw_icmp_code})?
'''
data_format = "grok"
grok_timezone = "Europe/Paris"
grok_custom_pattern_files = []
[[outputs.influxdb_v2]]
## The URLs of the InfluxDB cluster nodes.
##
## Multiple URLs can be specified for a single cluster, only ONE of the
## urls will be written to each interval.
## urls exp: http://127.0.0.1:8086
urls = ["URL_VERS_INFLUXDB"]
## Token for authentication.
token = "TOKEN_INFLUXDB"
## Organization is the name of the organization you wish to write to; must exist.
organization = "ORGANISATION"
## Destination bucket to write into.
bucket = "ufw_data"
insecure_skip_verify = true
Modifiez le fichier de configuration comme suit :
- Entrez l'adresse vers InfluxDB à la ligne
urls
sousoutputs.influxdb_v2
- Entrez le token que vous avez récupéré à la section précédente à la ligne
token
- Entrez le nom de l'organisation tel que vous l'avez entré lors de la configuration intiale de InfluxDB à la ligne
organization
- Vous pouvez aussi essayer ce Grok pattern si celui ci-dessus ne fonctionne pas chez vous :
%{SYSLOGTIMESTAMP:ufw_timestamp:ts-syslog} %{SYSLOGHOST:ufw_hostname} %{DATA:ufw_program}: \[%{DATA}\] \[UFW %{WORD:ufw_action}\] IN=%{DATA:ufw_interface} OUT=%{DATA:ufw_interface_out}( (MAC|PHYSIN)=%{DATA:ufw_mac})?SRC=%{IP:ufw_src_ip} DST=%{IP:ufw_dest_ip}( LEN=%{NUMBER:ufw_packet_len})? %{GREEDYDATA:ufw_tcp_opts} PROTO=%{WORD:ufw_protocol}( SPT=%{NUMBER:ufw_source_port})?( DPT=%{NUMBER:ufw_dest_port})?%{GREEDYDATA:ufw_tcp_opts}
- Ou essayez celui-ci :
%{TIMESTAMP_ISO8601:ufw_timestamp} %{HOSTNAME:ufw_hostname} %{DATA:ufw_program}: \[%{DATA}\] \[UFW %{WORD:ufw_action}\] IN=%{DATA:ufw_interface} OUT=%{DATA:ufw_interface_out}( (MAC|PHYSIN)=%{DATA:ufw_mac})? SRC=%{IP:ufw_src_ip} DST=%{IP:ufw_dest_ip}( LEN=%{NUMBER:ufw_packet_len})? %{GREEDYDATA:ufw_tcp_opts} PROTO=%{WORD:ufw_protocol}( SPT=%{NUMBER:ufw_source_port})?( DPT=%{NUMBER:ufw_dest_port})?%{GREEDYDATA:ufw_tcp_opts}
- Vous pouvez désactiver les fichiers de log en positionnant la valeur de
quiet
àtrue
etlogfile
à/dev/null
. Mais dans un premier temps, je vous conseille de les laisser activés pour vérifier qu'il n'y a pas d'erreurs lors du démarrage de telegraf.
C'est à peu prêt tout, redémarrez le container de Telegraf avec la commande docker container restart telegraf
Vérifiez que Telegraf ne renvoie aucun message d'erreur avec la commande docker container logs telegraf
Configuration de la GeoIP (optionnel)
Cette étape est optionnelle. Elle permettra d'afficher une carte du monde avec la localisation des IP bloquées. Pour cela, nous utiliserons un petit programme disponible sur ce dépôt Github.
Téléchargement et compilation de telegraf-geoip
Utilisez votre ordinateur principal pour cette partie afin de compiler le projet. Il vous suffira ensuite de transmettre le binaire compilé vers votre serveur.
Clonez le dépôt Github de telegraf-geoip avec git clone https://github.com/a-bali/telegraf-geoip
puis déplacez-vous vers le dossier du clone.
Installez le compilateur Golang pour compiler le projet. Sur Ubuntu, vous pouvez installer les outils Golang en lançant la commande sudo snap install --classic go
. Il est aussi possible de l'installer avec apt
(le package est nommé golang
).
Compilez ensuite avec la commande CGO_ENABLED=0 go build -o geoip cmd/main.go
Si tout s'est bien passé, un binaire nommé geoip
sera créé.
Vous pouvez ensuite transférer ce binaire vers votre serveur, vers le dossier que vous avez créé regroupant le fichier de configuration Docker Compose et les autres fichiers de configuration :
scp geoip NOM_UTILISATEUR@IP_SERVEUR:/dossier/sur/le/serveur
Téléchargement de la base de données MaxMind GeoLite2
Afin de pouvoir fonctionner, l'outil telegraf-geoip nécessite une base de données de localisations d'IP. Nous utiliserons ici la base de données gratuite de MaxMind : GeoLite2.
Pour cela, inscrivez-vous sur le site de MaxMind
Une fois inscrit, vous devrez confirmer votre compte en ouvrant un lien qui vous sera transmis par e-mail.
Connectez-vous ensuite à votre compte, puis cliquez sur Download Databases
. Sur la page qui va s'ouvrir, cliquez sur Download GZIP
au niveau de la ligne GeoLite2 City
.
Une fois le téléchargement terminé, décompressez le fichier en .mmdb
de l'archive et transférer ce fichier vers votre serveur :
scp fichier.mmdb NOM_UTILISATEUR@IP_SERVEUR:/dossier/sur/le/serveur
Configuration de telegraf-geoip
Créez un fichier de configuration nommé geoip.conf
sur votre serveur, dans le dossier regroupant les différents fichiers de configuration (Docker Compose) et le binaire geoip.
Entrez le contenu suivant :
[[processors.geoip]]
## db_path is the location of the MaxMind GeoIP2 City database
db_path = "/var/lib/geoip/GeoLite2-City.mmdb"
[[processors.geoip.lookup]]
# get the ip from the field "source_ip" and put the lookup results in the respective destination fields (if specified)
field = "ufw_src_ip"
dest_country = "ufw_src_ip_country"
dest_city = "ufw_src_ip_city"
dest_lat = "ufw_src_ip_lat"
dest_lon = "ufw_src_ip_lon"
Sauvegardez ensuite le fichier
Configuration de Telegraf
Dans le fichier de configuration telegraf.conf
, copiez le contenu suivant à la fin du fichier :
[[processors.execd]]
command = ["/usr/bin/geoip", "--config", "/etc/geoip/geoip.conf"]
Sauvegardez ensuite vos modifications.
Redémarrez Telegraf avec la commande docker container restart telegraf
.
Configuration de Grafana
Accédez sur votre navigateur web à l'adresse suivante :
http://ADRESSE-IP-DU-SERVEUR:3000/
Vous devrez peut-être autoriser l'accès au port 3000 sur le pare-feu de votre serveur (sudo ufw allow 3000
).
Le login/mot de passe par défaut au premier lancement de Grafana est admin
/admin
. Entrez ensuite un nouveau mot de passe pour le compte d'administration.
Une fois cela fait, rendez-vous dans la section Configuration > Datasources, puis cliquez sur Add data source
.
Sélectionnez InfluxDB
dans la liste qui s'affiche
Vous devrez ensuite configurer la source. Sélectionnez Flux
dans la section Query Language
.
Dans le champ URL
, entrez l'adresse vers InfluxDB
Dans InfluxDB details
, entrez les bonnes données telles que configurées dans InfluxDB :
- Organization
- API token
- Default Bucket : entrez ufw_data
Ensuite, rendez-vous dans la section Create > Import
. Importez ensuite le fichier JSON qui est téléchargeable à l'adresse suivante : https://www.eliastiksofts.com/grafana-ufw-dashboard/downloads/
Si tout s'est bien passé, vous verrez ensuite s'ouvrir le dashboard, comme sur la capture d'écran au début de cet article.
Commentaires