概要 — 何をする画面か
ホワイトリスト 画面は、InfraGuard の自動ブロックパイプラインから除外する IP と範囲を管理します。ここに登録したものは、検知コレクターがブロックする直前に参照する「免除リスト」になります。これにより、信頼できる送信元(CDN、提携先 API、オフィス回線)が誤検知でブロックされることを防ぎます。
中心となる概念は有効期限です。
expires_atが NULL → 恒久免除(失効しません)。CDN やオフィス回線のように、常に信頼する送信元向けです。expires_atが日時 → 一時免除(その時刻を過ぎると自動的に失効します)。短期間の調査や、自動の無実判定向けです。
免除は 3 つの登録元から入ります。
| 登録元 | 値 | 意味 |
|---|---|---|
| 手動 | manual |
運用者が UI から直接追加します |
| 自動(無実) | auto |
srct_tx が IP の評判を照会し、明らかに無実であれば 30 日間の免除を自動登録します |
| 既定 | seed |
以前はハードコードされていた CDN/OFFICE の範囲を InfrWhitelistSeeder が移行したもの(恒久) |
infr_whitelistテーブルはアプリの DB ではなく、legacy_glory接続(blacklist_infoやsuricata_*テーブルと同じ DB)に置かれます。そのため Node コレクターのsrct_txが、ブロックの直前にこのテーブルを直接読み、無実の IP を直接書き込むことができます。
いつ使うか
- 誤検知を防ぐ: スキャン/レートのヒューリスティックに引っかかりかねない通常のトラフィック(監視ボット、提携先のクローラー、決済のコールバック)を、あらかじめ登録しておきます。
- 調査中の一時的な例外: 範囲に有効期限を設定して、数日間だけ免除します。
- CDN/オフィスを常に信頼する: Cloudflare/Google/AWS/Akamai のフロントエンド IP や、固定のオフィス IP を恒久的に免除します。
- 自動判定を確認する:
srct_txが作成したautoの項目を確認し、延長または削除します。 - ブロックリストで誤ってブロックされた IP を解除し、再びブロックされないようにします(免除を登録します)。
画面構成
上部の KPI(5 個)
WhitelistService::summary() が 30 秒キャッシュで計算します。有効 = is_active = 1 かつ(expires_at IS NULL または expires_at > now)。
| KPI | 意味 | 計算方法 |
|---|---|---|
| 有効な免除 | 現在効力のある免除の合計 | 有効なものの件数 |
| 恒久 | 有効期限のない項目 | 有効 かつ expires_at IS NULL |
| 一時 | いずれ失効する項目 | 有効 − 恒久 |
| 自動免除 | 無実と判定された自動項目 | 有効 かつ source = 'auto' |
| まもなく失効 | 7 日以内に失効するもの | 有効 かつ expires_at <= now+7d |
免除リスト
フィルター可能なテーブルです(1 ページあたり 25 行)。並び順は恒久が先(expires_at IS NULL DESC)→ 有効期限の昇順 → id の降順です。
| 列 | 説明 |
|---|---|
| 範囲 | 正規化された cidr(例: 203.0.113.0/24 や 203.0.113.10/32) |
| 名称 | label(例: 「Cloudflare」「オフィス」) |
| 登録元 | manual / auto / seed のバッジ |
| 有効期限 | 恒久 / YYYY-MM-DD HH:MM / n days left / 失効 |
| 登録日時 | created_at |
| 操作 | 削除(書き込み権限がある場合) |
フィルター: 状態(有効・失効・すべて)、登録元(手動・自動・既定・すべて)、検索(IP・CIDR・名称)。リストは 30 秒ごとに更新を取得します。
手動追加モーダル
[Add manually](手動で追加)ボタンでモーダルが開きます。入力項目は、IP または CIDR、名称(任意)、有効期限の日時(任意。空欄なら恒久)です。
使い方
1. 手動で免除を追加する
[Add manually](手動で追加)をクリックします。- IP または CIDR を入力します。単一 IP は
/32に、範囲はそのネットワークアドレスに正規化されます(下の正規化ルールを参照)。 - 必要に応じて名称と有効期限の日時を入力します。恒久免除にする場合は、有効期限を空欄のままにします。
[Add](追加)をクリックします。同じcidrがすでに存在する場合は再有効化され(is_active=1)、有効期限と名称が更新されます。
2. 正規化(normalizeCidr)のルール
WhitelistService::normalizeCidr() が入力を正規形に書き換えます(ロケール非依存で、srct_tx の照合規約と同一です)。
203.0.113.10 → 203.0.113.10/32 (単一 IP は /32 になります)
203.0.113.0/24 → 203.0.113.0/24 (変更なし)
203.0.113.55/24 → 203.0.113.0/24 (ホストビットをマスク → ネットワークアドレス)
10.0.0.5/8 → 10.0.0.0/8
999.1.1.1 → (不正 → null、422 invalid_ip)
- IPv4 のみです。プレフィックス長は 0〜32 です。
- 保存前に、コントローラーが正規表現
^\d{1,3}\.\d{1,3}\.\d{1,3}(\.\d{1,3})?(/\d{1,2})?$で事前検証し、サービスがfilter_var(... FILTER_FLAG_IPV4)+ip2longで最終確定します。
/24の範囲を追加するとき、ホストビットは残したままで構いません —203.0.113.55/24は自動的に203.0.113.0/24(そのネットワークアドレス)として保存されます。
3. 有効期限の入力
- 空欄 → 恒久(
expires_at = NULL)。 YYYY-MM-DDまたはYYYY-MM-DD HH:MM→Carbon::parseで解釈されます。- 解釈に失敗した場合も恒久になります(
parseExpiry→ null)。
4. 削除
リスト行の削除操作は、確認のうえ remove を呼び出します。行は物理削除されます(論理削除ではありません)。seed の CDN 項目も削除できますが、次回のシーダー実行で再作成される場合があります。
5. srct_tx による自動の無実判定(auto 登録元) — どのように登録されるか
srct_tx コレクターは、スキャン/レート異常の IP をブロックする直前に、非常に厳格な手順で無実を検証し、判定が確実な場合にのみここに auto の項目を残します。
- ホワイトリストによる除外 —
infr_whitelist(およびコード内の CDN リスト)にすでに存在すれば、その場で免除してスキップします。 - E 単独の候補のみ評判を照会 — 誤検知が多い「短時間スキャン単独」のシグナル(ヒューリスティック E)だけを持ち、強いシグナル(A/A2/B/C/D)を一つも持たない IP のみを AbuseIPDB に照会します(キーのラウンドロビン・6 時間キャッシュ・スイープごとの上限)。
- 完全に無実という判定 —
abuse_score=0かつreports=0かつ Tor でない場合(またはホワイトリスト登録済みでスコア 0 の場合)、30 日間の免除(ip/32)をinfr_whitelist(source=auto)に自動登録し、ブロックをスキップします。
自動の無実判定は
srct_tx専用です。kts_tx(Kitsune ML)はホワイトリストを読み取ってフィルタリングするだけで、評判の照会も自動登録も行いません。
6. cidrList() — コード生成での再利用
WhitelistService::cidrList() は、重複を除いた有効で未失効の CIDR を返します(30 秒キャッシュ)。このリストは、ルール・しきい値の画面が srct_tx/kts_tx のスクリプトを生成する際に、CDN_WHITELIST_CIDRS 定数の元データとして注入されます。つまり、UI で管理した免除が実際のコレクターのコードに流れ込みます。
データソース
テーブル infr_whitelist(接続: legacy_glory、マイグレーション 000734)
| 列 | 型 | 説明 |
|---|---|---|
id |
bigint PK | |
cidr |
varchar(43) unique | 正規化された IP(/32)またはネットワーク(/n) |
label |
varchar(120) null | 何を/誰を指すか |
source |
varchar(12) | manual / auto / seed |
reason |
varchar(500) null | 自動判定の根拠(評判スコア/カテゴリー) |
country |
varchar(4) null | 国コード |
expires_at |
datetime null | NULL = 恒久 |
is_active |
tinyint(1) | 有効フラグ |
created_by |
int null | 登録者のユーザー id |
created_at / updated_at |
timestamps |
インデックス: (is_active, expires_at)、source。
infr_whitelistはlegacy_glory(GLORY)の DB 上に作成されます。legacy_gloryが mysql/mariadb として設定されていない場合、マイグレーションとシーダーは何もしないようガードされています — 画面は表示されますが KPI は 0 のままです。実運用では GLORY 接続を必ず設定してください。
シーダー InfrWhitelistSeeder(source=seed、恒久)
以前はハードコードされていた CDN/OFFICE の範囲を移行します(firstOrCreate により冪等です)。Cloudflare、Google、Meta、AWS、Akamai のフロントエンド範囲と、OFFICE の固定 IP を含みます。
php artisan db:seed --class=InfrWhitelistSeeder
モデル・サービス
- モデル:
App\Models\Infr\InfrWhitelist(protected $connection = 'legacy_glory')。 - サービス:
App\Services\Security\WhitelistService—summary()(KPI、30 秒キャッシュ)、page()(フィルター/ページング)、add()/remove()(書き込み)、cidrList()(コード生成の元データ)、normalizeCidr()(静的な SOT)。 - コントローラー:
App\Http\Controllers\Security\WhitelistController—index・live・add・remove。
アクセス権限
| 操作 | 必要な最小レベル | 備考 |
|---|---|---|
| セキュリティ領域への入室・閲覧 | セキュリティメニューの min_req 2 |
demo(1) はセキュリティメニューを見られません |
| ホワイトリストの追加・削除(書き込み) | レベル 2 以上 | WhitelistController::canWrite() = user_level >= 2 |
レベル体系は demo=1 ・ staff=5 ・ admin=10 です。したがって staff と admin はどちらも読み取りと書き込みができます。書き込みに失敗すると 403 forbidden が返ります(トーストは「許可されていません(レベル 2 以上)」)。
すべての書き込みは InfrAuditLog に記録されます。
- 追加 →
sec.whitelist_add(target=ip、meta にid・reactivated)。 - 削除 →
sec.whitelist_remove(target=ip、meta にid)。
レベルとロールのポリシー全体はアクセスレベルを、書き込みの確認方法は監査ログを参照してください。
トラブルシューティング・FAQ
KPI がすべて 0 でリストが空です
legacy_glory 接続が設定されていないか、infr_whitelist テーブルがまだ存在しません。GLORY の DB 設定を確認し、マイグレーションとシーダーを実行してください。DB エラー時、サービスは安全に空の値を返します。
「有効な IP / CIDR ではありません」(422)
入力が IPv4 でないか、プレフィックス長が 0〜32 の範囲外です。IPv6 には対応していません。例: 203.0.113.10、203.0.113.0/24。
/24 を入力したのに保存された範囲が違います
それが正しい動作です。ホストビットはネットワークアドレスにマスクされます(203.0.113.55/24 → 203.0.113.0/24)。
同じ IP を再度追加すると重複しますか
いいえ。cidr は一意なので、既存の項目が再有効化され、有効期限と名称が更新されます(レスポンスは reactivated: true)。既存の項目が seed だった場合、登録元は seed のままです。
auto の項目はなぜ現れるのですか/削除できますか
srct_tx が明らかに無実と判断した IP を、30 日間の免除として自動登録したものです。削除できますが、その IP が再び誤って検知された場合は再登録されることがあります。
失効した項目は自動的に消えますか
行は残りますが、有効期限を過ぎると「有効」の集計から外れます。状態フィルターを失効/すべてに切り替えると表示されます。完全になくすには削除してください。
IP を免除したのにまだブロックされます
次を確認してください。(1) 正規化された範囲が実際にそのトラフィックの IP を含んでいるか(例: /32 と /24 の違い)、(2) cidrList() のキャッシュ(30 秒)と、コレクターのスクリプトが再生成されたかどうか、(3) blacklist_info にすでにブロックのレコードがないか。既存のブロックはブロックリストから解除する必要があります。
関連項目
- ブロックリスト・評判 — ブロックリストの管理(免除の反対)
- 自動ブロック — スケジューラによる自動ブロック(ホワイトリスト/無実判定による拒否)
- 脅威 — IDS 脅威のトリアージ、IP のドリルダウン
- ルール・しきい値 — srct_tx/kts_tx の定数 + cidrList の注入
- IP 評判 — アプリ内の AbuseIPDB 照会
- 監査ログ — 書き込み操作の監査
