Azureイベントグリッドシリーズ


これは、ブログの一連の話をし、良いプラクティスとイベントグリッドのヒントについて議論します.議論されるトピックのいくつかは、イベントグリッドだけでなく、他のイベント/メッセージベースのサービスにも適用できます.

TLドクター


WebhookサブスクリプションAzureイベントグリッドからイベントを受け取るための一般的な方法です.エンドポイントを確保し、サブスクリプションへのリクエストを認証できるAzureイベントグリッドを作成することが必須です.クエリパラメータとして秘密を使用すると、Webhookサブスクリプションの認証とセキュリティを提供する基本的なソリューションです.

Webhookサブスクリプション


Wikipediaによると、webhooksは通常いくつかのイベントによって引き起こされるHTTPコールバックです.Azureイベントグリッドでは、WebHooksはイベントを受け取る方法です.これらのイベントはペイロード上でイベントをポストリクエストとして配信されます.
他の多くのイベントベースのサービスのように、Webhookが定義したイベントを受信し処理することができることを検証し証明する必要があります.イベントグリッドでは、通常242479152は同期的に行われ、エンドポイントに特別なリクエストを送信し、Webhookから特定の応答を期待します.検証が終了すると、サブスクリプションが作成され、イベントが配信され始めます.この妥当性検査プロセスは、Azureイベントグリッドで使用されるイベントスキーマによって異なります.例えば、validation processは、ポストの代わりにオプション要求の妥当性要求を受け取ります.

クラウドイベントスキーマ ウェッグフックの安全性


我々が前に議論したように、Webhooksはイベントを受け取ることができるエンドポイントです.このエンドポイントがパブリックであるなら、それは悪意のリクエストを避けるためにそれを確保することが重要です.保証されたエンドポイントで、認証されていない要求はWebhookで破棄され、処理されません.したがって、ここでの質問は以下のとおりです.
イベントグリッドで終点を確保する非常に一般的な方法は です.これは非常に簡単ですが、単にイベントのグリッドにクエリパラメータとしてすべてのイベントに余分なパラメータを提供するイベントグリッドを求める必要がある、余分なパラメータは、単に両方のサービス(イベントグリッドのトピックとイベントグリッドのサブスクリプション)を知っているパスワードです.
この作業は3つの手順で分割できます.
  • 一般的な秘密またはパスワードを作成します.keyvaultの秘密を作成して保存するには、using secrets as query parametersまたはscriptを使用することができます.Webhookサブスクリプションを作成するとき、または配信イベントの認証を証明するときに、その秘密を後で取得できます.
  • 秘密のWebhookサブスクリプションを作成します.ポータルまたはARMテンプレートを使用してサブスクリプションを作成する場合、クエリパラメータを指定することができます.したがって、すべてのイベントがクエリパラメーターとともに配信されます.これらのクエリパラメータを秘密にすることが一般的ですので、イベントグリッド上で特別な方法で処理されます.デフォルトでは、これらのパラメータは、サブスクリプション情報を取得してサービス演算子から取得するときに非表示になります.一方、CLIコマンド(画像2)は--include-full-endpoint-urlパラメーターを使用するときにクエリパラメータを示します.
  • サブスクリプションエンドポイントの秘密を検証します.最後になりますが、少なくとも、受信した秘密を検証する必要があります.予想される秘密は、ステップ1からKeyVaultから簡単に読み、サブスクリプションエンドポイントに設定パラメータとして渡されます.仕事ならば.NETコア、妥当性検査はカスタムActionFilterAttributeで行うことができます
    画像1:イベントグリッド購読-ポータル
    ARM template
    写真2:イベントグリッド購読

    public class WebhookAuthenticationAttribute : ActionFilterAttribute
    {
        private static string Secret = "my-secret";
    
        public override async Task OnActionExecutionAsync(ActionExecutingContext context ActionExecutionDelegate next)
        {
            var queryKey = context.HttpContext.Request.Query["key"];
    
            if (queryKey != Secret)
            {
                context.Result = new UnauthorizedObjectResult("Authentication failed. Please use a valid key.");
            }
    
            await base.OnActionExecutionAsync(context, next);
        }
    }
    
    [WebhookAuthentication]
    public class MyWebhookController : ControllerBase
    {
        [HttpPost]
        public IActionResult NewEvent()
        ...
    }
    

    代替案


    クエリパラメータとしての秘密はWebhookサブスクリプションを確保する唯一の方法ではありません.あるいは、終点を で確保することも可能である.
    さらに、セキュリティの余分な層を追加できるような他のテクニック.このパターンイベントで、ペイロードは外部記憶装置に格納されます、そして、届けられた出来事はその記憶装置へのリファレンスを含みます.この場合、情報をダウンロードして、フルイベントを処理するために、外部記憶装置に要求を認証する必要があるでしょう.