Aller au contenu

Webhooks entrants

Les webhooks entrants reçoivent des événements d’autres outils et les transforment en tickets ou en mises à jour. Il existe trois points d’entrée :

Origine Adresse Configuration dans Core
Outils de supervision, DevOps et de sécurité /api/connectors/{vendor}/{tenant} Integrations, connecteur de l’éditeur
Autres ITSM et sources REST génériques /api/integration/webhook/{integration_id} Integration Center
Passerelle SNMP sur site /api/snmp-gateway/trap/{tenant} Integrations → SNMP gateway

Toutes les adresses se trouvent sur https://exocortex-api.ai-exo-cortex.com.

Connecteurs pour les outils de supervision, DevOps et de sécurité

Section intitulée « Connecteurs pour les outils de supervision, DevOps et de sécurité »

Configurez le connecteur dans exoCortex Core, puis pointez le webhook de l’outil vers l’adresse du connecteur. L’outil envoie son format natif : exoCortex le normalise et, si nécessaire, ouvre un ticket.

Outils pris en charge :

  • Supervision : Datadog, New Relic, Prometheus, Grafana, Nagios, Icinga, Centreon, Statuspage, NinjaOne.
  • DevOps et astreinte : GitHub, GitLab, Jenkins, Bitbucket, PagerDuty, Opsgenie.
  • Sécurité : Wazuh, Microsoft Sentinel, Tenable, Qualys, Splunk, Elastic, CrowdStrike, SentinelOne, QRadar, Cyber Protect, Fortigate, Check Point et sondes EDR réseau.

Dans l’adresse, {vendor} est le nom de l’outil en minuscules (par exemple datadog) et {tenant} est le code du tenant pour lequel vous avez configuré le connecteur.

  • GitHub, GitLab, PagerDuty, Opsgenie et Statuspage signent les requêtes avec leur propre mécanisme : exoCortex le vérifie.
  • Pour tous les autres outils, vous utilisez la signature d’exoCortex, calculée avec le secret du connecteur (voir Signer les requêtes).

Si un connecteur échoue plusieurs fois de suite, exoCortex suspend temporairement les requêtes et répond 503 avec resume_in_ms, le nombre de millisecondes après lequel réessayer.

Pour ServiceNow, Jira, Zendesk, BMC ou une source REST générique, configurez l’intégration dans l’Integration Center d’exoCortex Core, avec le mappage des champs. L’autre système envoie les événements à l’adresse de l’intégration ; exoCortex les mappe et crée ou met à jour le ticket.

La signature est obligatoire lorsque l’intégration a un secret, et les intégrations en mode webhook doivent en avoir un. Utilisez la signature d’exoCortex ; à défaut, X-Bridge-Signature, X-Hub-Signature-256 ou X-Signature sont acceptés avec la valeur sha256=<hex HMAC of the body>.

La réponse est 200 lorsque l’événement a été traité immédiatement, 202 lorsqu’il a été mis en file d’attente pour un traitement fiable.

Pour signer une requête vers exoCortex, envoyez deux en-têtes :

  • X-Exo-Timestamp : l’heure actuelle en secondes Unix ;
  • X-Exo-Signature : v1= suivi du HMAC-SHA256 hexadécimal de timestamp + "." + body, calculé avec le secret du connecteur.

exoCortex rejette les requêtes dont l’horodatage s’écarte de plus de 300 secondes de son heure.

Fenêtre de terminal
ts=$(date +%s)
body='{"title":"CPU high on web-01","alert_type":"error"}'
sig=$(printf '%s.%s' "$ts" "$body" | openssl dgst -sha256 -hmac "$CONNECTOR_SECRET" -hex | sed 's/^.* //')
curl -X POST "https://exocortex-api.ai-exo-cortex.com/api/connectors/datadog/ACME" \
-H "Content-Type: application/json" \
-H "X-Exo-Timestamp: $ts" -H "X-Exo-Signature: v1=$sig" \
--data-binary "$body"

L’en-tête X-NH-Connector-Signature, avec le HMAC du seul corps, est déprécié et fonctionne jusqu’au 30 juin 2027.

Si vous avez des équipements qui envoient des traps SNMP, une passerelle dans votre réseau les convertit en JSON et les envoie à exoCortex. Le secret se définit dans Integrations → SNMP gateway.

La passerelle signe chaque requête avec :

  • X-NH-SNMP-Timestamp : l’heure actuelle en millisecondes Unix ;
  • X-NH-SNMP-Signature : sha256= suivi du HMAC-SHA256 hexadécimal de timestamp + "|" + body.

La tolérance sur l’heure est de 5 minutes. Un exemple de trap :

{
"source_ip": "192.0.2.10",
"source_sysname": "core-sw-01",
"trap_oid": "1.3.6.1.6.3.1.1.5.3",
"severity": "major",
"varbinds": {
"1.3.6.1.2.1.2.2.1.1": "12",
"1.3.6.1.2.1.2.2.1.2": "GigabitEthernet1/0/12"
}
}