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
| Champ | Rôle |
|---|---|
| Nom | Identité fonctionnelle, unique. L'identifiant technique en est dérivé |
| Éditeur | Le vendeur, à titre informatif |
| Format de sortie | Choisit le validateur appliqué à l'aperçu |
| Alertes seules | Exclut 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 :
| Format | Exemple de technologie |
|---|---|
JSON | La majorité — Office 365, GitHub, Google Workspace… |
CEF | Fortinet FortiGate |
CSV | Palo Alto NGFW, une ligne de 60+ champs positionnels |
KEY_VALUE | Veeam Backup & Replication, entre crochets |
TEXT | VMware ESXi et vCenter, Systancia Cleanroom — du syslog nu |
Le message type
| Champ | Rôle |
|---|---|
| Nom | En kebab-case. C'était le nom du fichier .jinja du projet source |
| Catégorie | AUTH, PROCESS, NETWORK, FILE, DNS, ALERT ou ASSET |
| Poids | Fréquence relative d'émission. 0 = alertes seules |
| Format | Hérité de la technologie, sauf dérogation explicite |
| Données | Le 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 :
| Groupe | Contenu |
|---|---|
| Utilisateur / Serveur | user.name, user.desktop_ip, server.agent_id… |
| Horodatage | timestamp.isoformat(), sept formats strftime, epoch en secondes et millisecondes |
| Identifiants | uuid4(), hexId(n), bigDigits(n), derivedId(…) |
| Aléatoire | randint, choice, weightedChoice, zpad, publicIp() |
| Structures | boucles, conditions, set, | tojson |
| Champs du dataset | Calculé 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é :
JSONdoit parser — l'erreur est située à la ligne et à la colonne ;CEFdoit commencer parCEF:et porter au moins sept champs d'en-tête ;CSVdoit tenir sur une seule ligne et compter au moins 20 virgules ;KEY_VALUEdoit contenir au moins une paireclé="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.nameau lieu deuser.namerend 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.
| Statut | Ce qu'il dit |
|---|---|
| Envoyé | L'intake a répondu 2xx. |
| Échec | Refus définitif (4xx), ou 5 tentatives infructueuses sur une panne (5xx, réseau). |
| Toujours en cours | Personne 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.