Real scan of a disposable Elastic lab with deliberately missing, stale, late, and unused telemetry. Open the image for the short replay, or reproduce it with make record-scan-lab.
Why deadair
A rule can be enabled, scheduled, and error-free after the data it needs has disappeared. deadair
reads the live rule inventory, resolves each rule's inputs using the backend's native semantics, and
checks the concrete sources behind them.
It catches:
rules whose index, alias, or data-stream selectors resolve to nothing;
mixed-selector rules where one declared input has disappeared while another still resolves;
rules whose matching sources are all stale or empty;
on Elastic, rules running with missing declared fields;
on Elastic and eligible Sentinel Scheduled rules, an ingest-lag blind window;
on Sentinel, rules whose known sources use an incompatible Basic or Auxiliary table plan;
on Elastic and OpenSearch, healthy telemetry that no enabled detection reads.
deadair supports Elastic Security, OpenSearch Security Analytics, and Microsoft Sentinel.
Quick start
Download a binary for macOS, Linux, or Windows from
GitHub Releases, or install with Go:
go install github.com/alephnull-sh/deadair/cmd/deadair@latest
deadair check # verify the credential can scan
deadair scan # assess live rules and telemetry
Exit codes are stable: 0 passes the configured gate, 1 means gated findings, and 2 means the scan failed.
How it works
Stage
What deadair does
Inventory
reads enabled detections and the inputs they declare
Resolve
uses native index resolution on Elastic and OpenSearch; on Sentinel, combines KQL analysis with table, watchlist, saved-function, ASIM, and mapped cross-workspace evidence
Measure
checks source freshness and timing, plus schema and storage where the backend supports them
Report
emits terminal, JSON, HTML, fleet rollups, and Prometheus metrics with the evidence behind each verdict
Sentinel follows the same rule-to-source model. Its adapter also understands literal watchlists,
saved functions, ASIM parsers, mapped workspaces, and summary-table lineage. When Azure provides
enough evidence, deadair can show that one filtered slice of a shared table has gone quiet or that a
summary pipeline has fallen behind. Those two checks are advisory; they do not change the gate.
The usage guide describes the evidence rules, and the
validation record records the live test coverage.
Live scan of a disposable Sentinel lab seeded with missing, stale, late, and incompatible telemetry. Open the image for the short replay. See the separate Azure conformance record for the read-only and write-denial tests.
deadair checks whether a detection's telemetry is present and healthy. It does not validate rule
logic or prove that a simulated attack will fire an alert. Use static rule validation and end-to-end
detection tests for those jobs.
Findings
Finding
Meaning
First check
no matching source
none of the rule's inputs resolve to a visible index, data stream, or Sentinel table
pattern changes, missing integrations, and credential scope
all sources stale or empty
every resolved source is unusable right now
source cadence and the ingest path
missing fields
an Elastic rule-declared field is absent or non-searchable in one or more resolved sources after every source mapping was read
parser, package, and mapping changes
lag blind window
paired-event p95 ingest lag exceeds the rule's lookback margin
rule interval, lookback, timestamp override, and pipeline delay
partial input coverage
the complete expression resolves, but one positive selector within it resolves empty
migrations, fallback selectors, and expected alternatives; informational unless policy gates it
source plan incompatible
a Sentinel rule depends on a Basic or Auxiliary table that is not eligible for the analytics-rule evidence path
table plan and rule type
source degradation
a source is stale, empty, low-volume, or schema-drifted
source history and expected maintenance
unused telemetry
on Elastic or OpenSearch, data is being stored but no enabled local detection resolves to it
disabled rules and intentional collection
Every verdict is limited to what the configured credential can see. JSON reports include the
configured expressions, resolved sources, resolution method, assessment status, backend metadata,
and capability evidence. See the usage guide for worked examples and triage.
Before deadair assesses a rule's mapped remote workspace, that workspace must have Sentinel
deployed. Same-subscription mappings can prove source availability. Cross-subscription rules need
runtime evidence tied to the exact rule identity. See the
Sentinel usage details for the evidence rules, workspace and
region limits, and Microsoft's performance guidance.
# Gate a candidate rule against live source availability.
deadair scan --rule new-rule.json
# Fail only on new regressions between reports.
deadair diff yesterday.json today.json
# Scan multiple SIEM instances from one process.
deadair scan --fleet fleet.json
# Export cached scan results as Prometheus metrics.
deadair serve --interval 5m
scan --rule isolates a backend-native candidate rule or detector from unrelated backlog. diff
works with redacted reports created with the same caller-held key. Fleet configuration references
secrets through environment variables rather than storing secret values.
The official GitHub Action wraps single-instance candidate
gates for Elastic, OpenSearch, and Sentinel. It writes a job summary, uploads a redacted JSON
report, and can apply a deadair policy without installing a rule. Sentinel workflows authenticate
the runner to Azure first; the Action defines no Azure credential inputs.
recorded opt-in conformance in disposable UK South workspaces; see validation status
The Sentinel conformance run is manual, not scheduled CI.
Security model
All adapter calls are read-only. Trusted Elastic and OpenSearch tests plus separate Sentinel lab
probes verify that the documented scan identities cannot perform representative writes.
Reports, HTML, state files, and fleet output are written 0600 on POSIX systems.
Credentials can come from environment variables or files, avoiding secrets in process arguments.
--redact replaces tenant, rule, source, pattern, field, dependency, lineage, provenance,
workspace, watchlist, template, and package identifiers with keyed HMAC pseudonyms. Validated
dependency probe expressions and their KQL arguments are never serialized. A
--redact-key-file generated from random bytes also enables redaction and keeps names stable
across separate runs.
The exporter binds to loopback by default.
deadair has no phone-home behavior or usage telemetry.
Treat reports as sensitive SOC artifacts: they identify blind detections, source names, schema gaps,
and unused collection.
Documentation
Usage guide — first scans, report evidence, findings, CI gates, state, and fleets
Bug reports, sanitized fixtures, correctness cases, docs, and backend proposals are welcome. Start
with CONTRIBUTING.md and use the backend RFC template for adapter work.
Package securefile writes sensitive local artifacts without exposing a partially written file or inheriting permissive mode bits from an existing destination.
Package securefile writes sensitive local artifacts without exposing a partially written file or inheriting permissive mode bits from an existing destination.