Azure Service Bus リソースにアクセスするために Azure Active Directory を使用してマネージド ID を認証する

Azure リソースのマネージド ID は、デプロイに関連付けられ、その下でアプリケーション コードが実行されるセキュリティ保護された ID を作成できる Azure 間機能です。 この ID は、アプリケーションに必要な特定の Azure リソースにアクセスするためのカスタム アクセス許可を付与するアクセス制御ロールに関連付けることができます。

マネージド ID では、Azure プラットフォームがこのランタイム ID を管理します。 ID 自体やアクセスする必要のあるリソース用に、アクセス キーをアプリケーション コードや構成に保存して保護する必要はありません。 Azure リソース サポートに対してマネージド エンティティが有効にされている Azure App Service アプリケーション内または仮想マシンで実行されている Service Bus クライアント アプリは、SAS ルールと SAS キーや、その他のアクセス トークンを処理する必要はありません。 クライアント アプリに必要なのは、Service Bus メッセージング名前空間のエンドポイント アドレスだけです。 アプリが接続すると、Service Bus はこの記事で後述する例に示す操作で、マネージド エンティティのコンテキストをクライアントにバインドします。 マネージド ID に関連付けられると、Service Bus クライアントは承認済みのすべての操作を実行できます。 マネージド エンティティを Service Bus のロールに関連付けることによって承認が付与されます。

重要

Service Bus 名前空間のローカル認証または SAS キー認証を無効にし、Azure Active Directory 認証のみを許可することができます。 詳細な手順については、「ローカル認証の無効化」を参照してください。

概要

セキュリティ プリンシパル (ユーザー、グループ、またはアプリケーション) で Service Bus エンティティへのアクセスが試行された場合、要求が承認される必要があります。 Azure AD では、リソースへのアクセスは 2 段階のプロセスです。

  1. まず、セキュリティ プリンシパルの ID が認証され、OAuth 2.0 トークンが返されます。 トークンを要求するリソース名は https://servicebus.azure.net です。
  2. 次に、指定されたリソースへのアクセスを承認するために、トークンが要求の一部として Service Bus サービスに渡されます。

認証の手順により、実行時にアプリケーション要求に OAuth 2.0 アクセス トークンが含まれる必要があります。 アプリケーションが Azure VM、仮想マシン スケール セット、または Azure 関数アプリなどの Azure エンティティ内から実行されている場合、そのアプリケーションは、マネージド ID を使用してリソースにアクセスできます。

承認の手順では、セキュリティ プリンシパルに 1 つ以上の Azure ロールを割り当てる必要があります。 Azure Service Bus には、Service Bus リソースの一連のアクセス許可を含む Azure ロールが用意されています。 セキュリティ プリンシパルに割り当てられたロールによって、そのプリンシパルが持つアクセス許可が決定されます。 Azure Service Bus に Azure ロールを割り当てる方法の詳細については、「Azure Service Bus 用の Azure 組み込みロール」を参照してください。

Service Bus に対して要求を行うネイティブ アプリケーションと Web アプリケーションは、Azure AD を使用して承認することもできます。 この記事では、アクセス トークンを要求し、それを使用して Service Bus リソースへの要求を承認する方法を示します。

アクセス権に対して Azure ロールを割り当てる

Azure Active Directory (Azure AD) では、Azure ロールベースのアクセス制御 (Azure RBAC) を通じて、セキュリティで保護されたリソースへのアクセス権が承認されます。 Azure Service Bus では Azure 組み込みロールのセットが定義されており、それには Service Bus エンティティへのアクセスに使用されるアクセス許可の一般的なセットが含まれています。また、データにアクセスするためのカスタム ロールを定義することもできます。

Azure ロールが Azure AD セキュリティ プリンシパルに割り当てられると、Azure によりそのセキュリティ プリンシパルのリソースへのアクセス権が付与されます。 アクセスは、サブスクリプションのレベル、リソース グループ、または Service Bus 名前空間にスコープを設定できます。 Azure AD セキュリティ プリンシパルは、ユーザー、グループ、アプリケーション サービス プリンシパル、または Azure リソースのマネージド ID の場合があります。

Azure Service Bus 用の Azure 組み込みロール

Azure Service Bus の場合、名前空間およびそれに関連するすべてのリソースの Azure portal および Azure リソース管理 API による管理は、Azure RBAC モデルを使って既に保護されています。 Azure では、Service Bus 名前空間へのアクセスを承認するための次の Azure 組み込みロールが提供されています。

  • Azure Service Bus データ所有者: このロールを使って、Service Bus 名前空間とそのエンティティ (キュー、トピック、サブスクリプション、およびフィルター) へのフル アクセスを許可します
  • Azure Service Bus データ送信者: このロールを使って、Service Bus のキューとトピックへのメッセージ送信を許可します。
  • Azure Service Bus データ受信者: このロールを使って、Service Bus のキューとサブスクリプションからのメッセージの受信を許可します。

リソースのスコープ

セキュリティ プリンシパルに Azure ロールを割り当てる前に、セキュリティ プリンシパルに必要なアクセスのスコープを決定します。 ベスト プラクティスとしては、常にできるだけ狭いスコープのみを付与するのが最善の方法です。

次の一覧で、Service Bus リソースへのアクセスのスコープとして指定できるレベルを、最も狭いスコープから順に示します。

  • キュートピック、またはサブスクリプション:ロールの割り当ては、特定の Service Bus エンティティに適用されます。 現在、Azure portal では、サブスクリプション レベルでの Service Bus Azure ロールへのユーザー、グループ、マネージド ID の割り当てはサポートされていません。 以下に示したのは、Azure CLI コマンドの使用例です。az-role-assignment-create によって、Service Bus の Azure ロールに ID を割り当てています。

    az role assignment create \
        --role $service_bus_role \
        --assignee $assignee_id \
        --scope /subscriptions/$subscription_id/resourceGroups/$resource_group/providers/Microsoft.ServiceBus/namespaces/$service_bus_namespace/topics/$service_bus_topic/subscriptions/$service_bus_subscription
    
  • [Service Bus 名前空間] :ロールの割り当ては、名前空間以下とそれに関連付けられているコンシューマー グループに対する Service Bus のトポロジ全体にわたります。

  • [リソース グループ] :ロールの割り当ては、リソース グループのすべての Service Bus リソースに適用されます。

  • サブスクリプション:ロールの割り当ては、サブスクリプションのすべてのリソース グループ内のすべての Service Bus リソースに適用されます。

Note

Azure ロールの割り当ての反映には最大で 5 分かかる場合があることに留意してください。

組み込みのロールの定義方法の詳細については、ロール定義に関するページを参照してください。 Azure カスタム ロールの作成については、「Azure カスタム ロール」を参照してください。

VM 上のマネージド ID を有効にする

Azure リソースのマネージド ID を使用して、ご利用の VM から Service Bus リソースを承認するには、最初に VM 上で Azure リソースのマネージド ID を有効にする必要があります。 Azure リソースのマネージド ID を有効にする方法については、次の記事のいずれかを参照してください。

Azure AD のマネージド ID にアクセス許可を付与する

アプリケーション内のマネージド ID から Service Bus サービスへの要求を承認するには、マネージド ID を適切なスコープ (サブスクリプション、リソース グループ、または名前空間) で Service Bus RBAC ロール (Azure Service Bus データ所有者、Azure Service Bus データ送信者、Azure Service Bus データ受信者) に追加する必要があります。 Azure ロールがマネージド ID に割り当てられると、指定されたスコープで Service Bus エンティティへのアクセス権がそのマネージド ID に付与されます。 Service Bus のロールの詳細については、「Azure Service Bus 用の Azure 組み込みロール」セクションを参照してください。 Azure ロールの割り当ての詳細については、Azure Active Directory を使用した Service Bus リソースへのアクセスの認証と承認に関する記事を参照してください。

Azure リソースのマネージド ID による Service Bus の使用

マネージド ID で Service Bus を使用するには、ロールと適切なスコープを ID に割り当てる必要があります。 このセクションの手順では、マネージド ID で実行され Service Bus リソースにアクセスするシンプルなアプリケーションを使用します。

ここでは、Azure App Service でホストされているサンプル Web アプリケーションを使用します。 Web アプリケーションを作成するための詳細な手順については、Azure に ASP.NET Core Web アプリを作成するに関する記事を参照してください

アプリケーションが作成されたら、次の手順を行います。

  1. [設定] に移動し、 [ID] を選択します。

  2. [状態] を選択して [オン] にします。

  3. [保存] を選択して設定を保存します。

    Managed identity for a web app

この設定を有効にすると、ご利用の Azure Active Directory (Azure AD) に新しいサービス ID が作成され、App Service ホストに構成されます。

Azure portal を使用して Azure ロールを割り当てるには

目的のスコープ (Service Bus 名前空間、リソース グループ、サブスクリプション) で、いずれかの Service Bus ロールをマネージド サービス ID に割り当てます。 詳細な手順については、「Azure portal を使用して Azure ロールを割り当てる」を参照してください。

Note

マネージド ID をサポートするサービスの一覧については、「Azure リソースのマネージド ID をサポートするサービス」を参照してください。

アプリを実行する

次に、作成した ASP.NET アプリケーションの既定のページを変更します。 こちらの GitHub リポジトリの Web アプリケーション コードを使用します。

Default.aspx ページはランディング ページです。 コードは Default.aspx.cs ファイルにあります。 いくつかの入力フィールドと、Service Bus に接続してメッセージを送受信するための send ボタンおよび receive ボタンを備えた最小限の Web アプリケーションが作成されます。

TokenCredential を受け取るコンストラクターを使用して ServiceBusClient オブジェクトを初期化する方法に注意してください。 DefaultAzureCredential は TokenCredential から派生したもので、ここで渡すことができます。 そのため、保持および使用するシークレットはありません。 マネージド ID コンテキストから Service Bus へのフローと承認ハンドシェイクは、トークン資格情報によって自動的に処理されます。 これは SAS を使用するよりも単純なモデルです。

これらの変更を行ったら、アプリケーションを発行して実行します。 適切な発行データを簡単に取得するには、Visual Studio で発行プロファイルをダウンロードしてインポートします。

Get publish profile

メッセージを送受信するには、名前空間の名前と作成したエンティティの名前を入力します。 次に、 [send] または [receive] をクリックします。

注意

  • マネージド ID は、Azure 環境内の App Services、Azure VM、およびスケール セットでのみ機能します。 .NET アプリケーションの場合は、Service Bus NuGet パッケージで使用される Microsoft.Azure.Services.AppAuthentication ライブラリがこのプロトコルの抽象化を提供し、ローカル開発エクスペリエンスをサポートします。 このライブラリを使うと、Visual Studio、Azure CLI 2.0、または Active Directory 統合認証のユーザー アカウントを使って、開発用マシン上でローカルにコードをテストすることもできます。 このライブラリでのローカル開発オプションの詳細については、「Service-to-service authentication to Azure Key Vault using .NET」 (.NET を使用した Azure Key Vault に対するサービス間認証) を参照してください。

次のステップ

Service Bus メッセージングの詳細については、次のトピックをご覧ください。