Microsoft Entra ID を使って Azure Service Bus リソースにアクセスするためのマネージド ID を認証する
Azure リソースのマネージド ID には、Azure サービス向けの、Microsoft Entra ID で自動的に管理される ID が用意されています。 この ID を使用して、コードに資格情報が含まれていなくても、Microsoft Entra 認証をサポートする任意のサービス (Azure Service Bus など) に認証することができます。 マネージド ID に慣れていない場合は、この記事を読み進める前に、「Azure リソースのマネージド ID」を参照してください。
マネージド ID を使用して Service Bus エンティティにアクセスする大まかな手順を次に示します。
クライアント アプリまたは環境のマネージド ID を有効にします。 たとえば、Azure App Service アプリ、Azure Functions アプリ、またはアプリが実行されている仮想マシンのマネージド ID を有効にします。 この手順に役立つ記事を次に示します。
適切なスコープ (Azure サブスクリプション、リソース グループ、Service Bus 名前空間、Service Bus キューまたはトピックなど) で、Azure Service Bus データ所有者、Azure Service Bus データ送信者、Azure Service Bus データ 受信者 のどれかのロールをマネージド ID に割り当てます。 マネージド ID にロールを割り当てる方法については、「Azure portal を使用した Azure ロールの割り当て」を参照してください。
アプリケーションで、マネージド ID と Service Bus 名前空間へのエンドポイントを使用して名前空間に接続します。
たとえば、.NET では、
TokenCredential
とfullyQualifiedNamespace
(文字列。例:cotosons.servicebus.windows.net
) パラメーターを受け取る ServiceBusClient コンストラクターを使用して、マネージド ID で Service Bus に接続します。 DefaultAzureCredential を渡します。これはTokenCredential
から派生し、マネージド ID を使用します。DefaultAzureCredentialOptions
で、ManagedIdentityClientId
をクライアントのマネージド ID の ID に設定します。string fullyQualifiedNamespace = "<your namespace>.servicebus.windows.net>"; string userAssignedClientId = "<your managed identity client ID>"; var credential = new DefaultAzureCredential( new DefaultAzureCredentialOptions { ManagedIdentityClientId = userAssignedClientId }); var sbusClient = new ServiceBusClient(fullyQualifiedNamespace, credential);
重要
サービス バスの名前空間に対してローカルまたは SAS キー認証を無効にし、Microsoft Entra 認証のみを許可できます。 詳細な手順については、「ローカル認証の無効化」を参照してください。
Azure Service Bus 用の Azure 組み込みロール
Microsoft Entra は、Azure ロールベースのアクセス制御 (RBAC) を使って、セキュリティ保護されたリソースへのアクセスを認可します。 Azure Service Bus は、Service Bus エンティティへのアクセスに使用される一般的なアクセス許可セットを含む Azure 組み込みロールのセットを定義します。 データにアクセスするためのカスタム ロールを定義することもできます。
Azure には、Service Bus 名前空間へのアクセスを承認するための次の Azure 組み込みロールが用意されています。
- Azure Service Bus データ所有者: このロールを使って、Service Bus 名前空間とそのエンティティ (キュー、トピック、サブスクリプション、およびフィルター) へのフル アクセスを許可します
- Azure Service Bus データ送信者: このロールを使って、Service Bus のキューとトピックへのメッセージ送信を許可します。
- Azure Service Bus データ受信者: このロールを使って、Service Bus のキューとサブスクリプションからのメッセージの受信を許可します。
Azure portal でマネージド ID にロールを割り当てるには、[アクセス制御 (IAM)] ページを使用します。 [Service Bus 名前空間] ページ、[Service Bus キュー] ページ、[Service Bus トピック] ページのどれかの [アクセス制御 (IAM)] を選択して、このページに移動します。 ロール割り当ての詳細な手順については、「Azure portal を使用した Azure ロールの割り当て」を参照してください。
リソースのスコープ
マネージド ID に Azure ロールを割り当てる前に、マネージド ID に必要なアクセスのスコープを決定します。 ベスト プラクティスとしては、常にできるだけ狭いスコープのみを付与するのが最善の方法です。
次の一覧で、Service Bus リソースへのアクセスのスコープとして指定できるレベルを、最も狭いスコープから順に示します。
キュー、トピック、またはサブスクリプション:ロールの割り当ては、特定の Service Bus エンティティに適用されます。
Service Bus 名前空間: ロールの割り当ては、名前空間の下の Service Bus のトポロジ全体に及びます。
[リソース グループ] :ロールの割り当ては、リソース グループのすべての Service Bus リソースに適用されます。
サブスクリプション:ロールの割り当ては、サブスクリプションのすべてのリソース グループ内のすべての Service Bus リソースに適用されます。
注意
Azure ロールの割り当ての反映には最大で 5 分かかる場合があることに留意してください。
現在、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
組み込みのロールの定義方法の詳細については、ロール定義に関するページを参照してください。 Azure カスタム ロールの作成については、「Azure カスタム ロール」を参照してください。
SDK の使用
.NET では、ServiceBusClient オブジェクトは、完全修飾名前空間と TokenCredential
を受け取るコンストラクターを使用して初期化されます。 DefaultAzureCredential
は TokenCredential
から派生し、アプリ用に構成されたマネージド ID を自動的に使用します。 マネージド ID コンテキストから Service Bus へのフローと承認ハンドシェイクは、トークン資格情報によって自動的に処理されます。 これは SAS を使用するよりも単純なモデルです。
var client = new ServiceBusClient('cotosons.servicebus.windows.net', new DefaultAzureCredential());
ServiceBusSender と ServiceBusReceiver または ServiceBusProcessor を使用して、通常どおりメッセージを送受信します。
マネージド ID を使用してメッセージを送受信する完全な詳細手順については、次のクイックスタートを参照してください。 これらのクイックスタートには、サービス プリンシパルを使用してメッセージを送受信するコードがありますが、コードはマネージド ID を使用する場合と同じです。
注意
マネージド 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 に対するサービス間認証) を参照してください。
次のステップ
マネージド ID を使用して Service Bus に接続してメッセージを送受信するこの GitHub の .NET Web アプリケーション サンプルを参照してください。 アプリ サービスの ID を Azure Service Bus データ所有者ロールに追加します。