Files
riposte-marketplace/integrations/sekoia-xdr/mappers/list_alerts.yaml
T
Guillaume BOURGEOIS ef215daa88 feat(sekoia): Sekoia XDR + SEKOIA Intelligence Center integrations
Sekoia XDR (siem): alert ingestion (list_alerts) with an exhaustive OCSF mapper
and a bundled 'Sekoia XDR Alert' default type, plus 20 commands across alerts
(list/get/search, status workflow, comments), event search jobs (create/status/
results + one-shot search_events), cases, asset management, users, kill chains
and a generic authenticated HTTP passthrough. Bearer-token auth, EU host default.

SEKOIA Intelligence Center (enrichment): observable/indicator/indicator-context
CTI queries plus ip/url/domain/file/email reputation lookups (STIX type resolved
automatically). No fetch.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-27 15:04:22 +02:00

44 lines
3.5 KiB
YAML

name: "Sekoia XDR Alerts → OCSF"
description: "Maps a Sekoia Defend (XDR) alert (/v1/sic/alerts, results_path = items) to OCSF Detection Finding fields. Alerts aggregate the matching events; use search_events for per-event detail."
field_mappings:
title: "title"
description: "details"
# urgency is a 0-100 score; bucket it onto the 1-5 incident scale. No parentheses (the engine chains
# right-associatively) and the lowest band uses '>= 0 ? 1' so the literal 1 sits in a then-branch —
# a bare trailing else is read as a field path, not an integer, and would fall back to the default.
severity: "urgency.value >= 80 ? 5 : urgency.value >= 60 ? 4 : urgency.value >= 40 ? 3 : urgency.value >= 20 ? 2 : urgency.value >= 0 ? 1 : 1"
# How the alert was generated.
source: "source"
# results_path = items; source_path is JSONata over ONE alert object.
# Paths absent from a given alert return nothing and are skipped.
ocsf:
# ── Finding ───────────────────────────────────────────────────────
- { source_path: "uuid", ocsf_field: "finding_info.uid" }
- { source_path: "title", ocsf_field: "finding_info.title" }
- { source_path: "rule.description", ocsf_field: "finding_info.desc" }
- { source_path: "created_at", ocsf_field: "finding_info.created_time" }
- { source_path: "updated_at", ocsf_field: "finding_info.modified_time" }
- { source_path: "first_seen_at", ocsf_field: "finding_info.first_seen_time" }
- { source_path: "last_seen_at", ocsf_field: "finding_info.last_seen_time" }
# ── Detection rule (analytic) ─────────────────────────────────────
- { source_path: "rule.name", ocsf_field: "finding_info.analytic.name" }
- { source_path: "rule.uuid", ocsf_field: "finding_info.analytic.uid" }
- { source_path: "rule.description", ocsf_field: "finding_info.analytic.desc" }
- { source_path: "rule.type", ocsf_field: "finding_info.analytic.type" }
# ── Incident state ────────────────────────────────────────────────
- { source_path: "status.name", ocsf_field: "status" }
- { source_path: "alert_type.value", ocsf_field: "activity_name" }
- { source_path: "similar", ocsf_field: "count" }
- { source_path: "urgency.value", ocsf_field: "risk_score" }
# ── MITRE ATT&CK (first TTP / kill-chain step) ────────────────────
- { source_path: "ttps[0].name", ocsf_field: "attacks.technique.name" }
- { source_path: "ttps[0].id", ocsf_field: "attacks.technique.uid" }
- { source_path: "kill_chain_short_id", ocsf_field: "attacks.tactic.uid" }
# ── Target host ───────────────────────────────────────────────────
- { source_path: "target", ocsf_field: "src_endpoint.hostname" }
# ── Owning entity / tenant ────────────────────────────────────────
- { source_path: "entity.name", ocsf_field: "cloud.org.name" }
- { source_path: "entity.uuid", ocsf_field: "cloud.org.uid" }
- { source_path: "short_id", ocsf_field: "metadata.uid" }
- { source_path: "community_uuid", ocsf_field: "metadata.tenant_uid" }