
deadair v0.4.0
SIEM内で効果を発揮していない検知ルールを見つけ出します。
deadair は、有効化された SIEM 検知が必要なテレメトリをまだ持っているかどうかをチェックします。
欠落または古いデータ、取り込み遅延、スキーマの不一致を報告します。
ローカルで実行 · 読み取り専用 · エージェント不要 · テレメトリのアップロードなし
技術解説を読む · Detection Engineering Weekly で紹介 · tl;dr sec #341 で紹介
使い捨ての Elastic ラボにおける欠落フィールドと遅延イベント。画像を開くと再生コントロール付きの短い録画を確認できます。または make record-scan-lab で再現できます。
deadair の理由
ルールは、必要なデータが消えた後でも、有効化され、スケジュールされ、エラーなく動作し続けることがあります。deadair は 稼働中のルールインベントリを読み取り、バックエンド固有のセマンティクスを使って各ルールの入力を解決し、 その背後にある具体的なソースをチェックします。
検出するもの:
- インデックス、エイリアス、データストリームセレクタが何も解決しないルール;
- 宣言された入力の1つが消えたのに別の入力がまだ解決する、混在セレクタのルール;
- 一致するソースがすべて古いか空であるルール;
- Elastic 上で、宣言されたフィールドが欠落したまま実行されているルール;
- Elastic および対象となる Sentinel Scheduled ルールで、取り込みラグによるブラインドウィンドウ;
- Sentinel 上で、既知のソースが互換性のない Basic または Auxiliary テーブルプランを使用しているルール;
- Elastic および OpenSearch 上で、有効な検知がどれも読み取っていない健全なテレメトリ。
deadair は Elastic Security、OpenSearch Security Analytics、Microsoft Sentinel をサポートします。
クイックスタート
macOS、Linux、Windows 用のバイナリを GitHub Releases からダウンロードするか、Go でインストールします:
go install github.com/alephnull-sh/deadair/cmd/deadair@latest
お使いの SIEM 用の読み取り専用セットアップを表示します:
deadair setup elastic # Elastic Security
deadair setup opensearch # OpenSearch Security Analytics
deadair setup sentinel # Microsoft Sentinel
1つセットアップを実行し、検証してスキャンします:
deadair check # verify the credential can scan
deadair scan # assess live rules and telemetry
終了コードは安定しています: 0 は設定されたゲートを通過、1 はゲート対象の検出事項あり、2 はスキャン失敗を意味します。
ソースとそれを消費する検知を調査するには:
deadair scan --json-out report.json --html-out report.html
deadair inspect --source CommonSecurityLog report.json
レポートのソース名を使用してください。調査ガイドでは、 個別の Sentinel フィード、メンテナンス、復旧の追跡についても説明しています。
仕組み
| ステージ | deadair が行うこと |
|---|---|
| インベントリ | 有効な検知と、それらが宣言する入力を読み取る |
| 解決 | Elastic と OpenSearch ではネイティブのインデックス解決を使用; Sentinel では、KQL 分析をテーブル、ウォッチリスト、保存関数、ASIM、マッピングされたクロスワークスペースの証拠と組み合わせる |
| 測定 | ソースの鮮度とタイミング、およびバックエンドが対応している場合はスキーマとストレージをチェックする |
| レポート | 各判定の根拠とともに、ターミナル、JSON、HTML、フリートロールアップ、Prometheus メトリクスを出力する |
Sentinel は同じルール対ソースのモデルに従い、リテラルウォッチリスト、保存関数、ASIM パーサー、マッピングされたワークスペース、サマリーテーブルの系統を追加します。また、共有テーブルの フィルタされたスライスが沈黙した場合や、サマリーパイプラインが遅延した場合も示します。
使用ガイドでは証拠ルールを説明し、 検証記録ではライブテストのカバレッジを記録しています。
2つのファイアウォールフィードが CommonSecurityLog を共有しています。一方が停止し、もう一方は報告を続けます。録画では保存された障害と復旧のスキャンを示しています。ラボの条件については検証記録を参照してください。
deadair は検知のテレメトリが存在し健全かどうかをチェックします。ルール ロジックを検証したり、シミュレートされた攻撃がアラートを発火することを証明したりはしません。それらの作業には静的ルール検証とエンドツーエンドの 検知テストを使用してください。
検出事項
| 検出事項 | 意味 | 最初の確認 |
|---|---|---|
| 一致するソースなし | ルールの入力のいずれも、可視のインデックス、データストリーム、または Sentinel テーブルに解決しない | パターン変更、欠落した統合、資格情報のスコープ |
| すべてのソースが古いか空 | 解決されたすべてのソースが現時点で使用不可 | ソースのケイデンスと取り込みパス |
| 欠落フィールド | すべてのソースマッピングを読み取った後、Elastic ルールで宣言されたフィールドが1つ以上の解決済みソースに存在しないか検索不可 | パーサー、パッケージ、マッピングの変更 |
| ラグブラインドウィンドウ | ペアイベントの p95 取り込みラグがルールのルックバックマージンを超えている | ルール間隔、ルックバック、タイムスタンプオーバーライド、パイプライン遅延 |
| 部分的な入力カバレッジ | 完全な式は解決するが、その中の1つのポジティブセレクタが空に解決する | 移行、フォールバックセレクタ、想定される代替; ポリシーがゲートしない限り情報提供 |
| ソースプラン非互換 | Sentinel ルールが、分析ルールの証拠パスに適格でない Basic または Auxiliary テーブルに依存している | テーブルプランとルールタイプ |
| ソース劣化 | ソースが古い、空、低ボリューム、またはスキーマドリフトしている | ソース履歴と想定されるメンテナンス |
| 未使用テレメトリ | Elastic または OpenSearch 上で、データが保存されているが、有効なローカル検知がどれもそれを解決しない | 無効化されたルールと意図的な収集 |
| 想定プロデューサの沈黙 | 設定された Sentinel のベンダー、製品、またはデバイスフィードがしきい値内に報告していない | そのフィードの送信元とコレクタ |
| サマリーパイプライン異常 | 関連する Sentinel サマリージョブが失敗したか、最後の成功が期限を過ぎている | ネイティブの実行記録とサマリークエリ |
プロデューサおよびサマリーパイプラインの検出事項は、そのクラスがポリシーで選択されている場合に終了ステータスに影響します。 沈黙したデバイスフィードは、共有テーブルの他のコンシューマとは別に報告されます。
すべての判定は、設定された資格情報が参照できる範囲に限定されます。JSON レポートには、 設定された式、解決されたソース、解決方法、評価ステータス、バックエンドメタデータ、 および機能の証拠が含まれます。実例とトリアージについては使用ガイドを参照してください。
SIEM への接続
Elastic:
export DEADAIR_ES_URL=https://es.example.internal:9200
export DEADAIR_KIBANA_URL=https://kibana.example.internal:5601
export DEADAIR_API_KEY=<read-only-api-key>
deadair check
deadair scan --json-out report.json --html-out report.html
OpenSearch:
export DEADAIR_BACKEND=opensearch
export DEADAIR_OPENSEARCH_URL=https://opensearch.example.internal:9200
export DEADAIR_OPENSEARCH_USERNAME=deadair
export DEADAIR_OPENSEARCH_PASSWORD=<password>
deadair check
deadair scan
Microsoft Sentinel:
az login --tenant <tenant-id>
export DEADAIR_BACKEND=sentinel
export DEADAIR_AZURE_SUBSCRIPTION_ID=<subscription-id>
export DEADAIR_AZURE_RESOURCE_GROUP=<resource-group>
export DEADAIR_SENTINEL_WORKSPACE=<workspace-resource-name>
# Optional: JSON allowlist for literal workspace() targets.
# export DEADAIR_SENTINEL_REMOTES=/restricted/path/sentinel-remotes.json
deadair check
deadair scan
deadair がルールのマッピングされたリモートワークスペースを評価する前に、そのワークスペースには Sentinel が デプロイされている必要があります。同一サブスクリプションのマッピングはソースの可用性を証明できます。クロスサブスクリプションのルールには、 正確なルール ID に紐づくランタイム証拠が必要です。証拠ルール、ワークスペースと リージョンの制限、Microsoft のパフォーマンスガイダンスについては、 Sentinel の使用詳細を参照してください。
Elastic、OpenSearch、または Microsoft Sentinel の文書化された読み取り専用ロールを使用してください。
CI、フリート、モニタリング
# 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

