Skip to content

Commit

Permalink
feat(api): kibana SIEM (#3245)
Browse files Browse the repository at this point in the history
  • Loading branch information
shahargl authored Jan 31, 2025
1 parent 68693fb commit 505fc5b
Show file tree
Hide file tree
Showing 2 changed files with 57 additions and 2 deletions.
57 changes: 56 additions & 1 deletion keep/providers/kibana_provider/kibana_provider.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ class KibanaProvider(BaseProvider):
}
}
)
SIEM_WEBHOOK_PAYLOAD = """{{#context.alerts}}{{{.}}}{{/context.alerts}}"""

# Mock payloads for validating scopes
MOCK_ALERT_PAYLOAD = {
Expand Down Expand Up @@ -373,6 +374,7 @@ def __setup_webhook_alerts(self, tenant_id: str, keep_api_url: str, api_key: str
self.logger.info(f"Alert {alert_rule['id']} already updated, skipping")
continue

rule_type_id = alert_rule.get("rule_type_id")
action_groups = rule_types.get(alert_rule["rule_type_id"], {}).get(
"action_groups", []
)
Expand All @@ -381,7 +383,14 @@ def __setup_webhook_alerts(self, tenant_id: str, keep_api_url: str, api_key: str
{
"group": action_group.get("id"),
"id": connector_id,
"params": {"body": KibanaProvider.WEBHOOK_PAYLOAD},
"params": {
# SIEM can use a different payload for more context
"body": (
KibanaProvider.WEBHOOK_PAYLOAD
if "siem" not in rule_type_id
else KibanaProvider.SIEM_WEBHOOK_PAYLOAD
)
},
"frequency": {
"notify_when": "onActionGroupChange",
"throttle": None,
Expand Down Expand Up @@ -558,6 +567,49 @@ def _format_alert(
if "payload" in event:
return KibanaProvider.format_alert_from_watcher(event)

# SIEM alert
if "kibana" in event:
logger.info("Parsing SIEM Kibana alert")
description = (
event.get("kibana", {})
.get("alert", {})
.get("rule", {})
.get("description", "")
)
if not description:
logger.warning("Could not find description in SIEM Kibana alert")

name = (
event.get("kibana", {}).get("alert", {}).get("rule", {}).get("name", "")
)
if not name:
logger.warning("Could not find name in SIEM Kibana alert")
name = "SIEM Kibana Alert"

status = event.get("kibana", {}).get("alert", {}).get("status", "")
if not status:
logger.warning("Could not find status in SIEM Kibana alert")
name = "active"

# use map
status = KibanaProvider.STATUS_MAP.get(status, AlertStatus.FIRING)
severity = (
event.get("kibana", {})
.get("alert", {})
.get("severity", "could not find severity")
)
# use map
severity = KibanaProvider.SEVERITIES_MAP.get(severity, AlertSeverity.INFO)
alert_dto = AlertDto(
name=name,
description=description,
status=status,
severity=severity,
source=["kibana"],
**event,
)
logger.info("Finished to parse SIEM Kibana alert")
return alert_dto
# Check if this is the new webhook format
# New Kibana webhook format
if "webhook_body" in event:
Expand Down Expand Up @@ -624,6 +676,9 @@ def _format_alert(
if not event.get("url"):
event.pop("url", None)

if "name" not in event:
event["name"] = event.get("rule.name")

return AlertDto(
environment=environment,
labels=labels,
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[tool.poetry]
name = "keep"
version = "0.35.8"
version = "0.35.9"
description = "Alerting. for developers, by developers."
authors = ["Keep Alerting LTD"]
packages = [{include = "keep"}]
Expand Down

0 comments on commit 505fc5b

Please sign in to comment.