InfraGuard

検知ルールセット

InfraGuard が観測するすべての検知ルールを 11 カテゴリー 44 ルールセットに正規化し、ライブの発火件数と、クリック時には各ルールセットが一致した直近のイベントを表示する読み取り専用のカタログです。

概要 — 何をする画面か

検知ルールセット(/security/rulesets)は、InfraGuard が観測・判定するすべての検知ルールを 11 カテゴリー 44 ルールセットに正規化した正本ライブラリです。この画面は 1 か所で 3 つのことを行います。

  1. 概観 — カテゴリーセクションの中にルールセットカードを配置し、選択した時間ウィンドウ(1h/6h/24h)について、各ルールセットが一致した実際のイベント件数と最終観測時刻を表示します。
  2. 解説 — 各ルールセットを 3 段階(何を検知するか・なぜ発火するか・最悪の場合)で説明します。
  3. リプレイ — カードをクリックすると、そのルールセットが実際に一致した直近のイベントをエンジン別のテーブルで表示するモーダルが開きます。

設計の要点は、分類構造と解説テキストの分離です。構造(カテゴリー、ルールセットキー、エンジン別の一致規約)はロケール非依存の静的 SOT App\Support\SecurityRulebook(キャッシュ安全)が持ち、解説テキスト(名称・意味・根拠・リスク)は resources/lang/{ko,en}/secrules.php が持ちます。フロントエンドは両者を key+category で結合してレンダリングします。

この画面は厳密に読み取り専用です。ルールセットの有効化・無効化・編集・削除は行いません。「いまこの組織で何が観測されているのか、それは何を意味するのか」に答えるリファレンスカタログです。検知の定数(しきい値・ウィンドウ)を実際に変更する場所は ルール・しきい値(管理 ▸ ルール) です。

44 のルールセットは実テレメトリーに結び付いている

ルールセットは抽象的な規則ではありません — それぞれが**一致規約(match)**によって実在の収集テーブルに結び付けられています。ソースはすべて legacy_glory 接続(コレクター群が満たすレガシー DB)上にあります。

エンジン 一致規約 ソーステーブル ルールセット
Suricata IDS sig: シグネチャー断片の配列に対する小文字での部分一致 suricata_alert_ct 33
Web(nginx) classifyWeb: is_suspicious なリクエストを url/ua/status で優先度付き・排他的に分類 nginx_meta_ct 8
Kitsune ML source=kitsune: オートエンコーダーによる異常 IP kitsune_detail_log 1
ヒューリスティック(srct) source=srct: スキャン/レートのヒューリスティック実行 srct_process_log 1
JA3 フィンガープリント source=ja3: 送信元 IP ごとの JA3 の多様性(ローテーション) suricata_tls_ct 1

使いどころ

画面構成

上部 KPI

KPI ラベル 意味
total ルールセット カタログ内のルールセット総数(常に 44)
active 観測されたルールセット ウィンドウ内で1 件以上のイベントが発火したルールセット(firing)
events ウィンドウ内イベント 全ルールセットのイベント件数の合計
cats カテゴリー カテゴリー数(11)

内部ではエンジン別の合計(kitsune と suricata のイベント総数)も算出し、セキュリティ防御ファネルの「ルールセット」段階と数値の整合を保ちます。

操作

カテゴリーセクションとルールセットカード

11 のカテゴリーが表示順にセクションを構成し、各セクション内でルールセットは minmax(600) のカードグリッドに配置されます。各カードにはルールセット名、MDI アイコン、深刻度バッジ(crit/warn/info)、ウィンドウ内のイベント件数、最終観測時刻、[Open] が表示されます。イベントがない場合は「静穏/ウィンドウ内で観測なし」と表示されます。

# カテゴリーキー ラベル エンジン ルールセット
1 tcp_stream TCP ストリーム健全性 Suricata 10
2 packet_decode パケットデコード Suricata 4
3 protocol_anomaly プロトコル異常 Suricata 5
4 http_anomaly HTTP 準拠性 Suricata 5
5 tls_anomaly TLS 異常 Suricata 5
6 dns_anomaly DNS 異常 Suricata 1
7 mail_anomaly メール(SMTP)異常 Suricata 3
8 web_attack Web 攻撃パターン nginx 8
9 ml_anomaly ML 異常検知 Kitsune 1
10 heuristic_scan ヒューリスティックスキャン srct 1
11 tls_fingerprint JA3 フィンガープリント JA3 1

使い方

1) ウィンドウを選ぶ → 全体像を読む

まず関心のあるウィンドウ(1h/6h/24h)を選びます。active(観測されたルールセット)と各カードのイベント件数で、いま何が発火しているのかを把握します。深刻度バッジは含意される深刻度である点に注意してください — Suricata のエンジンイベントは大半が sev3(情報)ですが、その含意は異なります(ノイズ/スキャン/エクスプロイト)。ルールセットのバッジは生の sev ではなく、この含意のトーンを反映します。

2) カードをクリック → 直近イベントのモーダル

カードをクリックすると /security/rulesets/events?key=<rulesetKey>&range=<window> が呼ばれ、次を含むモーダルが開きます。

エンジン別イベントテーブルの列:

エンジン 列
Suricata 時刻 · src · dst · ポート · proto · シグネチャー · sev
nginx 時刻 · src · ホスト · メソッド · URL(rawurldecode、180 文字)· ステータス
Kitsune 時刻 · IP · 異常スコア · セッション数 · ブロック
srct 時刻 · スキャン数 · ブロック数 · 備考
JA3 時刻 · IP · JA3 多様性 · TLS 接続数 · SNI 多様性

3) Web 攻撃分類の優先度(排他)

8 つの Web(nginx)ルールセットは相互に排他的です。1 件の is_suspicious=1 リクエストはカタログの定義順に走査され、最初に一致した 1 つだけのルールセットに帰属します。どれにも一致しない場合はキャッチオール(web_suspicious_other)に落ちます。したがって同じリクエストが 2 つの Web ルールセットで二重に計上されることはありません。

優先度 ルールセットキー 一致の手がかり(url/ua) 深刻度
1 web_secret_scan .env .git wp-config id_rsa .aws credentials backup.sql .bak warn
2 web_path_traversal ../ ..%2f %2e%2e etc/passwd boot.ini proc/self crit
3 web_sqli union select information_schema sleep( or 1=1 %27or crit
4 web_xss <script onerror= javascript: document.cookie warn
5 web_rce_probe /bin/sh exec( system( jndi: ${ phpunit crit
6 web_admin_brute wp-login xmlrpc.php phpmyadmin /admin/login warn
7 web_bad_bot UA: sqlmap nikto masscan nuclei python-requests curl/ warn
8 web_suspicious_other (キャッチオール — 上記のいずれにも一致しない疑わしいリクエスト) info

性能上の理由から、Web の分類は直近の 6,000 行のサンプル(リポジトリ上限 8,000)に対して集計されます。大規模なスキャンの最中はサンプル外のイベントが反映されないことがあります — 数値は絶対的な件数ではなく分布/傾向として読んでください。

4) Suricata の部分一致が意味すること

Suricata のルールセットは、シグネチャー文字列の小文字での部分一致で発火します。たとえば stream_invalid_ts は、シグネチャーに invalid timestamp を含むすべてのイベントを合算します。1 つのルールセットが複数の実シグネチャーを束ねることがあり(モーダルの「一致シグネチャー」チップで確認できます)、異なるルールセットの sig キーワードは重複しないように設計されています。

5) 実測例(参考)

参考となる 24h のスナップショット: 44 ルールセット中 37 が発火、stream_invalid_ts 10,243、web_secret_scan 3,304(大半は .env 系の 404)、srct_heuristic 126,252、ja3_rotation 300(多様性 307/307)。値は組織と時期によって異なります。

データソース

ソースはすべて legacy_glory 接続(読み取り専用)であり、config('database.connections.legacy_glory') 経由でのみ到達します — 認証情報のハードコードはありません。

ルールセットファミリー テーブル リポジトリのメソッド(抜粋)
Suricata(33) suricata_alert_ct signatureHistogram() · recentAlertsBySignatures() · distinctIpsBySignatures()
Web(8) nginx_meta_ct(is_suspicious=1) suspiciousRows($since, 6000)
Kitsune ML(1) kitsune_detail_log kitsuneCount() · kitsuneRecentInWindow()
ヒューリスティック(1) srct_process_log srctBlockedSum() · srctRunsInWindow()
JA3(1) suricata_tls_ct topJa3Ips($since, N, excludePrefixes)

性能とキャッシュ

アクセス権限

レベル規約: demo=1 · staff=5 · admin=10。一部の領域は infr.level:N ミドルウェアで追加のゲートが掛かります。等級体系の全体は RBAC レベル を参照してください。

トラブルシューティングと FAQ

すべてのカードが「静穏」と表示される

選択したウィンドウ(既定は 24h)に一致するイベントがないか、legacy_glory 接続に到達できないかのいずれかです。サービスはソースのエラーを穏当に握りつぶし、件数を空(0)として表示します — カードが消えることはありません。ウィンドウを広げるか、接続を確認してください。

Web ルールセットの件数が [脅威] / [検知] と食い違う

Web の分類は直近 6,000 行のサンプルに対する分布の集計であり(絶対的な件数ではありません)、さらに排他的なのでリクエストはちょうど 1 つのルールセットに帰属します。権威あるイベントのソースは各画面自身のクエリに従います。

特定のシグネチャーがどのルールセットにも捕捉されない

Suricata の一致はキーワードの部分一致です。カタログが網羅していない新規/カスタムのシグネチャーは、どのルールセットの件数にも合算されません。分類・解説するには SecurityRulebook の sig 配列にそのシグネチャーのキーワードを追加します — ランタイム設定ではなくコード変更です。

JA3 のオフェンダーが 0 なのに TLS トラフィックが多い

JA3 ルールセットは ja3_variety >= 2(フィンガープリントのローテーション)の送信元 IP だけをオフェンダーとして数えます。ローテーションがなければ、その送信元は正常として扱われ計上されません。自己ネットワークの IP も除外されます。

イベントモーダルで IP に internal バッジが付く

それは SecurityScope::internalMatchers() が判定した登録済みの内部ネットワーク IP です。Suricata の方向性が自社のサーバーを「送信元」と表記しうる場面で、それを攻撃者と取り違えるのを防ぎ、評判ボタンを隠します。内部ネットワークの定義は 運用ポリシー の internal_networks で管理します。

関連項目

탐지 룰셋 카탈로그
탐지 룰셋 카탈로그