JSON Web Token を使用した名前空間での認証

この記事では、JSON Web Token を使用して Azure Event Grid 名前空間で認証する方法について説明します。

Azure Event Grid の MQTT ブローカーは、カスタム JWT 認証をサポートしており、クライアントは Microsoft Entra ID 以外の ID プロバイダーが発行する JSON Web Token を使用して、Event Grid 名前空間に接続して認証できます。

前提条件

名前空間でカスタム JWT 認証を使用するには、次の前提条件が必要です。

  • Json Web Token を発行できる ID プロバイダー。
  • クライアント トークンの検証に使用する公開キーを含む CA 証明書。
  • 公開キーを含む CA 証明書をホストする Azure Key Vault アカウント。

手順の概要

名前空間にカスタム JWT 認証を使用するには、次の手順に従います。

  1. 名前空間を作成し、そのサブリソースを構成します。
  2. Event Grid 名前空間でマネージド ID を有効にする
  3. 公開キーを含む CA 証明書をホストする Azure Key Vault アカウントを作成します。
  4. 名前空間のマネージド ID に対して、Azure Key Vault でロールの割り当てを追加します。
  5. Event Grid 名前空間でカスタム認証設定を構成します。
  6. クライアントは、ID プロバイダーで提供されるトークンを使用して、Event Grid 名前空間に接続できます。

名前空間を作成し、そのサブリソースを構成する

クイックスタート: Azure portal で Event Grid 名前空間を使用した MQTT メッセージの発行とサブスクライブに関するページの手順に従って、名前空間を作成し、そのサブリソースを構成します。 クライアント ID は提供されたトークンから取得するため、証明書とクライアントの作成手順はスキップします。 クライアント属性は、クライアント トークンのカスタム要求に基づいています。 クライアント属性は、クライアント グループ クエリ、トピック テンプレート変数、およびルーティング エンリッチメント構成で使用されます。

Event Grid 名前空間でマネージド ID を有効にする

名前空間は、マネージド ID を使用して Azure Key Vault インスタンスにアクセスし、カスタム ドメインのサーバー証明書を取得します。 次のコマンドを使用して、Event Grid 名前空間でシステム割り当てマネージド ID を有効にします。

az eventgrid namespace update --resource-group <resource group name> --name <namespace name> --identity "{type:systemassigned}" 

Azure portal を使用したシステムとユーザー割り当て ID の構成の詳細については、「Event Grid 名前空間でマネージド ID を有効にする」を参照してください。

Azure Key Vault アカウントを作成し、サーバー証明書をアップロードします

  1. 次のコマンドを使って Azure Key Vault アカウントを作成します。

    az keyvault create --name "<your-unique-keyvault-name>" --resource-group "<resource group name>" --location "centraluseaup" 
    
  2. 次のコマンドを使って、証明書を Azure Key Vault にインポートします

    az keyvault certificate import --vault-name "<your-key-vault-name>" -n "<cert name>" -f "<path to your certificate pem file> " 
    

    Note

    証明書では、DNS のサブジェクトの別名にドメイン名が含まれている必要があります。 詳細については、「チュートリアル: Azure Key Vault に証明書をインポートする」を参照してください。

名前空間のマネージド ID に Azure Key Vault でのロールの割り当てを追加する

次の手順を使って、Azure Key Vault アカウントにアクセスするためのアクセス権を、名前空間に提供する必要があります。

  1. 次のコマンドを使って、Event Grid 名前空間のシステム マネージド ID のプリンシパル ID を取得します

    $principalId=(az eventgrid namespace show --resource-group <resource group name> --name <namespace name> --query identity.principalId -o tsv) 
    
  2. Azure Key Vault リソース ID を取得します。

    $keyVaultResourceId=(az keyvault show --resource-group <resource group name> --name <your key vault name> --query id -o tsv) 
    
  3. 名前空間のマネージド ID に対し、Key Vault でのロールの割り当てを追加します。

    az role assignment create --role "Key Vault Certificate User" --assignee $principalId --scope $keyVaultResourceId 
    

    Key Vault アクセスとポータルでの操作の詳細については、「Azure のロールベースのアクセス制御を使用して Key Vault のキー、証明書、シークレットへのアクセス権を付与する」を参照してください。

Event Grid 名前空間でカスタム認証設定を構成します。

この手順では、Azure portal と Azure CLI を使用して、Event Grid 名前空間のカスタム認証設定を構成します。 まず名前空間を作成し、次の手順を用いて更新する必要があります。

Azure Portal の使用

  1. Azure portal で、Event Hubs 名前空間に移動します。

  2. [Event Grid 名前空間] ページで、左側のメニューの [構成] を選択します。

  3. [カスタム JWT 認証] セクションで、次のプロパティの値を指定します。

    1. [カスタム JWT 認証を有効にする] を選択します。

    2. トークン発行者: MQTT クライアントから提示される JWT トークンの発行者要求の値を入力します。

    3. [発行者証明書の追加] を選択します。

      Event Grid 名前空間の [構成] ページの [カスタム JWT 認証] セクションを示すスクリーンショット。

    4. 新しいページで、次のプロパティの値を指定します。

      1. 証明書 URL: 作成した Azure Key Vault 内の発行者証明書の証明書識別子。 [キー コンテナーを使用して証明書を選択する] を選ぶと、サブスクリプションから証明書とキー コンテナーを選択できます。

      2. ID: 作成された発行者証明書にアクセスするためにキー コンテナーで認証するために使用される ID。

      3. [追加] を選択します。

        [発行者証明書の追加] ページを示すスクリーンショット。

  4. [構成] ページに戻り、[適用] を選びます。

    Note

    証明書/キーのローテーションの目的で、最大 2 つの iss 証明書を追加できます。

Azure CLI の使用

次のコマンドを使用して、カスタム JWT 認証構成で名前空間を更新します。

az resource update --resource-type Microsoft.EventGrid/namespaces --api-version 2024-06-01-preview --ids /subscriptions/69f9e5ac-ca07-42cc-98d2-4718d033bcc5/resourceGroups/dummy-cd-test/providers/Microsoft.EventGrid/namespaces/dummy-cd-test2 --set properties.topicSpacesConfiguration.clientAuthentication='{\"customJwtAuthentication\":{\"tokenIssuer\":\"dmpypin-issuer\",\"issuerCertificates\":[{\"certificateUrl\":\"https://dummyCert-cd-test.vault.azure.net/certificates/dummy-cd-test/4f844b284afd487e9bba0831191087br1\",\"identity\":{\"type\":\"SystemAssigned\"}}]}}' 

JSON Web トークン形式

Json Web トークンは、JWT ヘッダー セクションと JWT ペイロード セクションに分けられます。

JWT ヘッダー

ヘッダーには少なくとも typ フィールドと alg フィールドが必要です。 typ は常に JWS である必要があり、alg は常に RS256 である必要があります。 トークン ヘッダーは以下のようにする必要があります。

{
    "typ": "JWT",
    "alg": "RS256"
}

JWT ペイロード

Event Grid では次の要求が必要です: isssubaudexpnbf

名前 説明
iss 発行者。 JWT の値は、カスタム JWT 認証の Event Grid 名前空間構成の発行者と一致する必要があります。
sub 件名。 値は認証 ID 名として使用されます。
aud 対象。 値には文字列または文字列の配列を指定できます。 値には、標準 Event Grid 名前空間のホスト名やその Event Grid 名前空間のカスタム ドメイン (構成されている場合) を含める必要があります。 対象ユーザーは他の文字列を含めることができますが、これらの文字列の少なくとも 1 つは、この名前空間の標準 Event Grid 名前空間ホスト名またはカスタム ドメインである必要があります。
exp Expiration。 JWT の有効期限が切れる Unix 時間。
nbf 期間の開始時刻。 JWT が有効になる単位時間。

Event Grid は、次のいずれかの種類を持つ場合、すべての要求をクライアント属性にマッピングします: int32stringarray of strings。 標準要求 isssubaudexpnbf はクライアント属性から除外されます。 次の JWT の例では、3 つの要求だけがクライアント属性 (num_attrstr_attrstr_list_attr) に変換されます。これらは、正しい種類 (int32stringarray of strings) を持っているためです。 incorrect_attr_1incorrect_attr_2incorrect_attr_3 はクライアント属性に変換されません、これらは間違った種類 (floatarray of integersobject) を持っているためです。

{
    "iss": "correct_issuer",
    "sub": "d1",
    "aud": "testns.mqtt-broker-int.azure.net",
    "exp": 1712876224,
    "nbf": 1712869024,
    "num_attr": 1,
    "str_attr": "some string",
    "str_list_attr": [
        "string 1",
        "string 2"
    ],
    "incorrect_attr_1": 1.23,
    "incorrect_attr_2": [
        1,
        2,
        3
    ],
    "incorrect_attr_3": {
        "field": "value"
    }
}