Superviser un FortiGate avec Uptime Kuma

Hello world !

Avec un peu de retard, voici l’article d’avril 😉

Surveiller la disponibilité de ses services web est essentiel, que l’on soit développeur, administrateur système ou simplement passionné d’infrastructure. Il existe une multitude de solutions professionnelles et/ou open source comme Nagios, Centreon, Zabbix. Ce sont des solutions très complètes mais assez lourde à mettre en œuvre, et donc pas forcément adaptées à des besoins simples (home lab, infra TPE, etc…)

Et c’est là qu’entre en jeu Uptime Kuma ☺

Qu’est ce qu’Uptime Kuma ?

Uptime Kuma est un outil de monitoring libre et open-source, pensé pour être à la fois simple à utiliser et puissant.

Décrit comme l’alternative auto-hébergée à des solutions comme UptimeRobot, Uptime Kuma permet de surveiller facilement l’état de vos sites web, serveurs, API ou encore ports réseau. Il propose une interface web moderne, des notifications via de nombreux canaux (Discord, Telegram, email, etc.), et une installation rapide grâce à Docker.

Uptime Kuma est particulièrement apprécié pour sa facilité de déploiement, ses fonctionnalités complètes sans abonnement, et sa communauté active.

Comment déployer Uptime Kuma rapidement et facilement ?

Le plus simple reste d’utiliser Docker avec Portainer. Je ne vais pas rentrer dans le détail sur « comment installer Portainer chez soi« , il existe moult tutoriels sur Internet 😉

Sur Portainer, créer un volume dédié à Uptime Kuma

Ensuite, créer un nouveau container

Configurer les paramètres suivants :

  • Image : louislam/uptime-kuma
  • Add additional port : choisir un port TCP libre et le mapper au port 3001 du container

Dans les paramètres avancés, section « Volumes »

  • Mapper le volume créé à l’étape précédente sur le chemin /app/data
  • (optionnel) Mapper le chemin /var/run/docker.sock si vous souhaitez superviser les conteneurs de l’hôte docker

Et déployer 🙂

Il vous sera demandé au boot de choisir un login et mot de passe admin, et un type de base de données (choisir SQlite si petit besoin)

Créer sa première sonde

On commence par ajouter une nouvelle sonde.

On va faire simple : un PING. Comme on peut voir, c’est très simple à configurer : un nom, une IP ou un nom d’hôte, un intervalle de tests, et le nombre de tests consécutifs avant de considérer la sonde comme « down »

On a ensuite possibilité de configurer une notification, et là on a l’embarras du choix !

  • SMTP classique
  • Services en ligne de SMS
  • Services de tchat : Telegram, Signal, Discord, Teams, …
  • Services en ligne de notification : Ntfy, Pushover, Pushbullet, …

Ici on va faire avec un service accessible publiquement : Ntfy.sh

Et voilà, vous avez votre première sonde qui fonctionne. Et voici le résultat après avoir généré volontairement une panne furtive :

Monitorer le FortiGate en API

Si on veut récupérer des infos précises, le mieux est de le faire en API. Tout est bien documenté sur le FNDN.

En préambule, il faut créer un compte API REST sur le FortiGate.

On précise le compte API, les droits et l’IP du serveur Uptime Kuma

On obtient une clé API, qu’on garde précieusement de côté !

Reste plus qu’à récupérer de l’info. On va ici faire un exemple avec des tests de santé SD-WAN. La requête API permettant de récupérer les informations est /api/v2/monitor/virtual-wan/health-check

Si on l’insère dans le navigateur, on obtient directement le résultat JSON.

La réponse souhaitée est dans results > nom du test de santé > interface WAN. Pour l’exemple ci-dessous on va s’intéresser à un test de santé qui s’appelle « Internet_IPV4 » et qui inclue notamment l’interface « wan1 ».

On revient à Uptime Kuma, on ajoute une sonde de type HTTP(s) – Requête JSON. On insère notre URL « https://x.x.x.x/api/v2/monitor/virtual-wan/health-check« 

Au niveau du champ « requête JSON », il faut préciser comment on doit analyser la réponse. Pour cela Uptime Upma utilise JSONata, et dans notre cas la syntaxe est « results.Internet_IPV4.wan1.status » (on récupère l’état de « wan1 » sur le test de santé « Internet_IPV4 ») et la valeur attendue est « up ».

La requête nécessitant notre clé API, on va la préciser dans les headers de la requête comme suit :

{
    "Authorization": "Bearer tj58fGmbz.............6jbpbN4"
}

Reste à décocher la case pour la vérification des certificats si vous utilisez un auto-signé :

Jouer avec JSONata pour analyser des données

JSONata contient plein de filtres bien documentés, mais si on veut faire un cas d’usage concret, on peut lever une alarme si un lien WAN est en panne quel que soit le lien. Pour cela on va demander à JSONata de :

  • Pour chaque lien WAN du health check « Internet_IPV4 », récupérer la clé « status » et copier la valeur dans une liste
  • Filtrer cette liste pour ne garder que les valeurs égales à « down »
  • Compter le nombre d’entrées dans la liste résultante
  • Retourner un booléen « vrai » si égal à 0
$count($filter(results.Internet_IPV4.*.status, function($v) { $v = "down" })) = 0

Ce qui donne dans Uptime Kuma :

A noter que les valeurs de status sont « up », « down » ou « error » (le health check ne monitore pas le lien sélectionné) –> Donc compter le nombre d’occurences de « down » suffit 😊)

Il vous reste plus qu’à découvrir l’API puis à traiter les données à superviser comme bon vous semble !

A noter une limitation assez gênante, chaque sonde est indépendante, il n’est pas possible d’avoir des variables globales (une clé API par exemple) partagée entre plusieurs sondes…

Pour aller plus loin…

FortiManager en mode proxy

Il est également possible d’utiliser un FortiManager en tant que Proxy pour récupérer les informations sur un FortiGate cible.

Cela va nécessiter quelques adaptations

  • On va requêter sur /jsonrpc sur le FortiManager
  • On va envoyer ce qu’on souhaite récupérer dans le corps de la requête, au format json
  • Le token à soumettre pour l’authentification est celui du FortiManager, il n’est pas nécessaire d’avoir un compte API sur le FortiGate
  • Attention les requêtes adressées au FMG sont de type POST

Voici un exemple de requête à adapter à votre contexte

{
    "id": 42,
    "jsonrpc": "1.0",
    "method": "exec",
    "params": [
        {
            "data": {
                "action": "get",
                "resource": "/api/v2/monitor/virtual-wan/health-check",
                "target": [
                    "adom/root/device/NOM_DU_FW_SUR_LE_FMG"
                ]
            },
            "url": "/sys/proxy/json"
        }
    ]
}

Et voici comment récupérer le résultat avec JSONata

result[0].data[0].response.results.Internet_IPV4.wan1.status

Construire une supervision automatique

Uptime Kuma est pilotable en API, il est donc possible de créer ou mettre à jour des sondes automatiquement via un script. On peut imaginer un outil qui ajouterait des nouvelles sondes à partir d’une source de vérité (un FortiManager contenant des FortiGate) et un canvas de sondes à construire par équipement… une idée à creuser 😉

Fin de la 2G/3G en France : impacts pour les alarmes Diagral ?

Présentation Si vous vous êtes intéressé un jour aux alarmes à installer soi-même, vous connaissez forcément la marque Diagral. Diagral est une marque française spécialisée dans les systèmes d’alarme et de sécurité pour les particuliers. Elle conçoit et commercialise des solutions sans fil pour la protection des habitations, incluant des alarmes, des détecteurs de mouvement, […]

Utiliser la fonction « BYOI » (Bring Your Own Image) pour installer ESXi sur son serveur OVHcloud

Hello world, Comme vous le savez surement, Broadcom a racheté VMware, et depuis ce rachat le nouveau propriétaire effectue de grandes transformations sur son modèle de vente : fin des licences perpétuelles, licences par abonnement, augmentation significative des prix, etc… Pour les TPE et particuliers « geek », le principal changement concerne la fin de disponibilité des […]

Bug VMware ESXi lorsqu’on fait un RDM avec un disque local

Bonjour à tous, Un article rapide pour raconter un problème que j’ai eu avec mon serveur ESXi en 6.5 U2 : j’ai voulu mapper un disque de 4To en RDM sur une machine virtuelle. Ce disque est relié directement à ma carte mère, qui dispose de deux contrôleurs SATA : un Intel et un Marvell […]

Cisco ISE ACL Converter 1.0.5 est disponible !

Bonjour à tous, J’ai mis à jour mon « Cisco ISE ACL Converter ». Il est désormais disponible en version 1.0.5. Quelques corrections minimes, sans apport de nouvelles fonctionnalités… voici le changelog : ## [1.0.5] – 11/01/2019### Changed- Add a batch file for « wlcoptimize » rules ### Fixed- Domain « www.g-rom.info » replaced with « www.g-rom.fr » in disclaimer text- Batch files […]

Aquila Reloaded – Chapitre 15 : Premiers problèmes et solutions

Hello les AquilaBoyz, Aujourd’hui il est temps de débriefer sur les premiers résultats de cette plateforme. La première chose qu’il faut bien remarquer : dans l’ensemble, ça fonctionne bien ! La carte a cependant quelques défauts de conception qu’il faut régler… Les défauts… Petite coquille sur les résistances des MOSFET La première coquille est là… […]

Cisco ISE ACL Converter 1.0.4 est disponible !

Bonjour à tous, J’ai mis à jour le vieillot « Cisco ISE ACL Converter », qui n’a pas été mis à jour depuis près de 2 ans. Il est désormais disponible en version 1.0.4, . Quelques petites améliorations mineures pour la génération des ACL WLC… voici le changelog : ## [1.0.4] – 23/12/2018### Changed- WLC Optimize : […]

Aquila Reloaded – Chapitre 14 : Premiers essais

Hello les Aquiboyz, Maintenant que le circuit imprimé est fait, on passe à la suite, il faut intégrer tous les équipements dans le circuit d’origine et faire quelques essais ! Intégration de la LED dans le châssis Pour refroidir la LED, j’ai pris la décision d’utiliser un radiateur AMD pour Athlon 64 X2. J’en ai […]

Aquila Reloaded – Chapitre 13 : Assemblage du circuit imprimé

Hello les Aquilaboys ! On passe aux choses sérieuses sur Aquila, il faut préparer le circuit imprimé ! Où commander un circuit imprimé ? Alors, pour info j’ai eu la flemme de créer moi-même le circuit imprimé. D’une part il faut une insoleuse, une graveuse, etc… et surtout de la place ! Vivant en appartement, […]