概要 — 何をする画面か
セキュリティ ▸ 脅威(/security/threats)は、Suricata IDS の警報テーブル suricata_alert_ct を、トリアージ向けの 送信元 IP(src_ip)エンティティ ビューに組み替えます。数千件の生の警報を羅列する代わりに、「誰(どの IP)が、どれだけ激しく、どのように攻撃してきたか」にまとめ、深刻度順に並べます。
1画面で次の3つを結び付けます。
- 脅威エンティティのトリアージ — src_ip ごとに1枚のカードで、警報件数・最高深刻度・シグネチャの種類数・最終観測時刻をまとめます。
- 自動対応(ブロック)連携 — 各脅威 IP の /24 を自動防御テーブル
blacklist_infoと突き合わせ、ブロック済み / 検知済み のバッジを付けます。検知と対応が1つの物語として読めます。 - シグネチャ解説(Signature Lore) — Suricata のシグネチャ文字列の多くは、コンテンツルールではなく読み解きにくいエンジンイベント(stream / decoder / app-layer イベント)です。この画面は、各シグネチャが実際に何を示唆しているか(何を検知したか・なぜ発火したか [benign→malicious]・注意すべき状況・最悪のシナリオ)を解説パネルで語ります。
すべて 読み取り専用 です。状態を変える操作は、脅威 IP を ブロックリスト へ送るディープリンクだけで、実際のブロック書き込みは別の権限のもとでそちら側で行われます。
こんなときに使う
- 朝のトリアージ:直近24時間で最も多く攻撃してきた IP とその深刻度をざっと確認する。
- 特定の IP が本物の脅威かノイズかを判断する — 解説の [benign/watch/malicious] のトーンと自動ブロックバッジで素早く分類できます。
- 「このシグネチャは結局どういう意味なのか」をチームメンバーに説明する — 解説パネルは教育資料としても使えます。
- 脅威 IP を調査したあと、ブロック候補に昇格させる(→ ブロックリスト ディープリンク、→ IP 評判 ポップアップ)。
画面構成
上部 KPI(対象期間のスコープ)
| KPI | 意味 | 算出方法 |
|---|---|---|
| alerts | 対象期間内の IDS 警報の総数 | suricata_alert_ct の alert_ts >= since の件数 |
| entities | 脅威 IP エンティティの数 | 上位の src_ip(最大48件) |
| blocked | すでに自動ブロック済みの脅威 IP | エンティティの /24 が blacklist_info(is_use=1) に含まれる |
| critical | 未対応の クリティカルな脅威 IP(観測合計は critical_all) |
max_sev <= 1 かつ未ブロックのエンティティ |
脅威エンティティのカード/行
警報件数の降順で上位48件の src_ip を表示します。各エンティティが持つ項目は次のとおりです。
| 項目 | 説明 |
|---|---|
ip |
送信元 IP(src_ip) |
alerts |
対象期間内のこの IP の警報件数 |
sev |
最高深刻度(1=クリティカル … 3=情報)。Suricata では値が小さいほど深刻 → MIN(severity) が最高深刻度になります |
sigs |
シグネチャ(sid)の種類数 — 攻撃手口の多様さ |
last_ts |
最終観測時刻 |
blocked |
この IP の /24 が自動ブロックリストに載っていれば true |
block_source |
ブロック元のタグ:kitsune · suricata · manual · other(reason 文字列から解析) |
country / asn |
地理/ASN 情報の付加(ip_info_loop の最新行) |
自社ネットワークは除外されます。
SecurityScope::excludePrefixes()が、登録済み インスタンス の IP の /24(および 運用ポリシー の内部ネットワークホワイトリスト)をNOT LIKEで除外するため、自社サーバーが送信元として現れて脅威リストを埋め尽くすことはありません。方向ラベルの都合で内部 IP がそれでも表示された場合は、(internalMatchersによる)internalバッジ が付き、評判照会ボタンは非表示になります。
深刻度分布 · カテゴリ · シグネチャ
- 深刻度分布:
{1: n, 2: n, 3: n}— クリティカル/警告/情報の警報件数。 - カテゴリ:上位10カテゴリ(件数の降順)と、それぞれの最小深刻度。
- シグネチャ:上位12シグネチャ(件数の降順)。各項目は
signature·sid·cnt·sev(最小値)に加えてexplain(SignatureLore の分類結果)を持ちます。シグネチャをクリックすると、隣に解説パネルが開きます。
シグネチャ解説パネル
App\Support\SignatureLore::classify() がシグネチャ文字列を ファミリー と 詳細キー に分類し、実際の文章は resources/lang/{ko,en}/siglore.php の言語パックが持ちます。フロントエンドは family と key を結合し(詳細がファミリーを上書きします)、4部構成の解説として描画します。
| 部分 | 内容 |
|---|---|
| 何を検知したか(meaning) | そのシグネチャがプロトコル的に何を捉えたか |
| なぜ発火したか · 可能性(why) | 想定される原因をトーン順に [benign] → [watch] → [malicious] で列挙 |
| 注意すべき状況(caution) | ノイズと本物のシグナルをどう見分けるか |
| 最悪のシナリオ(worst) | 放置した場合に至りうる侵害 |
各ファミリーは 暗示する深刻度(tone) を持ちます — 情報レベルのイベントであっても、示唆する内容は異なります。
| family | ラベル | tone | アイコン |
|---|---|---|---|
stream |
TCP ストリーム再構成の異常 | warn | mdi-transit-connection-variant |
decoder |
パケットのデコード/整合性の異常 | info | mdi-package-variant-closed |
applayer |
アプリケーションプロトコルの異常 | warn | mdi-swap-horizontal-bold |
http |
HTTP パースの異常 | warn | mdi-web |
tls |
TLS の異常 | warn | mdi-lock-outline |
dns |
DNS の異常 | warn | mdi-dns-outline |
scan |
スキャン/偵察 | warn | mdi-radar |
exploit |
エクスプロイトの試行 | crit | mdi-bug-outline |
malware |
マルウェア/C2 | crit | mdi-virus-outline |
dos |
DoS/フラッディング | crit | mdi-flash-alert-outline |
policy |
ポリシー/情報 | info | mdi-file-document-outline |
generic |
その他の IDS シグネチャ | info | mdi-shield-alert-outline |
詳細キーによる上書きは14種類あります:invalid_timestamp · checksum · retransmit · handshake · evasion · stateanomaly · host_header · desync · malformed · one_direction · mismatch · starttls · tls_anomaly · unsolicited。
stream/decoder 系のシグネチャの多く(例:
SURICATA STREAM Packet with invalid timestamp、SURICATA TCPv4 invalid checksum)は sev3 の情報レベル であり、非対称ルーティングや NIC のチェックサムオフロードといったインフラ特性から 大量に 発火します — 無害なノイズです。シグネチャそのものよりも、同じ src_ip が短時間に複数のファミリーを積み重ねているか(スキャン+ハンドシェイク異常など)に注目してください。その積み重なりこそが意図のシグナルです。
使い方
1) 期間を選ぶ
既定の対象期間は 24時間 です。指定できる期間は次のとおりです。
| range | 期間(分) |
|---|---|
1h |
60 |
6h |
360 |
24h |
1440(既定) |
トグルは ?range= として渡されます。ホワイトリストにない値は 24h に格下げされます。
2) 脅威 IP をトリアージする
- 深刻度が最も高い(
sev=1クリティカル)エンティティと、警報件数の多いものから着手します。 - ブロック済み バッジは自動防御がすでに対応済みであることを意味します。
block_sourceでどのエンジンがブロックしたかを確認してください。 - 未ブロック+高い深刻度+多数のシグネチャ が、調査・ブロックの最有力候補です。
3) IP ドリルダウン(セキュリティ専用ポップオーバー)
IP をクリックすると GET /security/threats/ip-detail?ip=<IP>&range=<range> を呼び出します。IP は FILTER_VALIDATE_IP で厳密に検証され、不正な値は 422(invalid_ip)を返します。返却されるフィールドは次のとおりです。
{
"ok": true,
"detail": {
"ip": "203.0.113.10",
"cidr": "203.0.113.0/24",
"geo": { "country": "US", "city": null, "asn": "ASNNNNN", "isp": "...", "org": "..." },
"signatures": [
{ "signature": "...", "severity": 3, "cnt": 42, "explain": { "family": "stream", "key": "invalid_timestamp", "tone": "warn", "icon": "mdi-...", "svg": "stream" } }
],
"blocked": true,
"block_source": "suricata",
"block_reason": "[Suricata Auto-Block] ...",
"block_at": "2026-08-13 04:12:00",
"abuse_url": "https://www.abuseipdb.com/check/203.0.113.10"
}
}
- geo/ASN:
ip_info_loopによる情報付加。 - signatures:この IP の上位8シグネチャ(件数の降順)と、それぞれの
explain解説。 - ブロック状態:
blacklist_info(c_class、is_use=1)との /24 一致 → ソースタグ · 生の reason · ブロック時刻。
4) 評判を確認する · ブロックへ昇格させる
- IP の隣にあるシンボル(
.infr-ipsym)をクリック → IP 評判 の AbuseIPDB アプリ内ポップアップ(mixins/abuse_check.js+/security/ip-reputation)。悪用信頼度・通報件数・国・用途種別・直近の通報内容を表示します。 - 調査後にブロックすると判断したら →
?add=<IP>付きで ブロックリスト へディープリンク(挿入時に /24 へ正規化され、別権限・監査のもとで実行されます)。
データソース
| テーブル | 用途 | アクセス |
|---|---|---|
suricata_alert_ct |
IDS 警報(src_ip · severity · category · signature · sid · alert_ts) | 読み取り |
blacklist_info |
自動ブロックリスト(/24 の c_class · reason · country · is_use) |
読み取り(自動対応バッジ) |
ip_info_loop |
地理/ASN/ISP の情報付加 | 読み取り |
| 登録済み インスタンス の IP + 運用ポリシー の内部ネットワーク | 自社ネットワークの除外 · internal バッジ | SecurityScope |
すべてのソースは
legacy_glory接続上にあり(コレクター群が書き込む接頭辞なしのレガシーテーブル)、読み取り専用 です。読み取りの背骨はApp\Repositories\SecurityRepositoryです(パラメータバインディング · 狭い期間 · LIMIT)。コントローラーやサービスがこれらのテーブルを作成・変更することはありません。
キャッシュ · 更新
ThreatService::build()の結果は期間ごとに 30秒キャッシュ されます(キーinfr:sec:th:<range>)。- 画面は 30秒ポーリング(
/security/threats/live)で更新されます — Reverb ではありません。 - 最高深刻度は
MIN(severity)で求めるため、sevの値が 小さい ほど危険です(1=クリティカル、3=情報)。
アクセス権限
| 操作 | レベル |
|---|---|
| 画面の閲覧 · ドリルダウン · 評判照会 | 2以上(staff=5、admin=10) |
| デモ(1)のアクセス | 拒否 |
/security/*配下はすべてinfr.level:2ミドルウェアで保護されています。デモ(1)はセキュリティデータへのアクセスを制限されています(RBAC レベル)。- 脅威画面そのものは すべて GET(読み取り専用) のため、監査書き込みの対象ではありません。ブロックの書き込みや悪用通報といった破壊的・外部向けの操作は、それぞれ ブロックリスト と国際連携のフローで、独自の権限と監査のもとで実行されます。
トラブルシューティングと FAQ
Q. invalid timestamp / invalid checksum ばかりです。これは攻撃ですか?
たいていは違います。invalid checksum は NIC のチェックサムオフロードにより自社サーバーのトラフィックで大量に発火し、invalid timestamp は非対称ルーティングやミドルボックスによって発火します。どちらも sev3 の無害なノイズ です — 解説の [benign] の項目がまさにこれを説明しています。特定の外部 src_ip に集中し、かつ他のシグナル(スキャン · ハンドシェイク異常)も重なっている場合にのみ疑ってください。
Q. なぜ深刻度1が最も危険なのですか?
Suricata の慣習では severity 1=高、2=中、3=情報です。そのためエンティティの最大リスクは MIN(severity) で計算します。
Q. 自社サーバーの IP が脅威リストに出てきます。
SecurityScope は登録済みインスタンスの /24 と内部ホワイトリストを除外しますが、未登録の IP や方向(src/dst)ラベルの都合で現れることがあります。その IP を インスタンス に登録するか、運用ポリシー でその範囲を追加してください。それでも表示される場合は internal バッジが付きます。
Q. IP ドリルダウンが 422 を返します。
ip パラメータが有効な IP ではありません(invalid_ip)。実在する IPv4/IPv6 の値かどうか確認してください。
Q. 解説が「その他の IDS シグネチャ」しか表示しません。
SignatureLore::match() のどのキーワード規則にも一致しないシグネチャは generic ファミリーにフォールバックします。カテゴリとシグネチャ名から判断し、必要であれば siglore.php に詳細キーを追加してください。
Q. リストが30秒間変わりません。 仕様どおりです。サービスは期間ごとの30秒キャッシュに加えて30秒ポーリングを使います。すぐに最新値が必要な場合は、キャッシュの期限切れ後に再読み込みしてください(再計算が強制されます)。
関連項目
- セキュリティ概要 — 脅威→検知→対応の防御ファネル(中核画面)
- 検知と JA3 — Kitsune ML · srct ヒューリスティック · JA3 シーケンス異常
- ルールセット — 44ルールセットの検知カタログ正本
- ブロックリストと評判 — 自動ブロックの閲覧/追加/解除(
blacklist_info) - IP 評判 — AbuseIPDB のアプリ内評判ポップアップ
- ホワイトリスト — ブロック免除の IP/CIDR
