Envoyer les événements à un SIEM
TechWatchAlert peut envoyer les événements de sécurité de votre organisation à votre SIEM, au fil de l’eau : une CVE qui touche un actif, un palier de décision qui monte, une exploitation signalée, une machine corrigée, un dossier rouvert, un constat de conformité ou de surface externe. Votre SOC les corrèle avec le reste de ses journaux, sans ouvrir l’application.
Offres Team et Enterprise La page est réservée aux administrateurs de l’organisation.
Ajouter une destination
Section intitulée « Ajouter une destination »- Ouvrez Réglages de l’organisation › Sécurité › SIEM.
- Choisissez l’outil : Syslog (TLS), Splunk, Microsoft Sentinel ou Elastic.
- Remplissez l’adresse et le secret (voir ci-dessous pour chaque outil).
- Réglez Ce qui part : types d’événements, sévérité minimale, projets.
- Cliquez sur Tester et enregistrer. Le test vérifie l’adresse, le certificat, les identifiants, puis envoie un événement de test (
event_type=test). La destination n’est enregistrée que si le test réussit ; Enregistrer quand même reste possible si votre SIEM n’est pas encore prêt.
Une organisation peut avoir cinq destinations au plus, par exemple un Splunk de production et un syslog de recette.
Réglages de chaque outil
Section intitulée « Réglages de chaque outil »- Transport : TCP chiffré par TLS 1.2 ou plus (RFC 5425), port 6514 par défaut, ou le port de votre collecteur (443, ou de 1024 à 65535).
- Cadrage : une trame par événement, préfixée par sa longueur en octets (octet counting, RFC 6587 § 3.4.1), le seul admis sur TLS.
- Message : en-tête RFC 5424 (
<PRI>1 horodatage hôte application - type -), sans données structurées, puis le corps en CEF (ArcSight, QRadar) ou en JSON (le schéma ci-dessous). - Certificat : vérifié, nom d’hôte compris. Si votre collecteur présente un certificat signé par votre autorité de certification interne, collez-la au format PEM : elle seule est alors acceptée.
- Catégorie syslog :
authpriv(10) par défaut ;auth,auditoulocal0àlocal7au choix. La sévérité syslog suit celle de l’événement (critique → 2, élevée → 3, moyenne → 4, faible → 5, information → 6).
- Adresse : celle de votre HTTP Event Collector, par exemple
https://splunk.exemple.fr:8088, ouhttps://http-inputs-<pile>.splunkcloud.compour Splunk Cloud. Les événements partent sur/services/collector/event. - Jeton HEC : créez-le dans Settings › Data inputs › HTTP Event Collector, autorisé sur l’index voulu.
- Index (facultatif), sourcetype (
techwatchalert:eventpar défaut) et source (techwatchalert). - Plusieurs événements partent dans une même requête ; l’heure de chaque événement est son horodatage (
time, en secondes depuis l’époque). Le canal de requête est fourni ; l’accusé de réception d’indexation n’est pas attendu, laissez-le désactivé sur ce jeton. - Pour que Splunk extraie les champs du JSON à la recherche, déclarez le sourcetype ainsi (
props.conf), ou choisissez le sourcetype_json:
[techwatchalert:event]KV_MODE = jsonLes événements passent par l’API Logs Ingestion d’Azure Monitor, vers une table personnalisée de votre espace Log Analytics. L’ancienne HTTP Data Collector API, dépréciée, n’est pas utilisée.
- Application Entra ID : inscrivez une application et créez un secret client. Notez l’ID du locataire et l’ID de l’application.
- Table : créez la table personnalisée
TechWatchAlert_CLavec les colonnes de la section Colonnes de la table Sentinel. - Règle de collecte (DCR) : déclarez le flux
Custom-TechWatchAlert_CLavec les mêmes colonnes, une destination vers votre espace Log Analytics, et la transformationsource. Le modèle est ci-dessous. - Droits : donnez à l’application le rôle Monitoring Metrics Publisher sur la DCR.
- Dans TechWatchAlert, saisissez le point d’ingestion (celui de la DCR, ou d’un DCE si vous passez par une liaison privée), l’identifiant immuable de la DCR (
dcr-…), le flux, le locataire, l’application et le secret.
Le jeton est obtenu par le flux OAuth 2.0 client credentials. Chaque appel reste sous 1 Mo, la limite de l’API ; un appel freiné (429) est repris après le délai que donne Azure.
{ "properties": { "streamDeclarations": { "Custom-TechWatchAlert_CL": { "columns": [ { "name": "TimeGenerated", "type": "datetime" }, { "name": "EventId", "type": "string" }, { "name": "EventType", "type": "string" }, { "name": "Category", "type": "string" }, { "name": "Severity", "type": "string" }, { "name": "SeverityScore", "type": "int" }, { "name": "Message", "type": "string" }, { "name": "OrganizationId", "type": "string" }, { "name": "ProjectId", "type": "string" }, { "name": "ProjectName", "type": "string" }, { "name": "CveId", "type": "string" }, { "name": "CvssScore", "type": "real" }, { "name": "Epss", "type": "real" }, { "name": "Kev", "type": "boolean" }, { "name": "Exploited", "type": "boolean" }, { "name": "DecisionTier", "type": "string" }, { "name": "HostId", "type": "string" }, { "name": "HostName", "type": "string" }, { "name": "FindingRule", "type": "string" }, { "name": "Url", "type": "string" }, { "name": "SchemaVersion", "type": "string" }, { "name": "Details", "type": "dynamic" } ] } }, "dataFlows": [ { "streams": ["Custom-TechWatchAlert_CL"], "destinations": ["<nom de la destination Log Analytics>"], "transformKql": "source", "outputStream": "Custom-TechWatchAlert_CL" } ] }}- Adresse : celle d’Elasticsearch, par exemple
https://mon-deploiement.es.europe-west1.gcp.elastic-cloud.comouhttps://es.exemple.fr:9200. - Data stream :
logs-techwatchalert-defaultpar défaut. Le modèle d’indexlogs-*-*fourni par Elastic le crée au premier envoi. - Clé d’API : la valeur encodée que donne Kibana (ou
id:clé). Droits minimaux :
{ "role_descriptors": { "techwatchalert": { "indices": [ { "names": ["logs-techwatchalert-*"], "privileges": ["create_doc", "auto_configure"] } ] } }}Les documents partent par l’API _bulk, action create (la seule admise par un data stream), avec l’identifiant de l’événement comme _id : un événement renvoyé n’est pas indexé deux fois.
Les événements
Section intitulée « Les événements »Type (event_type) |
Quand | Sévérité |
|---|---|---|
vulnerability.detected |
une CVE touche un composant ou une machine surveillés (l’alerte est créée) | celle de la CVE |
vulnerability.priority_changed |
le palier de décision d’un cas change, par exemple de J+60 à J+3 | selon le nouveau palier |
vulnerability.status_changed |
le statut d’un dossier change (en remédiation, corrigé, risque accepté…) | information |
vulnerability.exploited |
ajout au catalogue KEV (CISA, VulnCheck), exploitation signalée par le CERT-FR, PoC public ou rançongiciel, sur une CVE qui touche un actif | critique (élevée pour un PoC) |
vulnerability.reopened |
un dossier clos se rouvre (machine de nouveau vulnérable, exception échue, correction non confirmée) | au moins moyenne |
vulnerability.fix_verified |
l’inventaire confirme qu’aucune machine n’est plus exposée | information |
host.vulnerable |
une machine devient exposée à une CVE, ou l’est de nouveau | celle de la CVE |
host.remediated |
l’inventaire voit une machine qui n’est plus exposée | information |
compliance.finding |
une règle de durcissement devient non conforme sur une machine | celle de la règle |
attack_surface.finding |
un constat s’ouvre sur un domaine suivi (service vulnérable, port sensible, certificat…) | celle du constat |
audit.action |
une action du journal d’audit de l’organisation (en option, non cochée par défaut) | information |
Sans choix de types, une destination reçoit tout sauf le journal d’audit. Un filtre de projets laisse passer les événements d’organisation (journal d’audit), qui n’ont pas de projet.
Le schéma
Section intitulée « Le schéma »Chaque événement suit un schéma stable, versionné (schema_version). Les horodatages sont en UTC (RFC 3339, millisecondes). event_id est stable : le même fait renvoyé garde le même identifiant, votre SIEM peut dédoublonner. L’événement est figé au moment du fait. Les blocs sans objet sont absents.
{ "schema_version": "1.0", "event_id": "5e04c44f-419c-5e6a-b773-12f474678160", "event_type": "vulnerability.detected", "category": "vulnerability", "timestamp": "2026-10-25T09:30:15.123Z", "severity": "critical", "severity_score": 10, "message": "CVE-2026-1234567 affects a monitored asset", "organization": { "id": "11111111-2222-3333-4444-555555555555" }, "project": { "id": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee", "name": "Portail" }, "vulnerability": { "id": "CVE-2026-1234567", "severity": "critical", "cvss_score": 9.8, "cvss_version": "3.1", "cvss_vector": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H", "epss": 0.43, "kev": true, "exploited": true, "exploitation_sources": ["cisa_kev", "certfr"], "poc": true, "ransomware": false, "reference": "https://www.cve.org/CVERecord?id=CVE-2026-1234567" }, "asset": { "name": "nginx 1.25.3" }, "url": "https://app.techwatchalert.com/fr/alerts/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/CVE-2026-1234567"}| Champ | Contenu |
|---|---|
schema_version, event_id, event_type, category, timestamp |
version du schéma, identifiant stable (UUID), type, famille (vulnerability, host, compliance, attack_surface, audit), horodatage UTC |
severity, severity_score |
info, low, medium, high, critical ; score 1, 3, 5, 8 ou 10 |
message |
phrase courte en anglais |
organization.id, project.id, project.name |
où le fait a lieu |
vulnerability.* |
CVE, sévérité, score et vecteur CVSS, EPSS, KEV, exploitation et ses sources (cisa_kev, vulncheck_kev, certfr), PoC, rançongiciel, decision_tier (j3, j14, j60, differe) |
host.id, host.name |
la machine concernée |
asset.name, asset.software |
le composant ou les logiciels exposés |
change.field, change.from, change.to, change.reason |
ce qui a changé (palier, statut du dossier) |
exploitation.kind, exploitation.sources |
known_exploited, poc_published ou ransomware |
finding.* |
règle ou type de constat, titre, section, référentiel, cible, port, service, produit, version, CVE liées |
detection.historical, detection.reappeared |
alerte d’un composant ajouté pour des CVE déjà publiées ; machine de nouveau exposée |
actor.id, actor.email, actor.type, source.ip, audit.action, audit.target |
auteur et action (journal d’audit, décisions de dossier) |
url |
lien vers la page de l’application |
Ne partent jamais : les commentaires, notes, justifications et pièces jointes des dossiers, ni les détails de réglage des actions d’audit.
Correspondance CEF
Section intitulée « Correspondance CEF »En-tête : CEF:0|TechWatchAlert|TechWatchAlert|1.0|<event_type>|<nom lisible>|<severity_score>|. L’en-tête échappe \ et | ; l’extension échappe \, = et les retours à la ligne, comme le demande la norme.
| Clé CEF | Champ |
|---|---|
rt |
timestamp (millisecondes depuis l’époque) |
externalId |
event_id |
cat, act, msg |
category, event_type, message |
dhost |
host.name |
suser, suid, src |
actor.email, actor.id, source.ip |
cs1 |
l’objet : CVE (cveId), règle (ruleId), type de constat (findingType) ou action d’audit (auditAction), nommé par cs1Label |
cs2 / cs4 / cs5 |
project.name / project.id / organization.id |
cs3 |
decisionTier, ou newStatus d’un dossier |
cs6 |
url |
cfp1 / cfp2 |
score CVSS / EPSS |
cn1 / cn2 |
KEV (0 ou 1) / exploitation avérée (0 ou 1) |
Correspondance ECS (Elastic)
Section intitulée « Correspondance ECS (Elastic) »| Champ ECS | Champ |
|---|---|
@timestamp, message |
timestamp, message |
event.id, event.action, event.severity, event.kind, event.category, event.type |
event_id, event_type, severity_score ; alert ou event ; vulnerability, host, configuration, network |
event.dataset, event.module, event.provider, event.reference |
techwatchalert ; url |
vulnerability.id, .severity, .score.base, .score.version, .reference, .enumeration, .classification, .scanner.vendor |
le bloc vulnerability |
host.id, host.name ; user.id, user.email ; source.ip |
machine ; auteur |
rule.id, rule.name, rule.category |
constat de conformité ou de surface externe |
organization.id, labels.project_id, labels.project_name |
organisation, projet |
observer.vendor, observer.product |
TechWatchAlert |
techwatchalert.* |
ce qui n’a pas d’équivalent ECS : EPSS, KEV, palier, changement, exploitation, constat, détection |
Colonnes de la table Sentinel
Section intitulée « Colonnes de la table Sentinel »TimeGenerated, EventId, EventType, Category, Severity, SeverityScore, Message, OrganizationId, ProjectId, ProjectName, CveId, CvssScore, Epss, Kev, Exploited, DecisionTier, HostId, HostName, FindingRule, Url, SchemaVersion, et Details (dynamic) qui porte l’événement complet.
Exemples de requêtes
Section intitulée « Exemples de requêtes »// CVE exploitées qui touchent un actif, sur 7 joursTechWatchAlert_CL| where TimeGenerated > ago(7d)| where EventType == "vulnerability.exploited"| summarize Projets = make_set(ProjectName), Derniere = max(TimeGenerated) by CveId, CvssScore, Kev| order by Derniere desc// Machines de nouveau exposées (réapparition après correction)TechWatchAlert_CL| where EventType == "host.vulnerable" and tobool(Details.detection.reappeared)| project TimeGenerated, HostName, CveId, ProjectName, Url// Paliers montés à J+3 : à traiter sous trois joursTechWatchAlert_CL| where EventType == "vulnerability.priority_changed" and DecisionTier == "j3"| project TimeGenerated, CveId, ProjectName, De = tostring(Details.change.from), Urlindex=securite sourcetype="techwatchalert:event" event_type="vulnerability.exploited"| stats latest(_time) AS derniere values(project.name) AS projets BY vulnerability.id vulnerability.cvss_score| sort - derniereindex=securite sourcetype="techwatchalert:event" event_type="host.*"| timechart span=1d count BY event_typeindex=securite sourcetype="techwatchalert:event" event_type="compliance.finding" severity IN ("high","critical")| table _time host.name finding.rule finding.title project.nameFROM logs-techwatchalert-*| WHERE event.action == "vulnerability.exploited"| STATS derniere = MAX(@timestamp) BY vulnerability.id, labels.project_name| SORT derniere DESCFiabilité
Section intitulée « Fiabilité »- Rien ne se perd au premier incident : les événements sont mis en file avec la décision qui les produit, puis envoyés par lots. Une panne du SIEM (réseau,
5xx,429) est reprise plus tard, avec un délai croissant, en respectant le délai demandé par le SIEM. Même un refus de réglage (jeton révoqué, index inconnu) est repris : corrigez la configuration, les événements en attente partiront. - Plafond : après plusieurs heures d’échecs, un événement est abandonné et compté Abandonnés sur la fiche. La file d’une destination est aussi bornée.
- État visible : la fiche montre le dernier envoi, les événements envoyés, en attente et abandonnés, les échecs à la suite et la cause de la dernière panne, sans détail technique.
- Syslog n’accuse pas réception : un lot est réputé envoyé quand le collecteur a accepté toutes ses trames sur la connexion TLS.
- Hors offre, rien ne part : les événements en attente sont écartés et la page le dit. Les destinations restent listées et peuvent être supprimées ; elles reprennent telles quelles si l’offre revient.
Sécurité
Section intitulée « Sécurité »- Le jeton, le secret ou la clé est chiffré au repos, jamais réaffiché, jamais écrit dans un journal. Changer l’adresse ou l’application oblige à le saisir de nouveau.
- Connexion chiffrée, certificat vérifié, sans redirection. L’adresse est contrôlée à chaque envoi.
- L’adresse doit être publique : les adresses du réseau interne sont refusées. Pour un SIEM interne, exposez un collecteur sur une adresse publique filtrée (par exemple un syslog TLS ouvert aux seules adresses de TechWatchAlert) ; le relais par l’agent n’est pas encore disponible pour le SIEM.
- Chaque création, modification et suppression d’une destination entre au journal d’audit de l’organisation.