次の方法で共有


OAuth 2.0 JSON Web トークン (JWT) を使用して名前空間で認証する

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

Azure Event Grid の MQTT ブローカーでは OAuth 2.0 JWT 認証がサポートされています。これにより、クライアントは、Microsoft Entra ID 以外の任意の ID プロバイダーによって発行される JSON Web トークンを使用して Event Grid 名前空間に接続して認証できます。

前提条件

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

  • JSON Web トークンを発行できる ID プロバイダー。
  • 公開キー証明書 (直接アップロード) のクライアント トークン (Key Vault) または PEM ファイルの検証に使用される公開キーを含む CA 証明書。

高度な手順

名前空間に OAuth 2.0 JWT 認証を使用するには、次の手順に従います。

  1. 名前空間を作成し、そのサブリソースを構成します。

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

  3. 次の手順に従って、Event Grid 名前空間で OAuth 2.0 認証設定を構成します。

    1. 公開キーを含む CA 証明書をホストする Azure Key Vault アカウントを作成し、名前空間のマネージド ID に対するロールの割り当てを Key Vault に追加します。
    2. または、公開キー証明書の PEM ファイルを名前空間にアップロードします。
  4. クライアントは、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 を有効にする」を参照してください。

Event Grid 名前空間 -Key Vault で OAuth 2.0 JWT 認証設定を構成する

まず、Azure Key Vault アカウントを作成し、サーバー証明書をアップロードし、名前空間のマネージド ID をキー コンテナーに適切なロールを割り当てます。 次に、Azure portal または Azure CLI を使用して、Event Grid 名前空間でカスタム認証設定を構成します。 まず名前空間を作成し、次の手順を用いて更新する必要があります。

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

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

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

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

    注意

    証明書では、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 のキー、証明書、シークレットへのアクセス権を付与する」を参照してください。

Azure portal を使用して認証を構成する

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

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

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

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

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

    3. 発行者証明書の場合は、[Azure Key Vault から] を選択します。

      Event Grid 名前空間の [構成] ページの Azure Key Vault オプションの選択を示すスクリーンショット。

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

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

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

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

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

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

    注意

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

Azure CLI の使用

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

az resource update \
  --resource-type Microsoft.EventGrid/namespaces \
  --api-version 2024-06-01-preview \
  --ids /subscriptions/1111a1a1-bb2b-cc3c-dd4d-ffffee5e5e5e/resourceGroups/sample-rg/providers/Microsoft.EventGrid/namespaces/sample-namespace \
  --set properties.topicSpacesConfiguration.clientAuthentication='{
    \"customJwtAuthentication\":{
      \"tokenIssuer\":\"sample-issuer\",
      \"issuerCertificates\":[
        {
          \"certificateUrl\":\"https://sample-vault.vault.azure.net/certificates/sample-cert/12345abcdef67890\",
          \"identity\":{
            \"type\":\"UserAssigned\",
            \"userAssignedIdentity\":\"/subscriptions/1111a1a1-bb2b-cc3c-dd4d-ffffee5e5e5e/resourceGroups/sample-rg/providers/Microsoft.ManagedIdentity/userAssignedIdentities/sample-identity\"
          }
        }
      ]
    }
  }'
 

JSON Web トークン形式

JSON Web トークンには、JWT ヘッダー、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 有効期限。 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"
    }
}

Event Grid 名前空間で OAuth 2.0 JWT 認証設定を構成する - 直接アップロード

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

Azure Portal の使用

  1. Azure portal で Event Grid 名前空間に移動します。
  2. [Event Grid 名前空間] ページで、左側のメニューの [構成] を選択します。
  3. [カスタム JWT 認証] セクションで、次のプロパティの値を指定します。
    1. [カスタム JWT 認証を有効にする] を選択します。

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

    3. 発行者証明書オプション – 直接アップロードを選択します。

      Event Grid 名前空間の [構成] ページの [直接アップロード] オプションの選択を示すスクリーンショット。

  4. 新しいページで、次のプロパティの値を指定します。
    1. 証明書: PEM 形式でサーバー証明書をアップロードします。

    2. Kid: 証明書の一意のキー識別子。

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

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

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

Azure CLI の使用

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

az eventgrid namespace update \ 
    --resource-group <resource-group-name> \ 
    --name <namespace-name> \ 
    --api-version 2024-12-15-preview \ 
    --set customJwtAuthenticationSettings='{ 
        "tokenIssuer": "issuer-name", 
        "encodedIssuerCertificates": [
            { 
                "kid": "key1", 
                "encodedCertificate": "-----BEGIN CERTIFICATE-----\n<certificate-in-PEM-format>\n-----END CERTIFICATE-----" 
            } 
        ] 
    } 
  • <resource-group-name><namespace-name><___location><key-vault-name><certificate-name><certificate-in-PEM-format>を実際の値に置き換えます。
  • encodedCertificate 値には、ヘッダー ( "-----BEGIN CERTIFICATE-----", "-----END CERTIFICATE----, ``-----BEGIN PUBLIC KEY----- and -----END PUBLIC KEY-----) を含む、完全な証明書と公開キーを PEM 形式で含める必要があります。
  • 指定された公開キー証明書が有効であり、ID プロバイダーによって信頼されていることを確認します。
  • 証明書がローテーションまたは期限切れになっている場合は、encodedIssuerCertificates を定期的に更新します。

JSON Web トークン形式

JSON Web トークンには、JWT ヘッダー、JWT ペイロード、および JWT 署名セクションが必要です。

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

  • kid はオプションです。 存在する場合は、一致する kid を持つ証明書が検証に使用されます。
  • 属性として使用されない標準要求の一覧 ( isssubaudexpnbfiatjti)。
  • 正しいデータ型 (int32、文字列、文字列の配列に適合する数値) を持つすべての要求が属性として使用されます。 この例の num_attr_posでは、 num_attr_negstr_attrstr_list_attr 要求は正しいデータ型を持ち、属性として使用されます。
  • この例の bool_attrでは、 num_attr_to_bignum_attr_floatobj_attr 要求に正しくないデータ型があり、属性として使用されません。
{ 
  "typ": "JWT", 
  "alg": "RS256", 
  "kid": "keyId1" 
}.{ 
  "iss": "some-issuer", 
  "sub": "device1", 
  "aud": "event-grid-namespace.ts.eventgrid.azure.net", 
  "exp": 1770426501, 
  "nbf": 1738886901, 
  "bool_attr": true, 
  "num_attr_pos": 1, 
  "num_attr_neg": -1, 
  "num_attr_to_big": 9223372036854775807, 
  "num_attr_float": 1.23, 
  "str_attr": "str_value", 
  "str_list_attr": [ 
    "str_value_1", 
    "str_value_2" 
  ], 
  "obj_attr": { 
      "key": "value" 
  } 
}