なぜここに?
時間を無駄にしないようにしましょう。あなたがここにいるのは、アプリにウェブフック機能を構築しているからです。残念ながら、セキュリティの観点からうまくいかないことがたくさんあります。この記事の目的は、Webhookを構築している間によく知られている間違いを犯さないようにすることです。
ウェブフックはどのように機能するのか?
簡単におさらいすると、webhookとは、あなたのアプリで起こったことをサードパーティに通知するためのHTTP(S)リクエストです。例えば、請求書を作成するアプリケーションを提供している場合、新しい請求書が作成されたときにトリガーされるWebhook機能を設定する機会を顧客に提供することができます。つまり、請求書が作成されると、アプリケーションはHTTP(S)リクエストをユーザーが決めた場所に送信します。ユーザーはこれを利用して、リマインダーメールのスケジューリングやSlackでのメッセージ送信など、Webhookをトリガーとした独自のカスタムワークフローを設定することができます。
チェックリスト:ウェブフックの実装を保護する
1.SSRF型攻撃への対処
このタイプの攻撃では、攻撃者はWebhook機能を悪用して情報(クラウド上のインスタンス・メタデータなど)を取得しようとする。これに対抗するには、以下の対策を講じる必要がある。
✅ ユーザー入力を検証する
- Basic:簡単なURL検証を行う。
- より良い:URLが "https://"で始まることを確認し、"file://"やその他の非HTTPSスキームを許可しない。
✅ ローカルアドレスを制限する
- 典型的なローカルIPをブロック:127.0.x、192.168.x、172.x。
- "localhost "と "http://"の禁止
限界ログ曝露量
- ユーザー向けログにHTTPステータスコードのみを表示する。
- ヘッダーや本文の表示は避ける。
✅ 高度な:URL検証の強化
- POSTリクエストに対して、顧客固有のレスポンスヘッダを要求する。
- DNSの変更に対処するため、初期設定後もこの検証を継続する。

2.ユーザーがデータの信頼性を確認できるようにする
Webhookコンシューマーは、データが本当にあなたのアプリから来たものであることを知る方法を持たなければなりません。以下のいずれかの方法を使用できます。
テスト・メッセージの 検証
まず、セキュリティー・メカニズムをテストするために、ユーザーがテスト・メッセージをトリガーできるようにする。
✅ HMAC検証ハッシュ
ウェブフック機能に対する最も効果的なセキュリティ・メカニズムの一つは、データの完全性と真正性のためにHMACを実装することである。
基本的なプロセスは以下のようにまとめられる:
- SHA-256と秘密鍵を使ってペイロードのハッシュを生成する。
- HMACをペイロードと一緒に送信する。
- 受信者はハッシュを再作成し、ペイロードの真正性と完全性を検証する。
タイムスタンプ・インクルージョン
これは、より高度なセキュリティ緩和策である。リプレイ攻撃を防ぐために、ペイロードにタイムスタンプを追加する。メッセージが再利用されたり改ざんされたりしないようにする。
クライアント側 TLS 証明書
クライアント側のTLS証明書でHTTPコールを認証する。これは特に企業レベルの消費者にとって魅力的です。
3.レートの制限とデータの過剰露出の回避
ウェブフックのセキュリティーについては、送信するデータが少なすぎる方が、多すぎるよりも安全である。ウェブフックのコールバックはHTTPSを使って暗号化されるべきだが、数年後に誰がドメイン名を管理しているかは分からない。
✅ データ露出の最小化
- 個人を特定できる情報(PII)や機密性の高いデータの送信は避けてください。
- 複数のデータ(contact_id、email、nameなど)を送信する代わりに、contact_idだけを送信します。必要であれば、ユーザーにパブリックAPIから追加データを取得させましょう。
再試行 ポリシー通信
- リトライポリシーとレート制限をユーザーに明確に伝える。
- リトライのため、メッセージが順番通りに届かない可能性があることを伝える。
- 2xx応答はすべて成功であると定義する。
✅ 配送にキューシステムを使う
Webhookの配信を管理し、出力を調整するためにキューシステムを実装します。このアプローチは、大規模なCSVインポートが過剰なWebhookコールと再試行を引き起こすようなエッジケースにおいて、誤ってユーザーのサーバーを圧迫することを防ぐのに役立ちます。
4.ボーナス:異常アラート
これはセキュリティというより開発者の利便性のためだが、それでも実装しておくに越したことはない。
- 4xxおよび5xxレスポンスが発生した場合、ユーザーに警告を発する。
- ユーザーに障害を知らせる通知を送る
この追加により、Webhookシステムの透明性と応答性が向上します。
結論
これで完成だ!Webhookを機能的にするだけでなく、安全でユーザーフレンドリーにするためのいくつかのステップを紹介しました。これらのステップを実装することで、アプリを保護し、全体的なユーザーエクスペリエンスを向上させることができます。それでは、よいコーディングを!🚀🔒👨💻
Aikido Securityは、開発者中心のソフトウェアセキュリティプラットフォームです。私たちは、あなたがコードを書くことに集中できるように、あなたの製品を安全に保つお手伝いをします。 GitHub、GitLab、Bitbucket、またはAzure DevOpsのアカウントに接続するだけで、無料でリポジトリスキャンを開始できます。