Share via


Azure Service Bus へのパスワードレス接続を使用するようにアプリケーションを移行する

Azure Service Bus へのアプリケーション要求は、アカウント アクセス キーまたはパスワードレス接続を使用して認証する必要があります。 ただしアプリケーションには、可能であればパスワードレス接続を優先的に使用することをお勧めします。 このチュートリアルでは、従来の認証方法から、より安全なパスワードレス接続に移行する方法について説明します。

アクセス キーに関連するセキュリティ リスク

次のコード例では、アクセス キーを含む接続文字列を使用して Azure Service Bus に接続する方法を示します。 Service Bus を作成すると、Azure によってこれらのキーと接続文字列が自動的に生成されます。 多くの開発者は、この方法に引き寄せられます。過去に使用したことのある方法に慣れていると感じるためです。 アプリケーションで現在接続文字列を使用している場合は、このドキュメントで説明する手順に従い、パスワードレス接続に移行することを検討してください。

await using ServiceBusClient client = new("<CONNECTION-STRING>");

接続文字列は注意して使う必要があります。 開発者は、安全でない場所にアクセス・キーを公開しないよう注意する必要があります。 このキーへのアクセス権を取得したユーザーは誰でも認証を受けることができます。 たとえば、アカウント キーが誤ってソース管理にチェックインされたり、セキュリティ対策が施されていないメールで送信されたり、不用意にチャットに貼り付けられたり、アクセス許可を持たない人物の目に留まったりした場合、悪意のあるユーザーによってアプリケーションがアクセスされてしまうおそれがあります。 アプリケーションを更新してパスワードレス接続に置き換えることを検討してください。

パスワードレス接続に移行する

多くの Azure サービスでは、Microsoft Entra ID とロール ベースのアクセス制御 (RBAC) を介したパスワードレス接続がサポートされています。 これらの手法は堅牢なセキュリティ機能を備えており、Azure ID クライアント ライブラリの DefaultAzureCredential を使って実装することができます。

重要

言語によっては、コード内で DefaultAzureCredential を明示的に実装する必要があります。一方、下層のプラグインまたはドライバーを介して内部的に DefaultAzureCredential が利用される言語もあります。

DefaultAzureCredential は複数の認証方法をサポートしており、どの方法が使用されるかは実行時に決定されます。 このアプローチを採用すると、環境固有のコードを実装することなく、異なる環境 (ローカル開発環境と運用環境) で異なる認証方法をアプリに使用できます。

DefaultAzureCredential が資格情報を検索する順序と場所については、Azure ID ライブラリの概要に関する記事を参照してください。この点は言語によって異なります。 たとえば、ローカルで .NET を使用して作業している場合、DefaultAzureCredential による認証には、通常、開発者が Visual Studio、Azure CLI、または Azure PowerShell へのサインインに使用したアカウントが使用されます。 アプリが Azure にデプロイされると、DefaultAzureCredential によって、関連するホスティング サービス (Azure App Service など) のマネージド ID が自動的に検出され、使用されます。 この移行のためにコードを変更する必要はありません。

注意

マネージド ID は、アプリまたはサービスを表すセキュリティ ID を提供します。 ID は Azure プラットフォームによって管理され、ユーザーがシークレットをプロビジョニングまたはローテーションする必要はありません。 マネージド ID の詳細については、概要ドキュメントを参照してください。

以下のコード例は、パスワードレス接続を使用して Service Bus に接続する方法を示しています。 次のセクションでは、特定のサービスのためにこの設定に移行する方法について詳しく説明します。

.NET アプリケーションは、サービス クライアント クラスのコンストラクターに DefaultAzureCredential のインスタンスを渡すことができます。 その環境で利用できる資格情報が DefaultAzureCredential によって自動的に検出されます。

ServiceBusClient serviceBusClient = new(
    new Uri($"https://{serviceBusNamespace}.blob.core.windows.net"),
    new DefaultAzureCredential());

パスワードレス認証を使用するようにアプリを移行する手順

以下の手順では、キーベースのソリューションではなくパスワードレス接続を使用するように既存のアプリケーションを移行する方法について説明します。 最初にローカル開発環境を構成してから、それらの概念を Azure アプリ ホスティング環境に適用します。 アクセス キーを直接使用しているか接続文字列を使用しているかに関係なく、同じ移行手順を適用してください。

ローカル開発の認証に使用するロールとユーザーを構成する

ローカルで開発する場合は、Service Bus にアクセスするユーザー アカウントに正しいアクセス許可があることを確認します。 この例では、Azure Service Bus データ所有者ロールを使用してデータを送受信しますが、より高権限のロールも使用できます。 このロールを自分に割り当てるには、ユーザー アクセス管理者ロール、または Microsoft.Authorization/roleAssignments/write アクションを含む別のロールに割り当てられている必要があります。 Azure portal、Azure CLI、または Azure PowerShell を使用して、ユーザーに Azure RBAC ロールを割り当てることができます。 ロールの割り当てに使用できるスコープの詳細は、スコープの概要ページでご覧いただけます。

このシナリオでは、最小限の特権の原則に従って、特定の Service Bus 名前空間に限定したアクセス許可をユーザー アカウントに割り当てます。 この方法を使って、ユーザーに必要最小限のアクセス許可のみを与え、より安全な運用環境を作成します。

次の例では、Azure Service Bus データ所有者ロールをユーザー アカウントに割り当てて、データを送受信できるようにします。

重要

ほとんどの場合、ロールの割り当てが Azure に反映されるまでの時間は 1 分から 2 分ですが、まれに 8 分程度までかかる場合があります。 初めてコードを実行したときに認証エラーを受け取る場合は、しばらく待ってから再試行してください。

  1. Azure portal で、メインの検索バーまたは左側のナビゲーションを使用して Service Bus 名前空間を見つけます。

  2. Service Bus の [概要] ページの左側にあるメニューで、[アクセス制御 (IAM)] を選択します。

  3. [アクセス制御 (IAM)] ページで、[ロールの割り当て] タブを選びます。

  4. 上部のメニューから [+ 追加] を選択し、次に結果のドロップダウン メニューから [ロールの割り当ての追加] を選択します。

    A screenshot showing how to assign a role.

  5. 検索ボックスを使って、結果を目的のロールに絞り込みます。 この例では、「Azure Service Bus データ所有者」を検索し、一致する結果を選択して、[次へ] を選択します。

  6. [アクセスの割り当て先] で、[ユーザー、グループ、またはサービス プリンシパル] を選び、[+ メンバーの選択] を選びます。

  7. ダイアログで、自分の Microsoft Entra ユーザー名 (通常は user@domain メール アドレス) を検索し、ダイアログの下部にある [選択] を選びます。

  8. [レビューと割り当て] を選んで最終ページに移動し、もう一度 [レビューと割り当て] を行ってプロセスを完了します。

サインインしてパスワードレス接続を使用するようにアプリ コードを移行する

ローカル開発の場合は、Service Bus 名前空間のロールを割り当てたのと同じ Microsoft Entra アカウントで認証されていることを確認します。 認証には、Azure CLI、Visual Studio、Azure PowerShell のほか、IntelliJ などのツールを使用できます。

ローカル開発には、ロールを割り当てたのと同じ Microsoft Entra アカウントで認証を受けるようにしてください。 Azure CLI や Azure PowerShell などの一般的な開発ツールを使用して認証できます。 認証に使用できる開発ツールは、言語によって異なります。

Azure CLI で次のコマンドを使って Azure にサインインします。

az login

次に、パスワードレス接続を使用するようにコードを更新します。

  1. .NET アプリケーションで DefaultAzureCredential を使用するには、Azure.Identity パッケージをインストールします:

    dotnet add package Azure.Identity
    
  2. ファイルの先頭に、次のコードを追加します:

    using Azure.Identity;
    
  3. Azure サービス バスに接続するための ServiceBusClient オブジェクトを作成するコードを特定します。 次の例に合わせてコードを更新します。

     var serviceBusNamespace = $"https://{namespace}.servicebus.windows.net";
     ServiceBusClient client = new(
         serviceBusNamespace,
         new DefaultAzureCredential());
    

アプリをローカルで実行する

これらの変更をコードに対して行った後、アプリケーションをローカルで実行します。 新しい構成では、Azure CLI、Visual Studio、IntelliJ などのローカルの資格情報を取得する必要があります。 アプリは、Azure のローカル開発ユーザーに割り当てられたロールを使用して、Azure サービスにローカルから接続できます。

Azure ホスティング環境を構成する

パスワードレス接続を使用するようにアプリケーションを構成し、ローカルから実行しました。そのアプリケーションを Azure にデプロイすれば、同じコードで Azure サービスに対する認証を行うことができます。 たとえば、マネージド ID が有効になっている Azure App Service インスタンスにデプロイされたアプリケーションが Azure Service Bus に接続できます。

Azure portal を使用してマネージド ID を作成する

次の手順は、さまざまな Web ホスティング サービスのシステム割り当てマネージド ID を作成する方法を示したものです。 このマネージド ID は、先ほど設定したアプリ構成を使用して、他の Azure サービスに安全に接続できます。

一部のアプリ ホスティング環境では、サービス コネクタがサポートされます。Azure Compute サービスは、サービス コネクタを利用することで、連携する他のサービスに接続することができます。 サービス コネクタは、ネットワークの設定と接続情報を自動的に構成します。 サービス コネクタの詳細とサポートされるシナリオについては、概要ページを参照してください。

現在、次のコンピューティング サービスがサポートされています。

  • Azure App Service
  • Azure Spring Cloud
  • Azure Container Apps (プレビュー)

この移行ガイドでは App Service を使用しますが、Azure Spring Apps と Azure Container Apps でも手順は同様です。

注意

Azure Spring Apps では現在、接続文字列を使用したサービス コネクタのみがサポートされています。

  1. App Service のメイン概要ページで、左側のナビゲーションから [サービス コネクタ] を選択します。

  2. トップ メニューから [+ 作成] を選択すると、[接続の作成] パネルが開きます。 次の値を入力します。

    • [サービスの種類]: [サービス バス] を選択します。
    • [サブスクリプション]: 使用するサブスクリプションを選択します。
    • [接続名]: 接続の名前を入力します (例: connector_appservice_servicebus)。
    • [クライアントの種類]: 既定値を選択したままにするか、使用する特定のクライアントを選択します。

    [次へ: 認証] を選択します。

  3. [システム割り当てマネージド ID (推奨)] が選択されていることを確認し、[次へ:ネットワーク] を選択します。

  4. 既定値を選択したまま、[次へ: レビューと作成] を選択します。

  5. Azure で設定が検証された後、[作成] を選択します。

アプリ サービスのシステム割り当てマネージド ID がサービス コネクタによって自動的に作成されます。 また、コネクタによって、このマネージド ID に、選択したサービス バスの Azure Service Bus データ所有者ロールも割り当てられます。

または、Azure CLI を使用して、Azure ホスティング環境でマネージド ID を有効にすることもできます。

Azure CLI を使用して、Azure Compute ホスティング環境とターゲット サービスとの間でサービス接続をできます。 ポータルの手順で説明したように、マネージド ID は CLI によって自動的に作成され、適切なロールが割り当てられます。

Azure App Service を使用している場合は、az webapp connection コマンドを使用します。

az webapp connection create servicebus \
    --resource-group <resource-group-name> \
    --name <webapp-name> \
    --target-resource-group <target-resource-group-name> \
    --namespace <target-service-bus-namespace> \
    --system-identity

Azure Spring Apps を使用している場合は、az spring connection コマンドを使用します。

az spring connection create servicebus \
    --resource-group <resource-group-name> \
    --service <service-instance-name> \
    --app <app-name> \
    --deployment <deployment-name> \
    --target-resource-group <target-resource-group> \
    --namespace <target-service-bus-namespace> \
    --system-identity

Azure Container Apps を使用している場合は、az containerapp connection コマンドを使用します。

az containerapp connection create servicebus \
    --resource-group <resource-group-name> \
    --name <webapp-name> \
    --target-resource-group <target-resource-group-name> \
    --namespace <target-service-bus-namespace> \
    --system-identity

マネージド ID にロールを割り当てる

次に、作成したマネージド ID に、Service Bus へのアクセス許可を付与する必要があります。 そのためには、ローカル開発ユーザーの場合と同じように、マネージド ID にロールを割り当てます。

サービス コネクタを使用してサービスを接続した場合は、この手順を行う必要はありません。 必要な構成は自動的に行われます。

  • 接続の作成時にマネージド ID を選択した場合、アプリ用のシステム割り当てマネージド ID が作成され、そこに Service Bus の Azure Service Bus データ所有者ロールが割り当てられます。

  • 接続文字列を選択した場合、接続文字列はアプリの環境変数として追加されています。

アプリをテストする

これらのコードに変更を加えた後、ホストされているアプリケーションにブラウザーでアクセスします。 Service Bus に対してアプリから正常に接続できるはずです。 Azure 環境にロールの割り当てが反映されるまでに数分かかる場合があることに留意してください。 これでローカル環境と運用環境のどちらでも動作するようにアプリケーションが構成されました。開発者がアプリケーション自体でシークレットを管理する必要はありません。

次の手順

このチュートリアルでは、アプリケーションをパスワードレス接続に移行する方法について説明しました。