概要 — 何をする画面か
検知ルールセット(/security/rulesets)は、InfraGuard が観測・判定するすべての検知ルールを 11 カテゴリー 44 ルールセットに正規化した正本ライブラリです。この画面は 1 か所で 3 つのことを行います。
- 概観 — カテゴリーセクションの中にルールセットカードを配置し、選択した時間ウィンドウ(1h/6h/24h)について、各ルールセットが一致した実際のイベント件数と最終観測時刻を表示します。
- 解説 — 各ルールセットを 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 |
使いどころ
- トリアージ前に文脈を得る — 脅威 や 検知 · JA3 で見慣れないシグネチャーに遭遇したとき、それがどのルールセットファミリーに属し、何を含意するのかを確認します。
- 観測状況を俯瞰する — 直近 24h でどのカテゴリーが発火しているか、Web 攻撃が偵察レベルなのか RCE 探索まで進んでいるのかを一目で把握します。
- オンボーディングと報告 — 「何を検知しているのか」をカテゴリー別・エンジン別に説明する教育/報告用の資料になります。
- イベントのリプレイ — 特定のルールセット(例:
web_secret_scan)が直近で一致した実際のリクエスト元 IP・URL・ステータスコードを確認し、疑わしい相手を IP 評判 や ブロックリスト に引き継ぎます。
画面構成
上部 KPI
| KPI | ラベル | 意味 |
|---|---|---|
total |
ルールセット | カタログ内のルールセット総数(常に 44) |
active |
観測されたルールセット | ウィンドウ内で1 件以上のイベントが発火したルールセット(firing) |
events |
ウィンドウ内イベント | 全ルールセットのイベント件数の合計 |
cats |
カテゴリー | カテゴリー数(11) |
内部ではエンジン別の合計(kitsune と suricata のイベント総数)も算出し、セキュリティ防御ファネルの「ルールセット」段階と数値の整合を保ちます。
操作
- ウィンドウ切り替え —
1h(60 分)·6h(360 分)·24h(1440 分)。既定は24h。 - 自動更新(LIVE) —
/security/rulesets/liveをポーリングして件数を更新します(一時停止可)。 - 全画面 — 上部ナビを隠して没入型のダッシュボードモードにします(ESC で解除)。
カテゴリーセクションとルールセットカード
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> が呼ばれ、次を含むモーダルが開きます。
- 3 段階の解説 — 何を検知するか・なぜ発火するか・最悪の場合。
- 集計値 — イベント件数・ユニークな送信元(distinct な src IP)。
- 一致シグネチャーのチップ(Suricata のみ) — このルールセットの sig 部分一致で捕捉された実際のシグネチャー文字列を、件数と最小 sev 付きで表示します(上位 12 件)。
- エンジン別のイベントテーブル(直近 60 行)。
- 送信元 IP → 評判 — src IP ごとに AbuseIPDB のポップアップボタンが付きます。登録済みの内部ネットワーク IP には
internalバッジが付き、評判ボタンは非表示になります(自社のサーバーを攻撃者と取り違えるのを防ぎます)。
エンジン別イベントテーブルの列:
| エンジン | 列 |
|---|---|
| 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) |
性能とキャッシュ
- カード概観(
build)は 30 秒間キャッシュされます(infr:sec:rulebook:<range>)。Suricata はシグネチャーヒストグラムを1 回だけ取得し、44 ルールセット全体の部分一致を合算して N+1 を回避します。 - JA3 は
SecurityScope::excludePrefixes()の NOT LIKE で自己ネットワーク(登録済みインスタンス IP の /24)を除外し、ja3_variety >= 2の送信元 IP だけをオフェンダーとして数えます。 - モーダルのイベントはウィンドウあたり 60 行を上限とします。リポジトリのクエリはいずれも狭い時間ウィンドウ + LIMIT + パラメーターバインディングを使います。
アクセス権限
- 読み取り専用。 コントローラーのゲートは読み取りが
level≥1で、セキュリティ役割領域への進入自体がサイトマップのmin_req=2(セキュリティ運用)で保護されています — 実務上は staff(=5)、admin(=10)、またはセキュリティスコープを持つユーザーが到達します。 - 書き込み経路が存在しないため、ステップアップの再確認も監査ログもありません。
/rulesets、/rulesets/live、/rulesets/eventsはいずれも純粋な読み取りです。 eventsエンドポイントのkeyはカタログのホワイトリストからのみ許可されます。リスト外のキーは404 unknown_rulesetを返します(任意のテーブル参照はできません)。
レベル規約: 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 で管理します。
関連項目
- 検知 · JA3 シーケンス分析 — 親画面(検知)。決定的ヒューリスティックが JA3 シーケンスから新しいルールセットを導出します。
- 脅威 — IDS 脅威エンティティのトリアージとシグネチャー解説。
- セキュリティ概要 — 防御ファネルの「ルールセット」段階と整合します。
- IP 評判 — モーダルの送信元 IP を AbuseIPDB で照会します。
- ブロックリスト — 疑わしい送信元をブロックに引き継ぎます。
- ルール・しきい値(管理 ▸ ルール) — 検知コレクターの定数(しきい値・ウィンドウ)を実際に調整します。
