Azure Service Bus エンティティにアクセスするために Microsoft Entra ID を使用してアプリケーションを認証および承認する
Azure Service Bus では、Microsoft Entra ID を使用して Service Bus エンティティ (キュー、トピック、サブスクリプション、またはフィルター) への要求を承認することがサポートされています。 Microsoft Entra ID を使用すると、Azure ロールベースのアクセス制御 (Azure RBAC) を使用して、セキュリティ プリンシパル (ユーザー、グループ、アプリケーション サービス プリンシパル、または Azure リソースのマネージド ID) にアクセス許可を付与できます。 Azure Service Bus で Microsoft Entra ID を使用する主な利点は、資格情報をコード内に格納する必要がなくなることです。 代わりに、Microsoft ID プラットフォームから OAuth 2.0 アクセス トークンを要求することができます。 認証が成功すると、Microsoft Entra ID からアプリケーションにアクセス トークンが返されます。アプリケーションでは、このアクセス トークンを使用して Azure Service Bus リソースへの要求を承認できます。
重要
サービス バスの名前空間に対してローカルまたは SAS キー認証を無効にし、Microsoft Entra 認証のみを許可できます。 詳細な手順については、「ローカル認証の無効化」を参照してください。
概要
セキュリティ プリンシパル (ユーザー、グループ、またはアプリケーション) で Service Bus エンティティへのアクセスが試行された場合、要求が承認される必要があります。 Microsoft Entra ID では、リソースへのアクセスは 2 段階のプロセスです。
- まず、セキュリティ プリンシパルの ID が認証され、OAuth 2.0 トークンが返されます。 トークンを要求するリソース名は
https://servicebus.azure.net
です。 - 次に、指定されたリソースへのアクセスを承認するために、トークンが要求の一部として Service Bus サービスに渡されます。
認証の手順により、実行時にアプリケーション要求に OAuth 2.0 アクセス トークンが含まれる必要があります。 アプリケーションが Azure VM、仮想マシン スケール セット、または Azure 関数アプリなどの Azure エンティティ内から実行されている場合、そのアプリケーションは、マネージド ID を使用してリソースにアクセスできます。 マネージド ID によって Service Bus サービスに対して行われる要求を認証する方法については、Azure Service Bus リソースへのアクセスを Microsoft Entra ID と Azure リソース用マネージド ID を使用して認証する方法に関するページを参照してください。
承認の手順では、セキュリティ プリンシパルに 1 つ以上の Azure ロールを割り当てる必要があります。 Azure Service Bus には、Service Bus リソースの一連のアクセス許可を含む Azure ロールが用意されています。 セキュリティ プリンシパルに割り当てられるロールによって、Service Bus リソースでそのプリンシパルが持つアクセス許可が決定されます。 Azure Service Bus に Azure ロールを割り当てる方法の詳細については、「Azure Service Bus 用の Azure 組み込みロール」を参照してください。
Service Bus に対して要求を行うネイティブ アプリケーションと Web アプリケーションは、Microsoft Entra ID を使用して承認することもできます。 この記事では、アクセス トークンを要求し、それを使用して Service Bus リソースへの要求を承認する方法を示します。
Azure Service Bus 用の Azure 組み込みロール
Microsoft Entra では、Azure RBAC を使用して、セキュリティで保護されたリソースへのアクセス権を認可します。 Azure Service Bus では Azure 組み込みロールのセットが定義されており、それには Service Bus エンティティへのアクセスに使用されるアクセス許可の一般的なセットが含まれています。また、データにアクセスするためのカスタム ロールを定義することもできます。
Azure ロールが Microsoft Entra のセキュリティ プリンシパルに割り当てられると、Azure はそれらのリソースへのアクセスをそのセキュリティ プリンシパルに許可します。 アクセスのスコープは、サブスクリプション、リソース グループ、Service Bus 名前空間またはエンティティ (キュー、トピック、またはサブスクリプション) のレベルに設定できます。 Microsoft Entra セキュリティ プリンシパルは、ユーザー、グループ、アプリケーション サービス プリンシパル、または Azure リソースのマネージド ID である可能性があります。
Azure Service Bus の場合、名前空間およびそれに関連するすべてのリソースの Azure portal および Azure リソース管理 API による管理は、Azure RBAC モデルを使って既に保護されています。 Azure には、Service Bus 名前空間へのアクセスを承認するための次の組み込みロールが用意されています。
- 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 の割り当てはサポートされていません。
Service Bus 名前空間: ロールの割り当て対象は、Service Bus のその名前空間に属するトポロジ全体と、それに関連付けられたキューまたはトピック サブスクリプションです。
[リソース グループ] :ロールの割り当ては、リソース グループのすべての Service Bus リソースに適用されます。
Azure サブスクリプション: ロールの割り当ては、サブスクリプションのすべてのリソース グループ内のすべての Service Bus リソースに適用されます。
Note
Azure ロールの割り当ての反映には最大で 5 分かかる場合があることに留意してください。
組み込みのロールの定義方法の詳細については、ロール定義に関するページを参照してください。 Azure カスタム ロールの作成については、「Azure カスタム ロール」を参照してください。
アプリケーションからの認証
Service Bus で Microsoft Entra ID を使用する主な利点は、資格情報をコード内に格納する必要がなくなることです。 代わりに、Microsoft ID プラットフォームから OAuth 2.0 アクセス トークンを要求することができます。 Microsoft Entra は、アプリケーションを実行しているセキュリティ プリンシパル (ユーザー、グループ、サービス プリンシパル、または Azure リソース のマネージド ID) を認証します。 認証が成功すると、Microsoft Entra ID からアプリケーションにアクセス トークンが返されます。アプリケーションでは、このアクセス トークンを使用して Azure Service Bus への要求を承認できます。
次のセクションでは、Microsoft ID プラットフォーム 2.0 による認証を行うためにネイティブ アプリケーションまたは Web アプリケーションを構成する方法を説明します。 Microsoft ID プラットフォーム 2.0 の詳細については、「Microsoft ID プラットフォーム (v2.0) の概要」を参照してください。
OAuth 2.0 コード付与フローの概要については、「OAuth 2.0 コード付与フローを使用して Microsoft Entra Web アプリケーションへアクセスを承認する」を参照してください。
Microsoft Entra テナントにアプリケーションを登録する
Microsoft Entra ID を使用して Service Bus エンティティを承認する最初の手順は、Azure portal からクライアント アプリケーションを Microsoft Entra テナントに登録することです。 クライアント アプリケーションの登録では、アプリケーションに関する情報を AD に提供します。 これで Microsoft Entra ID から、アプリケーションを Microsoft Entra ランタイムと関連付ける際に使用できるクライアント ID (アプリケーション ID とも呼ばれます) が提供されます。 クライアント ID の詳細については、「Microsoft Entra ID のアプリケーション オブジェクトとサービス プリンシパル オブジェクト」を参照してください。
アプリケーションを Microsoft Entra ID に登録するには、「クイックスタート: Microsoft ID プラットフォームにアプリケーションを登録する」の手順に従います。
Note
アプリケーションをネイティブ アプリケーションとして登録する場合は、リダイレクト URI 用に任意の有効な URI を指定できます。 ネイティブ アプリケーションの場合、この値が実際の URL である必要はありません。 Web アプリケーションの場合、リダイレクト URI はトークンが提供される URL を指定するため、有効な URI である必要があります。
アプリケーションを登録すると、[設定] に [アプリケーション (クライアント) ID] と [ディレクトリ (テナント) ID] が表示されます。
重要
TenantId と ApplicationId をメモしておきます。 アプリケーションを実行するためにこれらの値が必要になります。
アプリの登録に関する詳細については、Microsoft Entra ID を使用したアプリケーションの統合に関する記事をご覧ください。
クライアント シークレットの作成
アプリケーションでは、トークンを要求するときに ID を証明するためにクライアント シークレットが必要です。 クライアント シークレットを追加するには、次の手順を行います。
Azure portal でアプリの登録に移動します (そのページにまだアクセスしていない場合)。
左側のメニューの [証明書とシークレット] を選択します。
[クライアント シークレット] で、 [新しいクライアント シークレット] を選択して新しいシークレットを作成します。
シークレットの説明を入力し、必要な有効期限の間隔を選んで、[追加] を選択します。
すぐに新しいシークレットの値を安全な場所にコピーします。 完全な値は 1 回だけ表示されます。
Service Bus API のアクセス許可
アプリケーションがコンソール アプリケーションである場合は、ネイティブ アプリケーションを登録し、Microsoft.ServiceBus に対する API アクセス許可を必要なアクセス許可セットに追加する必要があります。 また、ネイティブ アプリケーションには、識別子として機能する、Microsoft Entra ID のリダイレクト URI も必要です。この URI はネットワーク宛先である必要はありません。 この例では、サンプル コードが https://servicebus.microsoft.com
を既に使っているため、この URI を使います。
Azure portal を使用して Azure ロールを割り当てる
目的のスコープ (エンティティ、Service Bus 名前空間、リソース グループ、Azure サブスクリプション) で、いずれかの Service Bus ロールをアプリケーションのサービス プリンシパルに割り当てます。 詳細な手順については、「Azure portal を使用して Azure ロールを割り当てる」を参照してください。
ロールとそのスコープを定義したら、GitHub のサンプルでこの動作をテストできます。
Service Bus クライアントを認証する
アプリケーションを登録して、Azure Service Bus でデータを送受信するためのアクセス許可を付与したら、クライアントのシークレット資格情報を使用してクライアントを認証することで、Azure Service Bus に対して要求を行うことができるようになります。
トークンの取得がサポートされるシナリオのリストは、「Microsoft Authentication Library (MSAL) for .NET」GitHub リポジトリの「シナリオ」のセクションを参照してください。
最新の Azure.Messaging.ServiceBus ライブラリを使用して、ServiceBusClient を、Azure.Identity ライブラリで定義されている ClientSecretCredential で認証することができます。
TokenCredential credential = new ClientSecretCredential("<tenant_id>", "<client_id>", "<client_secret>");
var client = new ServiceBusClient("<fully_qualified_namespace>", credential);
以前の .NET パッケージをお使いの場合は、azure-service-bus サンプル リポジトリの RoleBasedAccessControl サンプルを参照してください。
次のステップ
- Azure RBAC の詳細については、「Azure ロールベースのアクセス制御 (Azure RBAC) とは」を参照してください。
- Azure PowerShell、Azure CLI、または REST API で Azure ロールを割り当てて管理する方法については、次の記事を参照してください。
Service Bus メッセージングの詳細については、次のトピックをご覧ください。