アラート通知の設定

メールと Webhook(Slack・Teams・Feishu を含む)による通知の設定方法と、Webhook の実際のペイロード・署名の検証方法。


OpenBait は、脅威の検出・確認、テイクダウンの経過、カナリートークンの発火を、メールと Webhook でお知らせします。設定はコンソールの 設定 > 通知 にまとまっています。

メール通知

  1. 設定 > 通知 に移動
  2. 「受信者」に通知を受け取るメールアドレスを追加
  3. 受け取りたい通知の種類を選択

受信者を 1 件も登録していない場合、通知は組織のオーナー全員のメールアドレスに届きます。

Webhook 連携

  1. 設定 > 通知 の Webhook セクションで Webhook を追加 をクリック
  2. 名前と送信先 URL を入力
  3. フォーマットを選択:標準 JSON/Slack/Microsoft Teams/Feishu(飛書)

Slack・Teams・Feishu を選んだ場合は、各サービスの Incoming Webhook がそのまま表示できる形式で送信します。自社システムで受け取る場合は「標準 JSON」を選んでください。

登録できる Webhook の数はプランで決まります。Free は利用不可、Pro は 1 件、Business は 5 件、Enterprise は無制限です。

イベントの種類

イベント発生するタイミング
threat.detected新しい脅威を検出したとき
threat.confirmed脅威が確認されたとき(ブランドによる確認を含む)
takedown.status_changedテイクダウンの案件の状態が変わったとき
honeytoken.triggeredカナリートークンが発火したとき

標準 JSON のペイロード

すべてのイベントは event・timestamp(UTC、RFC 3339)・data の 3 つのキーを持ちます。data の中身はイベントによって異なります。

threat.detected / threat.confirmed:

json
{
  "event": "threat.detected",
  "timestamp": "2026-09-20T03:15:00Z",
  "data": {
    "threatId": "d3a9k2f05n8u7r1m4qv0",
    "domain": "example-brand-login[.]com",
    "brand": "Example Brand",
    "threatType": "phishing",
    "severity": "high",
    "score": 82,
    "confirmed": false,
    "scanType": "public-report",
    "url": "https://openbait.com/console/threats/d3a9k2f05n8u7r1m4qv0"
  }
}

severity は low・medium・high・critical のいずれかです。

takedown.status_changed:

json
{
  "event": "takedown.status_changed",
  "timestamp": "2026-09-20T06:12:00Z",
  "data": {
    "caseId": "d3a9m7f05n8u7r1m4r20",
    "domain": "example-brand-login[.]com",
    "brand": "Example Brand",
    "status": "down",
    "url": "https://openbait.com/console/takedown/d3a9m7f05n8u7r1m4r20"
  }
}

status は opened・down・resolved・re-emerged・blocked・watching・domain-removed・awaiting_confirmation のいずれかです。watching はサイトがオフラインで、ドメインが削除されるまで確認を続けている状態、domain-removed はレジストリがドメインを削除した状態、awaiting_confirmation は訪問者からの通報が、ブランド側の回答を待っている状態です。blocked は、サーバー自体は応答しているのに、そのドメイン名宛ての接続にだけ応答しない状態です。停止とも復活とも判定できないため、別の状態として通知します。

honeytoken.triggered:

json
{
  "event": "honeytoken.triggered",
  "timestamp": "2026-09-20T09:41:00Z",
  "data": {
    "honeytokenId": "d3a9p1f05n8u7r1m4s50",
    "honeytokenName": "login-page",
    "honeytokenType": "BEACON",
    "sourceIp": "203.0.113.24",
    "userAgent": "Mozilla/5.0 ...",
    "threatLevel": "high",
    "riskScore": 75,
    "refererDomain": "example-brand-login[.]com",
    "referer": "hxxps://example-brand-login[.]com/signin"
  }
}

refererDomain・referer・internalNote は、値がある場合だけ含まれます。

ペイロード内のドメインと URL は、誤ってクリックされたりチャットツールにプレビューが展開されたりしないよう、example[.]com・hxxps:// の形に無害化して送信します。自社システムで照合に使う場合は、元の形に戻してください。

署名の検証

シークレットを持つ Webhook では、各リクエストに次のヘッダーが付きます。

ヘッダー内容
X-Webhook-Timestamp送信時刻(UNIX 秒)
X-Webhook-Signaturesha256= に続けて、HMAC-SHA256 の 16 進文字列

署名の対象は タイムスタンプ + "." + リクエストボディ(受信したバイト列のまま) です。

js
import crypto from "node:crypto"
 
function verify(secret, timestamp, rawBody, signatureHeader) {
  const expected =
    "sha256=" +
    crypto.createHmac("sha256", secret).update(`${timestamp}.`).update(rawBody).digest("hex")
  return crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(signatureHeader))
}

リプレイを防ぐため、X-Webhook-Timestamp が現在時刻から大きく離れているリクエストは破棄してください。送信元の User-Agent は OpenBait-Webhook/1.0 です。