Blog & Astuces

Monitorer son serveur avec Grafana - Monitorer son site web (Nginx)

Monitorer son serveur avec Grafana - Monitorer son site web (Nginx)

Tuto

Ce tutoriel fait suite au tutoriel Monitorer son serveur avec Grafana - Monitorer le pare-feu UFW. Il vous montrera comment monitorer son (ou ses sites web) via Grafana.

Pour ce tutoriel, nous allons monitorer directement les logs de Nginx (qui peut fonctionner en mode reverse proxy ou en serveur web classique) avec Telegraf, envoyer les données à InfluxDB et les afficher sur Grafana.

Ce qui sera monitoré :

  • Localisation des visiteurs/requêtes à destination d'un de vos sites web (et affichage sur une carte)
  • Nombre de requêtes avec leurs code de résultat HTTP (200, 404, etc.)
  • Affichage direct des logs sous forme de tableau
  • Affichage direct des logs d'erreur sous forme de tableau. Utile pour voir les cas d'erreurs 404 pour les liens cassés (et également les malins tentant d'hacker votre site en scannant les vulnérabilités ;)

Il est possible de choisir parmi la liste des sites web qu'héberge votre Nginx (s'il est en mode reverse proxy).

Comme le tutoriel précédent, les pré-requis sont :

  • 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

Vous pouvez vous reporter au tutoriel Monitorer son serveur avec Grafana - Monitorer le pare-feu UFW qui vous montrera comment installer ces outils grâce à Docker (et en prime de monitorer votre pare-feu UFW, mais vous pouvez ignorer les parties qui paramètrent Telegraf et l'installation du dashboard Grafana si ça ne vous intéresse pas).

Paramétrage de Nginx

Avant de passer à la suite, paramétrez vos logs Nginx comme suit :

log_format main '$remote_addr - $remote_user [$time_local]'
                  '"$request" "$host" $status $body_bytes_sent'
                  '"$http_referer" "$http_user_agent"'
                  '"$request_time" "$upstream_connect_time"';

Cette configuration doit être ajoutée dans la partie http de votre fichier de configuration Nginx.

Paramétrage de Telegraf

Pour pouvoir exploiter le fichier log de votre Nginx, modifiez le paramétrage docker-compose.yml de Telegraf. Cela consistera tout simplement à faire un lien vers le fichier de log de votre Nginx.

Ajouter cette ligne au niveau de volumes dans le docker-compose.yml :

- /var/log/nginx/access.log:/var/log/nginx/access.log

La partie avant les deux-points (:) correspondant au chemin vers le fichier de log de votre Nginx. Nous utiliserons un bucket nommé ufw_data pour stocker les données (le même que celui du précédent tutoriel)

Il faudra aussi paramétrer le fichier de configuration de Telegraf (telegraf.conf). Paramétrez-le comme suit (cette config prend en compte celle du précédent tutoriel) :

[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/nginx/access.log"]
   from_beginning = true
   name_override = "nginx_access_log"
   grok_patterns = ["%{CUSTOM_LOG_FORMAT}"]
   watch_method = "poll"
   grok_custom_patterns = '''
        CUSTOM_LOG_FORMAT %{IP:client_ip} %{NOTSPACE:ident} %{NOTSPACE:auth} \[%{HTTPDATE:ts:ts-httpd}\]"(?:%{WORD:verb:tag} %{NOTSPACE:request}(?: HTTP/%{NUMBER:http_version:float})?|%{DATA})" "%{DATA:host:tag}" %{NUMBER:resp_code:tag} (?:%{NUMBER:resp_bytes:int}|-)%{QS:referrer} %{QS:agent}%{QS:request_time} %{QS:upstream_connect_time}
      '''
   data_format = "grok"
   grok_timezone = "Europe/Paris"
   grok_custom_pattern_files = []

[[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: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}
    '''
    data_format = "grok"
    grok_timezone = "Europe/Paris"
    grok_custom_pattern_files = []

[[processors.execd]]
command = ["/usr/bin/geoip", "--config", "/etc/geoip/geoip.conf"]

[[processors.execd]]
command = ["/usr/bin/geoip", "--config", "/etc/geoip/geoip2.conf"]

[[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 = ["https://influxdb.example.com"]

 ## Token for authentication.
 token = "MA CLE API"

 ## Organization is the name of the organization you wish to write to; must exist.
 organization = "XXX"

 ## Destination bucket to write into.
 bucket = "ufw_data"
 # insecure_skip_verify = true

Configuration de la Geo-IP

Reportez-vous à la partie Configuration de la GeoIP (optionnel) du tutoriel Monitorer son serveur avec Grafana - Monitorer le pare-feu UFW pour paramétrer la Geo-IP. La seule différence est que la configuration de la Geo-IP devra être faite dans un autre fichier (geoip2.conf) et devra être celle-là :

[[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 = "client_ip"
dest_country = "nginx_src_ip_country"
dest_city = "nginx_src_ip_city"
dest_lat = "nginx_src_ip_lat"
dest_lon = "nginx_src_ip_lon"

Re-déployez votre Telegraf (docker-compose up -d dans le dossier de votre docker-compose.yml)

Paramétrage de Grafana

Au niveau de Grafana, importez tout simplement le dashboard qui peut être téléchargé à l'adresse suivante : https://www.eliastiksofts.com/grafana-nginx-dashboard/downloads/

Si tout a bien été paramétré, vous pourrez voir un dashboard similaire à celui de l'image d'illustration de l'article.

Bonus

Et voici un aperçu des vulnérabilités que tentent d'exploiter des bots sur l'un de mes sites (La boîte à outils 3DS). Je vous vois les malins (et mon fail2ban vous botte les fesses) :)

Coucou les apprentis hacker

Commentaires