InfraGuard

脅威 — IDS 脅威トリアージ

Suricata IDS の警報を送信元 IP のエンティティとしてトリアージします。自動ブロック連携バッジと、各検知が実際に何を示唆しているかを解説するシグネチャ解説が付きます。

概要 — 何をする画面か

セキュリティ ▸ 脅威(/security/threats)は、Suricata IDS の警報テーブル suricata_alert_ct を、トリアージ向けの 送信元 IP(src_ip)エンティティ ビューに組み替えます。数千件の生の警報を羅列する代わりに、「誰(どの IP)が、どれだけ激しく、どのように攻撃してきたか」にまとめ、深刻度順に並べます。

1画面で次の3つを結び付けます。

  1. 脅威エンティティのトリアージ — src_ip ごとに1枚のカードで、警報件数・最高深刻度・シグネチャの種類数・最終観測時刻をまとめます。
  2. 自動対応(ブロック)連携 — 各脅威 IP の /24 を自動防御テーブル blacklist_info と突き合わせ、ブロック済み / 検知済み のバッジを付けます。検知と対応が1つの物語として読めます。
  3. シグネチャ解説(Signature Lore) — Suricata のシグネチャ文字列の多くは、コンテンツルールではなく読み解きにくいエンジンイベント(stream / decoder / app-layer イベント)です。この画面は、各シグネチャが実際に何を示唆しているか(何を検知したか・なぜ発火したか [benign→malicious]・注意すべき状況・最悪のシナリオ)を解説パネルで語ります。

すべて 読み取り専用 です。状態を変える操作は、脅威 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 バッジ が付き、評判照会ボタンは非表示になります。

深刻度分布 · カテゴリ · シグネチャ

シグネチャ解説パネル

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 をトリアージする

  1. 深刻度が最も高い(sev=1 クリティカル)エンティティと、警報件数の多いものから着手します。
  2. ブロック済み バッジは自動防御がすでに対応済みであることを意味します。block_source でどのエンジンがブロックしたかを確認してください。
  3. 未ブロック+高い深刻度+多数のシグネチャ が、調査・ブロックの最有力候補です。

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"
  }
}

4) 評判を確認する · ブロックへ昇格させる

データソース

テーブル 用途 アクセス
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)。コントローラーやサービスがこれらのテーブルを作成・変更することはありません。

キャッシュ · 更新

アクセス権限

操作 レベル
画面の閲覧 · ドリルダウン · 評判照会 2以上(staff=5、admin=10)
デモ(1)のアクセス 拒否

トラブルシューティングと 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秒ポーリングを使います。すぐに最新値が必要な場合は、キャッシュの期限切れ後に再読み込みしてください(再計算が強制されます)。

関連項目

IDS 위협 트리아지
IDS 위협 트리아지