Blog & Astuces

Monitorer son serveur avec Grafana - Monitorer le pare-feu UFW

Monitorer son serveur avec Grafana - Monitorer le pare-feu UFW

Tuto

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 :

Screenshot

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 :

Screenshot

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 sous outputs.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 et logfile à /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.

Screenshot

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

Screenshot

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