Aller au contenu principal

Générateurs et messages types

Un générateur est une technologie source : Palo Alto NGFW, Microsoft Entra ID, Office 365… Il porte des messages types, et chaque message type porte un template qui décrit la forme d'un log de cette technologie.

Le générateur​

ChampRôle
NomIdentité fonctionnelle, unique. L'identifiant technique en est dérivé
ÉditeurLe vendeur, à titre informatif
Format de sortieChoisit le validateur appliqué à l'aperçu
Alertes seulesExclut la technologie du flux continu : elle n'émet que sur scénario

Le corpus source n'est pas que du JSON. Cinq formes de sortie coexistent :

FormatExemple de technologie
JSONLa majorité — Office 365, GitHub, Google Workspace…
CEFFortinet FortiGate
CSVPalo Alto NGFW, une ligne de 60+ champs positionnels
KEY_VALUEVeeam Backup & Replication, entre crochets
TEXTVMware ESXi et vCenter, Systancia Cleanroom — du syslog nu

Le message type​

ChampRôle
NomEn kebab-case. C'était le nom du fichier .jinja du projet source
CatégorieAUTH, PROCESS, NETWORK, FILE, DNS, ALERT ou ASSET
PoidsFréquence relative d'émission. 0 = alertes seules
FormatHérité de la technologie, sauf dérogation explicite
DonnéesLe dataset dans lequel le moteur tire un échantillon

Le poids nul est un état, pas une absence​

Un message type de poids 0 n'est jamais émis dans le flux normal : il n'existe que pour être déclenché par un scénario d'alerte. Ce n'est pas une désactivation — c'est un mode de fonctionnement à part entière, que 178 des 470 messages types du corpus utilisent.

Le format peut déroger à celui de la technologie​

Palo Alto NGFW émet du CSV, mais son message type dns est en JSON. Quatre messages types du corpus dérogent ainsi. Le message type porte alors sa propre valeur ; sinon il hérite, et l'interface affiche « hérité ».

C'est visible dans l'éditeur, sur un badge : JSON — déroge à CSV. L'aperçu valide toujours contre le format effectif, jamais contre celui de la technologie.

L'éditeur de template​

Le template est du Nunjucks, portage direct du Jinja2 de l'ancien projet — 467 des 470 templates compilent, les trois derniers butant sur un idiome Python.

L'éditeur a trois onglets :

  • Message type — la source, dans un éditeur coloré, avec une palette qui insère l'extrait à la position du curseur ;
  • Données — le dataset rattaché, et ce que ses clés rendent disponible dans la palette ;
  • Aperçu — le rendu, validé selon le format.

La palette​

Elle propose les champs du contexte de rendu, groupés :

GroupeContenu
Utilisateur / Serveuruser.name, user.desktop_ip, server.agent_id…
Horodatagetimestamp.isoformat(), sept formats strftime, epoch en secondes et millisecondes
Identifiantsuuid4(), hexId(n), bigDigits(n), derivedId(…)
Aléatoirerandint, choice, weightedChoice, zpad, publicIp()
Structuresboucles, conditions, set, | tojson
Champs du datasetCalculé depuis les clés réellement présentes dans le dataset rattaché

Le tirage aléatoire est déterministe : à graine égale, deux aperçus sont identiques. Aucun Math.random n'entre dans le rendu.

L'aperçu​

Il rend contre un utilisateur, un serveur et un site fictifs — ou, si une population existe, contre une entité réelle choisie dans « rendre avec ». Puis il vérifie que la sortie respecte le format déclaré :

  • JSON doit parser — l'erreur est située à la ligne et à la colonne ;
  • CEF doit commencer par CEF: et porter au moins sept champs d'en-tête ;
  • CSV doit tenir sur une seule ligne et compter au moins 20 virgules ;
  • KEY_VALUE doit contenir au moins une paire clé="valeur" ;
  • tous formats : un {{ ou un {% survivant au rendu est une erreur.

Les avertissements​

Ils ne bloquent pas l'enregistrement, ils signalent :

  • valeur JSON non gardée — "pid": {{ sample.pid }} rend "pid": si la clé manque, ce qui casse le JSON. Un | default(0) suffit. C'est le défaut le plus fréquent du corpus, d'où les 934 | default(…) qu'il contient ;
  • racine de contexte inconnue — usr.name au lieu de user.name rend vide, silencieusement ;
  • filtre inconnu.

Une source qui ne compile pas est refusée, elle : un template cassé en base ne se découvrirait qu'à l'émission, sur un lot entier perdu.

Envoyer le message​

Sous l'aperçu, « Envoyer ce message » expédie exactement le rendu affiché vers un intake. C'est le seul moyen de savoir si un template porté est réellement accepté : un message qui valide localement peut très bien être refusé à l'arrivée.

  • Destination — l'une des 7 régions SEKOIA, dont l'URL est connue du produit, ou une URL personnalisée (un webhook de test, un bouchon local). Le champ d'URL reste visible en permanence : il n'est requis que pour la destination personnalisée.
  • Intake key — transmise à l'intake dans le corps de la requête, jamais enregistrée en base ni journalisée. Elle ne transite que par la file, le temps de l'envoi.

Le corps posté est celui de l'API SEKOIA : {"intake_key": "…", "jsons": ["<le message>"]}.

Une sortie que le validateur juge invalide peut quand même être envoyée : c'est précisément l'intake qu'on cherche à interroger, et son verdict est le seul qui tranche.

Le chemin est le vrai chemin de production : l'écran dépose le message sur la file log-dispatch, api-sender le consomme et poste. Ce qui s'affiche ensuite est le résultat réel de l'envoi — statut HTTP, durée, message d'erreur — pas un accusé de mise en file.

StatutCe qu'il dit
EnvoyéL'intake a répondu 2xx.
ÉchecRefus définitif (4xx), ou 5 tentatives infructueuses sur une panne (5xx, réseau).
Toujours en coursPersonne n'a consommé la file dans le délai. Le message n'est pas perdu : il part dès qu'api-sender revient.

Un 5xx ou une coupure réseau sont réessayés 5 fois en backoff exponentiel ; un 4xx ne l'est pas — une intake key refusée ne s'arrangera pas en insistant.

« Derniers envois de ce message type » liste les cinq derniers envois du message type ouvert, et non de l'instance entière : sur un écran d'édition, c'est l'historique de ce qu'on édite qui renseigne. La vue globale, elle, est sur l'écran Envois.

Supprimer​

Chaque message type et chaque générateur portent un bouton de suppression, en deux temps : le premier clic affiche une confirmation qui chiffre ce qui part (« et ses 13 message(s) type(s), templates compris »), le second exécute.

Supprimer un générateur ne détruit pas ses datasets : ils deviennent partagés et restent éditables. Supprimer un message type ne détruit pas son dataset non plus.