https://d226lax1qjow5r.cloudfront.net/blog/blogposts/using-message-signatures-to-ensure-secure-incoming-webhooks-dr/Secure-Webhooks.png

メッセージ署名を使用して安全な受信Webhookを確保する

最終更新日 April 26, 2021

所要時間:1 分

一方通行の会話は面白くありません。Vonageでは双方向の会話を大切にしており、APIもそのひとつです。例えば、SMSを送信するにはAPIを呼び出します。SMSの返信を受信するには、アプリケーションは着信Webhookを処理する必要があります。WebhookはHTTPを使用してイベントを通知するのに優れていますが、公開URLでアプリケーションを利用できるようにする必要があります。欠点は?あなたの公開URLは、まあ、公開されています。そして、そのメッセージがVonageから来たものであることをどうやって確認するのでしょうか?

注意メッセージ署名を使用して着信 Webhook を検証することは、現在 Vonage SMS API でのみ可能です。

これは、あらゆるアプリケーションのWebhookでよくある問題です。Vonageでは メッセージ署名を有効にすることをお勧めします。この記事では、メッセージ署名がどのように機能するのか、またご自身のアプリケーションにどのように設定するのかを説明します。同じアプローチはいくつかの場所で使用されていますが、今日の例では SMS を受信するコンテキストでそれを示しています。 SMS受信のコード例を受信するコード例もありますので、興味のある方はそちらをご覧ください。

メッセージ署名を有効にする

Vonageの新規アカウントは、デフォルトではメッセージ署名が有効になっていません。 support@nexmo.comアカウントでメッセージ署名を有効にするようリクエストしてください。送信するすべてのメッセージに署名を付けることを要求する2番目のオプションがあります。

シグネチャーの秘密

署名を有効にしたら、ダッシュボードにある ダッシュボードの設定ページ.ここで、どの署名アルゴリズムを使うかを設定し(この例では SHA-256 HMACオプションを使用しています)、署名の秘密にアクセスできます。この署名シークレットをコピーすると、サーバーとクライアントの両方で署名を計算するための「共有シークレット」になります。

共有シークレット」とは、2者間(この場合はVonageのサーバーとお客様の間)で事前に共有されるキーのことです。この共有シークレットは決して送信されませんが、Vonageとお客様のアプリケーションの両方によって使用され、データが期待されるサーバーから発信されたものであり、何らかの方法で変更されていないことを確認します。

また、この設定ページには、ウェブフックのHTTP動詞を次のように変更するオプションがあります。 POST.デフォルトは GETで、ここの例では GETですが、変更したい場合は(個人的には POST個人的にはこちらが好きです)、この設定は "Default SMS Setting" -> "HTTP Method" の下にあります。

ヴォネージがシグネチャーを料理

SMSがVonage番号に到着すると、Vonageはその番号に設定されたURLに、到着したメッセージに関するすべての情報を含むWebhookを送信します。メッセージシグネチャを有効にすると、メッセージと一緒に送信するシグネチャも計算します。

署名の作成方法については 署名を作成するための詳細なマニュアルが、簡単に説明すると

  • アルファベット順にフォームフィールドを取得し、それらをキーと値の長い文字列に連結する。

  • 署名の秘密を最後に加える

  • 作成した文字列を、選択したアルゴリズム、例えばSHA-256 HMACに従ってハッシュする。ジャジャーン!これが署名だ。

ハッシュは、(通常は長い)文字列のテキスト表現である。ハッシュから元の文字列をリバースエンジニアリングすることはできない。このハッシュ(この場合はメッセージの署名)を安全に送信することができる。

Vonageがデータと署名を送信

署名が作成されると、メッセージデータと署名を含むウェブフックが、この番号用に設定したURLに送信される。こんな感じだ:

msisdn: 44784xxxxxxx
to: 44741xxxxxxx
messageId: 16000002632BEC99
text: Next step
type: text
keyword: NEXT
message-timestamp: 2019-01-23 10:51:39
timestamp: 1548240699
nonce: 9a706fdd-2b68-4761-87ab-c6ea80cab452
sig: 062470CA9A00C81FBF32FACE34B73D819BCDED07B36203DF7C0714E1094D86DE

私たちはこのデータをアプリケーションで受け取り、これと先ほどコピーしたシグネチャ・シークレットを使ってシグネチャを再作成し、届いたものと照合することができる。

期待されるシグネチャーの計算

送信されたデータと署名の秘密から、同じ手順で署名を作成し、完全に一致するものを得ることができます。手動のプロセスは上記で説明し、リンクしましたが、私たちのサーバーSDKはあなたの選択した技術スタックのために署名を作成します。

例えば PHPライブラリが動作しているところです:

    $signature = new \Nexmo\Client\Signature(
        $_GET,
        NEXMO_API_SIGNATURE_SECRET,
        'sha256'
    );
    $isValid = $signature->check($_GET['sig']);

の値は $isValidの値は、シグネチャが一致したかどうかを示す。

自分のコードを攻撃する

ローカルの開発プラットフォームへのリクエストをキャプチャすることで、ちょっとしたハッキングを試すことができます。 を使いを使い、データをキャプチャし、PostmanのようなHTTP Clientを使ってアプリケーションにWebhookを送信してみる。メッセージ、電話番号、タイムスタンプなどのフィールドを変更すると、シグネチャのマッチングに失敗します。

安全な受信Webhookの確保

従来のウェブ・アプリケーションでは、セッション/クッキー情報、CSRFトークン、そして悪意のある受信データから保護するためのその他の対策があります。Webhookには同じコンテキストがないため、メッセージ署名付きの共有秘密のようなアプローチによって、タイミング攻撃や、改ざんされた、あるいはVonageのサーバー以外のどこかから発信された受信データから保護することができます。私の経験では、ほとんどの "悪意のある "データは、誰かがどこかに間違ったURLを入れたか、同じように無害なものを入れただけです。攻撃であろうとなかろうと、アプリケーションが処理すべきではないデータであることに変わりはありません。

Vonageアカウントの署名を有効にし、チェックコードを追加してください。)

シェア:

https://a.storyblok.com/f/270183/250x250/e3d3b71060/lornajane.png
Lorna Mitchellヴォネージの卒業生

ローナはブログ癖のあるソフトウェア・エンジニアだ。彼女は言葉とコードを同等に扱おうとしている。