Slack, Teams & Webhooks
ガイド
Slack・Teams・Webhookへのアラート
ScanverraのアラートをSlackチャンネル、Microsoft Teamsチャンネル、または独自のHTTPSエンドポイントに送信できます。スコアの低下やリスクのある変更を、チームが普段使っている場所で知ることができます。
TeamプランとEnterpriseプランで利用できます。チームのオーナーと管理者が「チーム」の「連携」から設定します。1つのチームにつき最大10件の連携を追加できます。
仕組み
- 1チームを開き、連携からSlack、Microsoft Teams、またはWebhookを追加します。
- 2受け取るアラートを選び、テスト送信をクリックしてメッセージが届くか確認します。
- 3予約スキャンや監視で何かが見つかると、実行が終わった時点でScanverraがアラートを送信します。
手動で実行したスキャンではアラートは送信されません。監視したいサイトやリポジトリは「予約スキャン」ページで予約してください。
送信できるアラート
各連携には、選択したアラートだけが届きます。Webhookでは、イベント名がX-Scanverra-Eventヘッダーとeventフィールドに入ります。
| イベント | 送信されるタイミング |
|---|---|
scan.score_dropped | 予約スキャンのスコアが前回の実行より10ポイントを超えて下がったとき。新たに見つかった内容が一覧で届きます。 |
scan.completed | 予約スキャンが結果付きで完了したとき。 |
scan.policy_failedEnterprise | 予約スキャンがチームポリシー(最低スコア、または重大な問題なし)を満たさなかったとき。理由が一覧で届きます。 |
payment_page.scripts_changedEnterprise | 監視中の決済ページが新しいスクリプトや変更されたスクリプトを読み込んだとき、またはContent-Security-Policyが変わったとき。 |
attack_surface.changedEnterprise | 監視中のドメインに新しいホストが見つかったとき、またはホストが乗っ取りのリスクを抱えたとき。 |
test | 誰かが「テスト送信」をクリックしたとき。 |
Slackを接続する
- 1Slackでアプリを開き、Incoming Webhooksを探して、アラートを受け取るチャンネルに追加します。
- 2WebhookのURLをコピーします。https://hooks.slack.com/で始まります。
- 3Scanverraで連携を追加し、Slackを選んでURLを貼り付け、アラートを選びます。
各アラートには見出し、最大5件の新しい問題、「Open report」ボタンが表示されます。
Microsoft Teamsを接続する
- 1Teamsのチャンネルでワークフローを開き、Webhook要求を受信したらチャネルに投稿するを選びます。
- 2ワークフローの設定を終え、表示されたURLをコピーします。
- 3Scanverraで連携を追加し、Microsoft Teamsを選んでURLを貼り付け、アラートを選びます。
各アラートは、見出し、新しい問題、「Open report」ボタンを含むカードとして届きます。
Webhook
Webhookを使えば、チケットの作成、当番担当者への通知、記録の保存など、どこにでもアラートを送れます。Scanverraはアラートごとに、JSON本文付きのHTTPS POSTを1回送信します。
リクエストヘッダー
Content-Type | 常にapplication/jsonです。 |
User-Agent | 送信元がScanverraであることを示します。Scanverra-Alerts/1.0 |
X-Scanverra-Event | イベント名です。本文のeventフィールドと同じ値です。scan.score_dropped |
X-Scanverra-Timestamp | リクエストに署名した時刻(Unix秒)です。1762594212 |
X-Scanverra-Signature | sha256=の後に、タイムスタンプ、ドット、加工前の本文をつないだ文字列のHMAC-SHA256が続きます。鍵は署名シークレットです。sha256=9f2c… |
リクエスト本文
スコア低下の例:
{
"event": "scan.score_dropped",
"sentAt": "2026-11-08T09:30:12.418Z",
"summary": "Security Scan score dropped from 81 to 62 for shop.example.com",
"data": {
"target": "https://shop.example.com",
"scanType": "security",
"score": 62,
"prevScore": 81,
"reportUrl": "https://www.scanverra.com/security-scan/cm9x2k1",
"newIssues": [
"Missing Content-Security-Policy header",
"jQuery 3.4.1 has known vulnerabilities"
]
}
}フィールド
event | イベント名。 |
sentAt | アラートを送信した時刻(ISO 8601)。 |
summary | そのまま表示できる1行の説明。 |
data.target | スキャンしたURL、ドメイン、またはリポジトリの場合はowner/repo。 |
data.scanType | audit、seo、security、browser、repo、またはcrawl(複数ページのSEOクロール)。 |
data.score | 0〜100の新しいスコア。スコアのないアラート(監視とテスト)ではnull。 |
data.prevScore | 前回の実行のスコア、またはnull。 |
data.reportUrl | レポートまたは監視ページへのリンク。 |
data.newIssues | 変更内容を説明する短い行の一覧。空の場合や含まれない場合もあります。 |
署名を検証する
Webhookを追加すると、Scanverraは署名シークレット(whsec_...)を一度だけ表示します。サーバーに保存し、すべてのリクエストを信頼する前に検証してください:
- 1JSONとして解析する前に、届いたままの加工前のリクエスト本文を読み取ります。
- 2タイムスタンプヘッダー、ドット、加工前の本文をつないだ文字列のHMAC-SHA256を、シークレットを鍵として計算します。
- 3署名ヘッダーと定数時間で比較し、タイムスタンプが5分より古いリクエストは拒否します。
import crypto from "node:crypto";
import express from "express";
const SECRET = process.env.SCANVERRA_WEBHOOK_SECRET; // whsec_...
const app = express();
// express.raw keeps the exact bytes Scanverra signed.
app.post("/scanverra", express.raw({ type: "application/json" }), (req, res) => {
const timestamp = req.get("X-Scanverra-Timestamp") ?? "";
const signature = req.get("X-Scanverra-Signature") ?? "";
const expected = "sha256=" + crypto
.createHmac("sha256", SECRET)
.update(`${timestamp}.${req.body}`)
.digest("hex");
const fresh = Math.abs(Date.now() / 1000 - Number(timestamp)) <= 300;
const valid = signature.length === expected.length &&
crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expected));
if (!fresh || !valid) return res.sendStatus(401);
const alert = JSON.parse(req.body);
console.log(alert.event, alert.summary);
res.sendStatus(204); // answer fast, do slow work afterwards
});
app.listen(3000);タイムスタンプも本文と一緒に署名されるため、傍受されたリクエストを後から再送することはできません。
配信のルール
- 5秒以内に2xxのステータスで応答してください。時間のかかる処理は応答の後に行ってください。
- 各アラートは1回だけ送信され、再試行されません。最後の配信が成功したかどうかは「連携」パネルで確認できます。
- リダイレクトはたどらないため、最終的なURLを指定してください。
- 公開されているHTTPSアドレスのみ使用できます。SlackのURLはhooks.slack.com、TeamsのURLはwebhook.office.comまたはPower Automate上のものに限ります。
- TeamプランまたはEnterpriseプランが失効すると、チーム全体のアラートが止まります。
WebhookのURLと署名シークレットはパスワードと同じように扱ってください。SlackやTeamsのURLを知っている人は、そのチャンネルに投稿できます。Scanverraでは、保存済みのURLは一部を伏せて表示されます。シークレットを変更するには、連携を削除してから追加し直してください。
接続の準備はできましたか?
チームのオーナーと管理者なら、1分で連携を追加できます。最初の本番アラートの前にテストを送信しましょう。