ここに来た目的は何ですか?
時間を無駄にしないようにしましょう。アプリケーションにWebhook機能を構築しているため、この記事をご覧になっていることでしょう。残念ながら、セキュリティの観点からは多くの問題が発生する可能性があります。本記事では、Webhook構築時によく知られた誤りを犯さないようにすることを目的としています。
Webhookはどのように機能しますか?
簡単にまとめると、Webhookは、アプリケーションで発生した事象を第三者に通知するためのHTTP(S)リクエストです。例えば、請求書を生成するアプリケーションを提供している場合、新規請求書が作成された際にトリガーされるWebhook機能を顧客に設定する機会を提供できます。これは、請求書が作成されると、アプリケーションがユーザーによって指定された場所にHTTP(S)リクエストを送信することを意味します。ユーザーはこれを利用して、リマインダーメールのスケジュール設定や、顧客へのSlackメッセージ送信など、Webhookによってトリガーされる独自のカスタムワークフローを設定できます。
チェックリスト:Webhook実装のセキュリティ強化
1. SSRF型攻撃の阻止
この種の攻撃では、攻撃者はWebhook機能をエクスプロイトして、情報(例:クラウド内のインスタンスメタデータ)を取得しようとします。これに対処するためには、以下の対策を講じる必要があります。
✅ ユーザー入力の検証
- 基本:シンプルなURL検証を実行します。
- より良い方法:「https://」で始まるURLを必須とし、「file://」やその他の非HTTPSスキームを禁止します。
✅ ローカルアドレスの制限
- 一般的なローカルIP(127.0.x、192.168.x、172.x)をブロックします。
- 「localhost」および「http://」を禁止します。
✅ ログ公開の制限
- ユーザー向けのログにはHTTPステータスコードのみを表示します。
- ヘッダーやボディコンテンツの表示は避けます。
✅ 高度な対策:強化されたURL検証
- POSTリクエストに対して、顧客固有の特定のレスポンスヘッダーを必須とします。
- DNS変更に対処するため、初期設定後もこの検証を継続的に維持します。

2. ユーザーがデータの信頼性を検証できるようにする
Webhookのコンシューマーは、データが本当にアプリケーションから送信されたものであることを知る方法が必要です。以下のいずれかの方法を使用できます。
✅ テストメッセージ検証
まず、ユーザーがセキュリティメカニズムをテストするために、テストメッセージをトリガーできるようにします。
✅ HMAC検証ハッシュ
Webhook機能において最も効果的なセキュリティメカニズムの一つは、データの完全性と信頼性のためにHMACを実装することです。
基本的なプロセスは次のように要約できます。
- SHA-256と秘密鍵を使用してペイロードのハッシュを生成します。
- ペイロードとともにHMACを送信します。
- 受信者はハッシュを再生成し、ペイロードの信頼性と整合性を検証します。
✅ タイムスタンプの組み込み
これはより高度なセキュリティ対策です。リプレイ攻撃を防ぐためにペイロードにタイムスタンプを追加します。これにより、メッセージの再利用や改ざんを防ぎます。
✅ クライアントサイドTLS証明書
クライアントサイドTLS証明書を使用してHTTPコールを認証します。これは特にエンタープライズレベルの顧客にとって魅力的です。
3. レート制限とデータ過剰露出の回避
Webhookのセキュリティにおいては、過剰なデータを添付するよりも、必要最小限のデータを送信する方が安全です。WebhookコールバックはHTTPSを使用して暗号化されるべきですが、数年後に誰がドメイン名を管理しているかを知ることはできません。
✅ データ露出の最小化
- 個人識別情報(PII)や機密データの送信は避けてください。
- 複数のデータポイント(contact_id、メール、名前など)を送信する代わりに、contact_idのみを送信してください。必要に応じて、ユーザーが公開APIを通じて追加データを取得できるようにします。
✅ リトライポリシーの伝達
- リトライポリシーとレート制限をユーザーに明確に伝達します。
- リトライによりメッセージが順不同で届く可能性があることを通知します。
- 2xx応答は成功と定義し、それ以外の応答はリトライをトリガーするようにします。
✅ 配信にキューシステムを使用する
Webhookの配信を管理し、出力を調整するためにキューシステムを実装します。このアプローチは、大規模なCSVインポートが過剰なWebhookコールやリトライをトリガーするようなエッジケースで、ユーザーのサーバーを誤って過負荷にするのを防ぐのに役立ちます。
4. ボーナス: 異常アラート
これはセキュリティよりも開発者の利便性のためですが、それでも実装する価値があります。
- 4xxおよび5xx応答が検出された場合にユーザーにアラートを送信します。
- ユーザーに障害を通知する通知を送信します。
この追加により、Webhookシステムの透明性と応答性が向上します。
まとめ
以上です!Webhookを単に機能的であるだけでなく、安全でユーザーフレンドリーにするためのいくつかのステップを説明しました。これらのステップを実装することで、アプリケーションを保護し、全体的なユーザーエクスペリエンスも向上します。ハッピーコーディング! 🚀🔒👨💻
Aikido Securityは、開発者中心のソフトウェアセキュリティプラットフォームです。製品のセキュリティを維持し、コード記述に集中できるよう支援します。営業チームと話す必要はありません。GitHub、GitLab、Bitbucket、またはAzure DevOpsアカウントを接続するだけで、リポジトリの無料スキャンを開始できます。

