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 認証を使用するには、次の手順に従います。
- 名前空間を作成し、そのサブリソースを構成します。
- Event Grid 名前空間でマネージド ID を有効にする
- 公開キーを含む CA 証明書をホストする Azure Key Vault アカウントを作成します。
- 名前空間のマネージド ID に対して、Azure Key Vault でロールの割り当てを追加します。
- Event Grid 名前空間でカスタム認証設定を構成します。
- クライアントは、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 アカウントを作成し、サーバー証明書をアップロードします
次のコマンドを使って Azure Key Vault アカウントを作成します。
az keyvault create --name "<your-unique-keyvault-name>" --resource-group "<resource group name>" --location "centraluseaup"
次のコマンドを使って、証明書を 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 アカウントにアクセスするためのアクセス権を、名前空間に提供する必要があります。
次のコマンドを使って、Event Grid 名前空間のシステム マネージド ID のプリンシパル ID を取得します
$principalId=(az eventgrid namespace show --resource-group <resource group name> --name <namespace name> --query identity.principalId -o tsv)
Azure Key Vault リソース ID を取得します。
$keyVaultResourceId=(az keyvault show --resource-group <resource group name> --name <your key vault name> --query id -o tsv)
名前空間のマネージド 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 の使用
Azure portal で、Event Hubs 名前空間に移動します。
[Event Grid 名前空間] ページで、左側のメニューの [構成] を選択します。
[カスタム JWT 認証] セクションで、次のプロパティの値を指定します。
[構成] ページに戻り、[適用] を選びます。
Note
証明書/キーのローテーションの目的で、最大 2 つの
iss
証明書を追加できます。
Azure CLI の使用
次のコマンドを使用して、カスタム JWT 認証構成で名前空間を更新します。
az resource update --resource-type Microsoft.EventGrid/namespaces --api-version 2024-06-01-preview --ids /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/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 では次の要求が必要です: iss
、sub
、aud
、exp
、nbf
。
名前 | 説明 |
---|---|
iss |
発行者。 JWT の値は、カスタム JWT 認証の Event Grid 名前空間構成の発行者と一致する必要があります。 |
sub |
件名。 値は認証 ID 名として使用されます。 |
aud |
対象。 値には文字列または文字列の配列を指定できます。 値には、標準 Event Grid 名前空間のホスト名やその Event Grid 名前空間のカスタム ドメイン (構成されている場合) を含める必要があります。 対象ユーザーは他の文字列を含めることができますが、これらの文字列の少なくとも 1 つは、この名前空間の標準 Event Grid 名前空間ホスト名またはカスタム ドメインである必要があります。 |
exp |
Expiration。 JWT の有効期限が切れる Unix 時間。 |
nbf |
期間の開始時刻。 JWT が有効になる単位時間。 |
Event Grid は、次のいずれかの種類を持つ場合、すべての要求をクライアント属性にマッピングします: int32
、string
、array of strings
。 標準要求 iss
、sub
、aud
、exp
、nbf
はクライアント属性から除外されます。 次の JWT の例では、3 つの要求だけがクライアント属性 (num_attr
、str_attr
、str_list_attr
) に変換されます。これらは、正しい種類 (int32
、string
、array of strings
) を持っているためです。 incorrect_attr_1
、incorrect_attr_2
、incorrect_attr_3
はクライアント属性に変換されません、これらは間違った種類 (float
、array of integers
、object
) を持っているためです。
{
"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"
}
}