Aller au contenu

Installation de Zabbix

Zabbix-release

Télécharger zabbix-release dans la version correspondant à l'OS utilisé. Parcourir le site pour trouver la bonne version. Par exemple

wget https://repo.zabbix.com/zabbix/7.2/release/debian/pool/main/z/zabbix-release/zabbix-release_latest_7.2%2Bdebian11_all.deb

Puis installer le paquet téléchargé

dpkg -i zabbix-release_latest_7.2%2Bdebian11_all.deb

Mettre à jour apt

apt update -y

Installation de Zabbix server et des prérequis

apt install zabbix-server-mysql zabbix-frontend-php zabbix-sql-scripts zabbix-agent nmap

La BDD SQL

Création de la base et de l'utilisateur

shell> mysql -uroot -p<password>
mysql> create database zabbix character set utf8 collate utf8_bin;
mysql> grant all privileges on zabbix.* to zabbix@localhost identified by '<password>';
mysql> flush privileges;
mysql> quit

Import de la structure

cd /usr/share/zabbix-sql-scripts/mysql
zcat ./server.sql.gz | mysql -uzabbix -p <password>

Configuration de l'interface web

Créer un lien symbolique dans le dossier par défaut de apache pointant vers l'interface web de Zabbix

ln -s /usr/share/zabbix/ /var/www/html/zabbix

Copier le fichier de configuration d'exemple dans le répertoire attendu

cp /usr/share/zabbix/conf/zabbix.conf.php.example  /etc/zabbix/web/zabbix.conf.php

Editer ce fichier et adapter les paramètres relatifs à la base de données.

Autoriser l'utilisateur Zabbix à exécuter des scripts

Installer le programme sudo

apt update && apt install sudo -y

Editer le fichier /etc/sudoers et ajouter ceci en dessous de root :

zabbix ALL=NOPASSWD: ALL

Activer SNMP

Source : https://www.zabbix.com/documentation/5.4/en/manual/config/items/itemtypes/snmptrap

Installer les paquets nécessaires

apt update && apt install snmpd snmp snmptrapd snmp-mibs-downloader -y

Modifier le fichier de configuration du serveur /etc/zabbix/zabbix_server.conf

StartSNMPTrapper=1
SNMPTrapperFile=[TRAP FILE]

Surveillance des logs LiveSwitch avec Zabbix

Contexte

Nous avons besoin d'être alertés par Zabbix lorsque des évènements particuliers apparaissent dans les fichiers de log de Liveswitch Gateway et Mediaserver. La démarche pour y parvenir sera donc expliquée ici, mais le principe reste le même pour tous les logs.

Particularités de LiveSwitch

LiveSwitch génère dans le répertoire /var/log/liveswitch/mediaserver/date_heure.log ou /var/log/liveswitch/gateway/date_heure.log. Une rotation automatique des logs est en place. Elle génère un nouveau fichier de log avec le suffixe .1 si la taille du fichier de log dépasse un certain poids. Le nom est donc très dynamique. Or, nous aurons besoin de spécifier à Zabbix quel fichier de log surveiller. Pour contourner ce problème, nous devrons utiliser un script bash qui générera un lien symbolique vers le dernier fichier de log en date. Ce script devra s'exécuter automatiquement toutes les XX minutes pour mettre à jour ce lien symbolique. Ainsi, Zabbix interogera toujours le même "nom de fichier" qui en réalité sera un lien symbolique vers le dernier fichier de log.

Script utilisé

Voici le script qui permettra d'avoir un lien symbolique avec un nom unique qui pointera vers le dernier fichier de log :

#!/bin/bash

# Fonction pour trouver le répertoire de logs disponible
find_available_log_directory() {
    if [ -d "/var/log/liveswitch/mediaserver" ]; then
        echo "/var/log/liveswitch/mediaserver"
    elif [ -d "/var/log/liveswitch/gateway" ]; then
        echo "/var/log/liveswitch/gateway"
    else
        echo "Aucun répertoire de log valide trouvé."
        exit 1
    fi
}

# Fonction pour trouver le fichier de log le plus récent
find_latest_log_file() {
    find "$1" -type f -name '*.log*' -print0 | xargs -0 ls -t | head -n 1
}

# Fonction pour mettre à jour le lien symbolique
update_symlink() {
    ln -sfn "$1" "$2"
    echo "Lien symbolique mis à jour pour pointer vers : $1"
}

# Fonction pour changer les permissions du fichier
change_file_permissions() {
    chmod +r "$1"
    echo "Permissions modifiées pour rendre le fichier lisible par tous."
}

# Détermination du répertoire des logs
logDir=$(find_available_log_directory)
linkName="$logDir/latest-log.log"

# Affichage des paramètres
echo "Répertoire des logs : $logDir"
echo "Nom du lien symbolique pour la surveillance : $linkName"

# Recherche du fichier de log le plus récent
echo "Recherche du fichier de log le plus récent..."
latestLogFile=$(find_latest_log_file "$logDir")

if [ -z "$latestLogFile" ]; then
    echo "Aucun fichier de log trouvé dans $logDir."
else
    echo "Fichier de log le plus récent trouvé : $latestLogFile"
    update_symlink "$latestLogFile" "$linkName"
    change_file_permissions "$latestLogFile"
fi

Adapter le script au type de serveur !

Adapter le chemin du fichier de log. Ce sera /var/log/liveswitch/mediaserver/date_heure.log pour LiveSwitch MediaServer ou /var/log/liveswitch/gateway/date_heure.log pour les gateways.

Ce script devra s'exécuter automatiquement pour mettre à jour le lien symbolique. Il convient donc d'utiliser crontab -e pour ajouter une tâche planifiée qui exécutera ce script.

Création d'un template dans Zabbix pour remonter des logs particuliers

La première étape est de repérer les logs à surveiller. C'est donc du cas par cas en fonction de l'application générant des logs. Dans notre exemple, nous souhaiterons être alertés lorsque la chaine de caractères suivante apparaitra dans les logs :

Alerte MediaServer (global network problem) : Connection reset by peer

Création d'un élément (item) dans le template

L'item devra ressembler à ceci :

  • Name : Liveswitch check MediaServer log - Alerte MediaServer global network problem Connection reset by peer
  • Type : Zabbix agent (active)
  • Key : log[/var/log/liveswitch/mediaserver/latest-log.log,(?i)(Alerte MediaServer \(global network problem\) : Connection reset by peer)]
  • Type of information : log
  • Update interval : 20s
  • Storage period : 7d

Attention aux caractères spéciaux !

Nous devons précéder les caractères spéciaux d'un caractère d'échappement afin que l'expression régulière soit correctement interprétée. Dans l'exemple ci-dessus, les caractères ( et ) sont précédés de \.

Création d'un déclencheur

Les logs remontent maintenant dans Zabbix, mais nous devons maintenant en être alertés. Voici un exemple de déclencheur :

  • Name : Liveswitch log - Alerte MediaServer global network problem Connection reset by peer
  • Severity : Critical
  • Expression : last(/Liveswitch MediaServer log monitoring/log[/var/log/liveswitch/mediaserver/latest-log.log,(?i)(Alerte MediaServer \(global network problem\) : Connection reset by peer)],#1)<>0

Action de déclencheur

La dernière étape consiste à réaliser une action lorsque le triger se déclenche. En général, il s'agira d'envoyer un message.
Pour cela aller dans le menu Configuration / Actions / Trigger actions

Envoyer des SMS d'alerte avec Twilio

Création du script

Sur le(s) serveur(s) Zabbix, créer un script dans le répertoire /usr/lib/zabbix/alertscripts/ Nom choisi : twilio-sms.sh

Le rendre exécutable

chmod +x /usr/lib/zabbix/alertscripts/twilio-sms.sh

Répliquer sur tous les serveurs !

Si il existe plusieurs serveurs Zabbix, penser à faire la même chose sur tous les serveurs !

#!/bin/bash

# Twilio settings
TO="$1"
FROM="ZABBIX"
BODY="$3"
ACCOUNT_SID="My SID"
API_KEY="My API Key"
API_SECRET="My API Secret"
LOG_FILE="/var/log/twilio_sms.log"

# Current date and time for logging
NOW=$(date '+%Y-%m-%d %H:%M:%S')

# Send the SMS and log the action
echo "$NOW - Sending SMS to $TO" >> $LOG_FILE
curl -s -X POST "https://api.twilio.com/2010-04-01/Accounts/$ACCOUNT_SID/Messages.json" \
--data-urlencode "To=$TO" \
--data-urlencode "From=$FROM" \
--data-urlencode "Body=$BODY" \
-u "$API_KEY:$API_SECRET" >> $LOG_FILE 2>&1

# Log a newline for readability
echo "" >> $LOG_FILE

Autorisation sur le parefeu

Autorisation à ajouter sur le parefeu pour permettre aux serveurs Zabbix de joindre l'URL https://api.twilio.com

Création du type de média dans Zabbix

Menu Administration > Media types > Create

Création du média "Twilio Webhook", de type script.

Indiquer le nom du script créé précédemment

Ajouter DANS L'ORDRE les 3 paramètres

{ALERT.SENDTO} Le N° de tel Twilio

Paramétrage des utilisateurs

Administration > Users

Pour chaque utilisateur susceptible de recevoir un SMS, ajouter le média "Twilio Webhook" et indiquer le N° de téléphone au format international.

Paramétrage des alertes

Configuration > Actions > Trigger actions

Définir les conditions d'alertes par SMS (un groupe d'hôte par exemple) et indiquer d'envoyer par SMS.