概要 — 何をする画面か
インフラ ▸ 警報(/infra/alert)は 警報グループ(ポリシー)コンソール です。運用者は 4つの領域(システム / Web / DB / セキュリティ) にまたがる条件を1つのポリシー(infr_alert_policy)に追加し、各しきい値の 係数(factor) を画面上で調整します。違反が発生すると、そのグループの 担当者(infr_alert_recipient)へ SMS/メールで自動通知 されます。
旧「キャパシティ・警報」ページ(/infra/capacity)を置き換えたもので、現在は当画面へリダイレクトされます。
主な特徴:
- 1つのポリシーは1つの監視バンドル: 重大度、再通知の抑止(クールダウン)、領域、条件、チャネル、担当者がすべて1枚のカードにまとまります。チームやシフトで分けて複数のポリシーを作成してください(例:「インフラ夜間オンコール」「セキュリティ運用」)。
- 評価と配信は分離:
AlertEvaluatorが条件を評価し、AlertDispatcherが警報を起票して送信します。両者はコンソールの [今すぐ検査] ボタンとスケジュールコマンドinfr:eval-alertsの双方で共有されます。 - 重複排除・クールダウン・バッチ送信・自動クローズ: 違反が繰り返されても1件の警報に集約され、クールダウン中は再送が抑止され、1つのポリシーの通知は1通のメッセージにまとめられ(SMS の大量送信を防止)、違反が解消すると警報は自動的にクローズされます。
- 読み取り専用のライブデータ: システムは
server_status、DB はinfr_db_metric、セキュリティはlegacy_gloryの検知テーブル、Web はライブ HTTP プローブから取得します。Web の証明書期限チェックはinfr_web_certを全体スキャンします。
この画面が管理するのは ポリシー・警報・配信履歴 のみです。サーバー個別のグラフは サーバー、Web の稼働状況は サービス ▸ Web、DB の負荷は サービス ▸ データベース を参照してください。しきい値の既定値は 運用ポリシー で定義します。
こんなときに使う
- サーバーの ロードアベレージやディスク空き容量 が危険水準を超えたときに、すぐ知りたい。
- ランディング URL が 停止した(想定外のステータス/無応答) とき、または 応答が遅い ときにオンコール担当へ通知したい。
- 登録済み Web サービスの TLS 自動更新の失敗(証明書の期限切れが迫っている状態)を継続的に監視したい。
- 登録済み DB の 待機キューの滞留や1時間あたりのスロークエリ数の急増 を警報にしたい。
- 違反シグナルをチームへ周知したい: IDS 警報の多発、AI 異常ブロックの急増、新規ブロック IP の急増。
画面構成
ポリシーカードのグリッド
各ポリシーは1枚のカードとして描画され、有効トグル、重大度バッジ、有効な領域、担当者数を要約します。操作は次のとおりです:
| 操作 | 説明 | アクセス権限 |
|---|---|---|
| 有効/一時停止トグル | is_active — スケジューラが評価するかどうか |
レベル2以上 |
| 編集 | 領域・条件・チャネル・担当者のモーダル | レベル2以上 |
| 今すぐ検査 | このポリシーを即座に評価して配信(run) |
レベル2以上 |
| テスト | 担当者へテストメール/SMS を今すぐ送信(test) |
レベル2以上 |
| 削除 | ポリシーと担当者を削除 | レベル2以上 |
| ドラッグで並べ替え | 表示/評価の順序(seq, reorder) |
レベル2以上 |
編集モーダル(領域・条件・チャネル・担当者)
- 基本: 名称、重大度(info/warn/crit)、再通知の抑止(分)、有効、メモ。
- 警報領域: システム / Web / DB / セキュリティ の有効化(システムは既定で有効)。
- 条件: 有効な領域ごとに オン/オフ + しきい値の係数(下記の条件カタログを参照)。
- チャネル: SMS とメール。実際に配信するには メールアダプター/SMSアダプター でプロバイダーの設定が必要です。プロバイダーが未設定の場合はカードに警告が表示されます。
- 担当者(リピーター): 氏名、メールアドレス、電話番号 +
via_mail/via_smsのチェック。実効チャネルは ポリシーのチャネル ∩ 担当者の via_* の積集合です。
最近の警報フィード
infr_alert を last_seen の降順で最大60行表示します(30秒ポーリング)。各行には観測値、しきい値、集約された count、送信の 成功/総数(infr_alert_delivery 由来)が表示され、[確認] と [クローズ] で状態を遷移できます。
使い方
1) ポリシーを作成する
- [警報グループを新規作成] → 名称、重大度、クールダウンを入力します。
- 監視したい 領域 を有効にします。
- 領域ごとに 条件 を有効にし、しきい値の係数を調整します。既定値は 運用ポリシー の
alertDefaults()からプリフィルされます。 - チャネル(SMS/メール)を選び、担当者 を追加します。
- 保存します。
2) 条件カタログ
システム(server_status、seq ウィンドウ)
| 条件 | トグル | 係数 | 既定値 | 発行されるメトリック |
|---|---|---|---|---|
| ロードアベレージ超過 | sys_load_on |
sys_load_max |
20 | load_avg(>20、サーバー単位) |
| ディスク空き容量不足 | sys_disk_on |
sys_disk_free_mb |
500 | disk_free(<500MB) |
- 対象は既定で 全サーバー(
targets.system.all=true)です。選択した alias に絞り込むこともできます(最大200件)。 - スナップショットはスロークエリを避けるため、最新の seq ウィンドウ(
distinct seq desc limit 3)だけを読み取ります(HealthService から継承)。オフラインやデータのないサーバーは判定されません — オンラインとみなすには直近2サイクルにloadavgが存在する必要があります。 - ディスク空き容量は
df-,df-data,df-homeのうち 最も逼迫している パーティションを使用します(DfParse::availableGb)。
Web(ライブ HTTP プローブ・infr_web_cert)
| 条件 | トグル | 係数 | 既定値 | 発行されるメトリック |
|---|---|---|---|---|
| サービス停止(ステータス ≠ 期待値) | web_code_on |
web_expect_code |
200 | http_status |
| 応答時間超過 | web_latency_on |
web_latency_ms |
5000 | latency |
| 証明書の期限切れが間近 | web_cert_on |
web_cert_hours |
48 | cert_expiry |
- 対象 URL は
targets.web.urls[](ラベル付き、1ポリシーあたり最大30件)から取得します。評価サイクルごとにHttp::connectTimeout(4)->withoutVerifying()->get()で直接リクエストします。期待値と異なるステータス、または 接続失敗/タイムアウト はサービス停止として扱われます(ステータス条件が有効な場合)。 - 証明書期限はトグル1つですが、スキャンは全体対象です: ポリシーの対象 URL とは無関係に、登録済み Web サービスのすべてのドメイン について
infr_web_certのレコードを走査し、しきい値(web_cert_hours、既定48時間)以内に期限が切れるドメインごとに違反を発生させます — 1回の評価につき最大50件。証明書は WebProbeService が6時間ローテーションで更新します。これにより、自動更新の失敗を期限切れで驚かされる前に検知できます。
「証明書の期限切れが間近」を有効にするだけで、すべてのサイトの証明書を監視できます。サイト単位ではなく、全ドメインを対象とした全体スキャンです。
データベース(infr_db_metric の最新サンプル)
| 条件 | トグル | 係数 | 既定値 | 発行されるメトリック |
|---|---|---|---|---|
| 待機キューの増加 | db_waiting_on |
db_waiting_max |
5 | db_waiting(>=5) |
| 1時間あたりのスロークエリ | db_slow_on |
db_slow_per_hour |
60 | db_slow(slow_qps×3600 >= 60) |
- 対象は
targets.database.collectors[](access=database のコレクターキー)です。対象が1つも選択されていない場合、何も評価されません。 DbCollectorService::latest($collector)を読み取りますが、判定するのはokであり、かつ 10分以内 のサンプルのみです(古いデータによる誤検知を回避)。登録と収集は DBコレクター で行います。
セキュリティ(legacy_glory の検知テーブル・複合)
評価ウィンドウは sec_window_min(既定10分)です。いずれか1つのシグナルがしきい値を超えると違反が発生します。
| 条件 | トグル | 係数 | 既定値 | ソース |
|---|---|---|---|---|
| IDS 重大度+件数 | sec_ids_on |
sec_ids_severity, sec_ids_count |
2, 20 | suricata_alert_ct(重大度≥S、ウィンドウ内の件数≥N) |
| AI 異常ブロックの急増 | sec_kitsune_on |
sec_kitsune_count |
5 | kitsune_detail_log(is_blocked=1、件数≥N) |
| 新規ブロック IP の急増 | sec_blacklist_on |
sec_blacklist_count |
10 | blacklist_info(ウィンドウ内の新しい created_at、件数≥N) |
3) 今すぐ検査/テスト
- [今すぐ検査](
run): このポリシー1件に対してevaluate()→handle()を即座に実行し、違反/送信の要約(breaches :b · sent :s)と更新されたフィードを返します。スケジューラを待たずに条件が実際に発火するかを確認するのに使います。 - [テスト](
test): 有効な担当者へ今すぐテストメール/SMS を送信し、チャネルが機能することを確認します(違反とは無関係の、プロバイダーのヘルスチェックです)。
4) 自動評価(スケジュール)
有効なポリシーは毎分、自動的に評価・配信されます。
Schedule::command('infr:eval-alerts --quiet-if-ok')
->everyMinute()
->withoutOverlapping(2)
->onOneServer()
->when($is_leader);
手動実行:
# 有効なすべてのポリシーを評価(単発実行。実行後に終了する — デーモンではない)
php artisan infr:eval-alerts
# 特定のポリシーのみ
php artisan infr:eval-alerts --policy=12
# 違反がない場合は出力を抑止(スケジューラの既定)
php artisan infr:eval-alerts --quiet-if-ok
infr:eval-alertsは 実行後に終了する単発コマンド です(ポリシーをループしてから戻ります)。決して無限ループのデーモンに変えないでください — 終了しないデーモンをスケジューラから起動すると、共有 DB の接続を使い果たします(pulse:check の接続リーク事例を参照)。スケジューラは毎分、新しいインスタンスを安全に起動します。
データソース
書き込みテーブル(新規 infr_)
| テーブル | マイグレーション | 役割 |
|---|---|---|
infr_alert_policy |
000700 | 警報グループ(ポリシー)。scopes/targets/conditions/channels の JSON + 重大度、cooldown_min、seq |
infr_alert_recipient |
000701 | ポリシーごとの担当者(インライン)。email/phone + via_mail/via_sms/is_active/seq |
infr_alert |
000702 | 警報インスタンス(発火ログ/トリアージキュー)。重複排除キー (policy_id, metric, entity_key, status='open')、notified_at によるクールダウン |
infr_alert_delivery |
000703 | 配信履歴。channel/address/ok/provider_code/message_id/error/latency_ms |
読み取りソース(レガシー+新規、読み取り専用)
- システム:
server_status(legacy接続、part=loadavg/df-*)。 - Web: ライブ HTTP GET(対象 URL)+
infr_web_cert(証明書の期限)。 - DB:
infr_db_metric(access=database のコレクターが投入)。 - セキュリティ:
legacy_glory上のsuricata_alert_ct,kitsune_detail_log,blacklist_info。
重複排除/クールダウン/自動クローズの流れ
AlertEvaluator::evaluate($policy)→ 有効な領域ごとの違反候補の配列。領域ごとの例外は隔離されます(1つの領域の失敗が他の領域を妨げません)。AlertDispatcher::handle($policy, $breaches):- 各違反は
(policy_id, metric, entity_key, status=open)で検索され、見つかれば更新してcount++、見つからなければ新規挿入します(first_seen、count=1、notified_at=null)。 - 通知対象 = 新規 または
notified_atが null またはnotified_at <= now - cooldown_min。 - 自動クローズ: 今回の違反に含まれない、このポリシーのオープンな警報 →
status='closed'。 - バッチ送信: 通知対象の警報は、担当者ごと・チャネルごとに 1通のメッセージ にまとめられます(本文は最大8行、超過分は「+N more」、SMS は140文字で打ち切り)。送信後、各対象の
notified_at=nowを設定します。 - (担当者、チャネル)ごとに
infr_alert_deliveryを1行記録します。
- 各違反は
アクセス権限
| 操作 | 最小レベル | 監査 |
|---|---|---|
| コンソール/一覧/フィードの閲覧(index/list/feed) | 1(読み取り) | — |
| ポリシーの保存/削除/並べ替え(save/delete/reorder) | 2(書き込み) | alert_policy.create / .update / .delete |
| 警報の確認/クローズ | 2 | alert.ack / alert.closed |
| 今すぐ検査(run) | 2 | 送信時に alert.fire |
| テスト送信(test) | 2 | alert.test |
| スケジュールによる自動送信 | (システム) | alert.fire |
レベルの区分: demo=1 · staff=5 · admin=10。読み取りにはレベル1以上、書き込みと配信にはレベル2以上が必要です。破壊的操作および配信操作はすべて infr_audit_log に記録されます(監査ログ を参照)。配信チャネルのプロバイダーは管理者(レベル10以上)が設定します。
トラブルシューティングと FAQ
Q. 条件を有効にしたのに警報が届きません。
- ポリシーが 有効 であること、スケジューラ(
schedule:work/本番のスーパーバイザー)が稼働していることを確認します。 - チャネルのプロバイダーがない — カードの警告を確認し、メールアダプター/SMSアダプター で既定のプロバイダーを設定します。
- 担当者の
via_mail/via_smsとポリシーのチャネルの 積集合 が空でないこと、メールアドレス/電話番号が入力されていることを確認します。 - クールダウン中 は再送が抑止されます(
cooldown_min、既定30分)。[今すぐ検査]ですぐ確認できますが、すでに通知済みの警報はクールダウン経過後にのみ再送されます。
Q. DB/システムの条件が発火しません。
- システム: 判定されるには対象サーバーが オンライン(直近2つの seq サイクルに loadavg が存在)である必要があります。オフラインやデータなしはスキップされます。
- DB:
infr_db_metricの最新サンプルが ok かつ10分以内 である必要があります。DBコレクター でコレクターが稼働しているか確認してください。
Q. 証明書の期限監視は特定のサイトだけを見るのですか?
- いいえ。
web_cert_onは 全体スキャン です — ポリシーの対象 URL とは無関係に、登録済み Web サービスのすべてのドメインについてinfr_web_certを走査します。
Q. 同じ違反が積み上がり続けますか?
- いいえ。
(policy_id, metric, entity_key)をキーとする1件のオープンな警報に集約されます(count++)。違反が解消すると、次の評価で自動的にclosedになります。
Q. Web プローブは評価を遅くしませんか?
- URL は1ポリシーあたり30件に制限され、接続タイムアウトは4秒、さらに応答時間に基づく短いタイムアウトが設定されています。システムのスナップショットはスロークエリを避けるため seq ウィンドウのみを読み取ります。
関連項目
- 運用ポリシー — しきい値の既定値を定義(
alertDefaults()) - メールアダプター · SMSアダプター — 配信チャネルのプロバイダー
- サービス ▸ Web — 証明書/稼働状況のソース(
infr_web_cert) - DBコレクター — DB 条件のソース(
infr_db_metric) - サーバー · ヘルス — システム条件のソース(
server_status) - 脅威 · ブロックリスト — セキュリティ条件のソース
