GSH v1.3.0 — Real Splunk and Elastic SIEM Output
What's in this release
- Real Splunk HTTP Event Collector adapter (
adapters/splunk_hec.py) — sends findings to a configured Splunk HEC endpoint over actual HTTP, with the correct{"event", "sourcetype", "source"}payload shape andAuthorization: Splunk <token>header. - Real Elasticsearch/OpenSearch bulk adapter (
adapters/elastic_bulk.py) — sends findings via the_bulkAPI using correctly-formed NDJSON, with configurable batching (elastic_flush_size/elastic_flush_interval_seconds, defaulting to immediate send). - One shared dispatcher (
adapters/siem_dispatch.py) wires both adapters intogsh-sentinel-deploy.py(Hunt-001–004) andgsh-mcp-proxy.py(Hunt-005), so both delivery paths share one implementation. - A finding is never silently dropped: a failed or unconfigured Splunk/Elastic send now always falls back to local file output. This closes a real gap found while building this — the MCP proxy CLI previously never read
siem_outputfrom policy at all, so it silently ignored any SIEM configuration. - Secrets support
${ENV_VAR}in policy YAML so HEC tokens / API keys never need to be committed; neither adapter ever logs a secret value, even on failure. - New config keys documented in
configs/sentinel-policy-default.yaml, with a comment clarifying that the pre-existing nestedalerting.siem_outputblock is still descriptive-only and not read by any script. - Closes repo issues #5 and #7.
Verified, not just written
Both adapters are covered by 17 tests (tests/test_siem_adapters.py) against mocked requests.post — payload/header shape, network-failure handling, non-2xx responses, secret redaction. Beyond that, all three delivery paths were run end-to-end against a real local HTTP server before release, not just mocked: gsh-sentinel-deploy.py → Splunk, gsh-sentinel-deploy.py → Elastic, and gsh-mcp-proxy.py → Splunk.
Known limitations
- Syslog and generic webhook destinations (present in the descriptive
alerting.siem_outputYAML block) are still not implemented — onlystdout,file,splunk, andelasticare real. - No Windows Event Log or QRadar output yet.
- Elastic batching is disabled by default (
elastic_flush_size: 1); raising it trades a small window of at-risk findings (lost if the process crashes before a flush) for fewer HTTP requests in high-volume deployments.