次の方法で共有


サービス プリンシパルを使用して、ローカル開発中にJavaアプリがAzureサービスに認証されるようにする

ローカル開発時に、アプリケーションは、さまざまなAzure サービスにアクセスするためにAzureに対して認証を行う必要があります。 ローカルで認証するには、次のいずれかの方法を使用します。

  • Azure ID ライブラリでサポートされているいずれかの開発者ツールで開発者アカウントを使用します。 詳細については、「ローカル開発中に開発者アカウントを使用してJavaアプリをAzureサービスに認証する」の参照をご覧ください。
  • サービス プリンシパルを使用します。

この記事では、アプリケーション サービス プリンシパルを使用する方法について説明します。 サービス プリンシパルの詳細については、「Microsoft Entra ID のアプリケーション オブジェクトとサービス プリンシパル オブジェクト」を参照してください。 この記事では、次のことについて説明します。

  • Microsoft Entraにアプリケーションを登録してサービス プリンシパルを作成する方法。
  • Microsoft Entra グループを使用してアクセス許可を効率的に管理する方法。
  • スコープのアクセス許可にロールを割り当てる方法。
  • アプリ コードからサービス プリンシパルを使用して認証する方法。

専用のアプリケーション サービス プリンシパルを使用すると、Azure リソースにアクセスするときに最小特権の原則に従うことができます。 開発中にアプリの特定の要件にアクセス許可を制限して、他のアプリやサービスを対象としたAzureリソースに誤ってアクセスするのを防ぐことができます。 この方法は、開発環境でアプリが過剰に特権を持たないようにすることで、アプリを運用環境に移行するときの問題を回避するのにも役立ちます。

ローカル Java アプリがサービス プリンシパルを使用して Azure リソースに接続する方法を示す図

Azureでアプリを登録すると、アプリケーション サービス プリンシパルが作成されます。 ローカル開発の場合は、次の手順を実行する必要があります。

  • 各開発者が独自のアプリケーション サービス プリンシパルを持ち、資格情報を共有する必要がないように、アプリで作業する開発者ごとに個別のアプリ登録を作成します。
  • アプリのアクセス許可を必要なもののみに制限するには、アプリごとに個別のアプリ登録を作成します。

ローカル開発時に、アプリケーション サービス プリンシパルの ID を使用して環境変数を設定します。 Azure ID ライブラリは、これらの環境変数を読み取って、必要なAzure リソースに対してアプリを認証します。

Azureにアプリを登録する

アプリケーション サービス プリンシパル オブジェクトは、Azure ポータルまたはAzure CLIを使用して、Azureのアプリ登録によって作成されます。

  1. Azure ポータルで、検索バーを使用して App registrations ページに移動します。

  2. App registrations ページで、+ 新規登録を選択します。

  3. アプリケーションの登録ページ」で、次の手順を実行します。

    • [] フィールドに、アプリ名とターゲット環境を含むわかりやすい値を入力します。
    • [サポートされているアカウントの種類] で、この組織のディレクトリ内のアカウントのみ (Microsoft Customer Led only - Single tenant (Microsoft カスタマー主導の場合のみ - シングル テナント)) を選択するか、要件に最も適したオプションを選択します。
  4. [登録] を選択してアプリを登録し、サービス プリンシパルを作成します。

    Azure portal でアプリ登録を作成する方法を示すスクリーンショット。

  5. アプリの [アプリ登録] ページで、アプリケーション (クライアント) IDDirectory (テナント) ID コピーし、後でアプリ コード構成で使用できるように一時的な場所に貼り付けます。

  6. [証明書またはシークレットの追加] を選択して、アプリの資格情報を設定します。

  7. [証明書 & シークレット] ページで、[+ 新しいクライアント シークレット] を選択します。

  8. 開いた [クライアント シークレットの追加] ポップアップ パネルで次の操作を実行します。

    • [説明] に、Current の値を入力します。
    • の [有効期限] の値は、既定値の 180 日間のままにします。
    • [追加] を選択してシークレットを追加します。
  9. 証明書 & シークレット ページで、クライアント シークレットの Value プロパティをコピーして、今後の手順で使用してください。

    クライアント シークレットの値は、アプリの登録が作成された後に 1 回だけ表示されます。 このクライアント シークレットを無効にすることなく、クライアント シークレットをさらに追加できますが、この値を再度表示する方法はありません。

ローカル開発用のMicrosoft Entra グループを作成する

個々のサービス プリンシパル オブジェクトにロールを割り当てるのではなく、アプリがローカル開発で必要とするロール (アクセス許可) をカプセル化するMicrosoft Entra グループを作成します。 この方法には、次の利点があります。

  • すべての開発者には、グループ レベルで同じロールが割り当てられます。
  • アプリに新しいロールが必要な場合は、アプリのグループにのみ追加する必要があります。
  • 新しい開発者がチームに参加すると、開発者用に新しいアプリケーション サービス プリンシパルが作成され、グループに追加され、開発者がアプリで作業するための適切なアクセス許可を持っている必要があります。
  1. Azure ポータルの Microsoft Entra ID 概要ページに移動します。

  2. 左側のメニューから [すべてのグループ ] を選択します。

  3. [ グループ ] ページで、[ 新しいグループ] を選択します。

  4. [ 新しいグループ ] ページで、次のフォーム フィールドに入力します。

    • グループの種類: [セキュリティ] を選択します。
    • グループ名: アプリ名または環境名への参照を含むグループの名前を入力します。
    • グループの説明: グループの目的を説明する説明を入力します。

    Azure portal でグループを作成する方法を示すスクリーンショット。

  5. [メンバー] の下の [メンバーが選択されていません] リンクを選択して、グループにメンバーを追加します。

  6. 開いたポップアップ パネルで、先ほど作成したサービス プリンシパルを検索し、フィルター処理された結果から選択します。 パネルの下部にある [選択 ] ボタンを選択して、選択内容を確認します。

  7. [新しいグループ] ページの下部にある [作成] を選択してグループを作成し、[すべてのグループ] ページに戻ります。 新しいグループが表示されない場合は、しばらく待ってからページを更新してください。

グループにロールを割り当てる

次に、アプリで必要なリソースのロール (アクセス許可) を決定し、作成したMicrosoft Entra グループにそれらのロールを割り当てます。 グループには、リソース、リソース グループ、またはサブスクリプション スコープでロールを割り当てることができます。 この例では、ほとんどのアプリですべてのAzureリソースが 1 つのリソース グループにグループ化されるため、リソース グループ スコープでロールを割り当てる方法を示します。

  1. Azure ポータルで、アプリを含むリソース グループの Overview ページに移動します。

  2. 左側のナビゲーションから アクセス制御 (IAM) を選択します。

  3. [ アクセス制御 (IAM)] ページで、[ + 追加 ] を選択し、ドロップダウン メニューから [ ロールの割り当ての追加 ] を選択します。 [ ロールの割り当ての追加] ページには、ロールを構成して割り当てるためのタブがいくつか用意されています。

  4. [ ロール ] タブで、検索ボックスを使用して、割り当てるロールを見つけます。 ロールを選択し、[ 次へ] を選択します。

  5. [メンバー] タブで、次の 手順 を実行します。

    • [ 値へのアクセスの割り当て] で、[ ユーザー、グループ、またはサービス プリンシパル ] を選択します。
    • [メンバー] の値で 、[+ メンバーの選択] を選択して、[メンバーの選択] ポップアップ パネルを開きます。
    • 先ほど作成したMicrosoft Entra グループを検索し、フィルター処理された結果から選択します。 [ 選択 ] を選択してグループを選択し、ポップアップ パネルを閉じます。
    • [メンバー] タブの下部にある [確認と割り当て] を選択します。

    Microsoft Entra グループにロールを割り当てる方法を示すスクリーンショット

  6. [ 校閲と割り当て ] タブで、ページの下部にある [校閲と割り当て ] を選択します。

アプリ環境変数を設定する

実行時に、DefaultAzureCredentialEnvironmentCredential など、ClientSecretCredentialの特定の資格情報で、環境変数の規則によってサービス プリンシパル情報を検索します。 Javaを使用する場合は、ツールと環境に応じてさまざまな方法で環境変数を構成できます。

選択した方法に関係なく、サービス プリンシパルに対して次の環境変数を構成します。

  • AZURE_CLIENT_ID: Azureで登録されているアプリを識別するために使用されます。
  • AZURE_TENANT_ID: Microsoft Entra テナントの ID。
  • AZURE_CLIENT_SECRET: アプリ用に生成されたシークレット資格情報。

~/.bashrcまたは~/.zshrc ファイルに次の行を追加します。 プレースホルダーの値を、アプリ登録の実際の値に置き換えます。

export AZURE_CLIENT_ID="<your-client-id>"
export AZURE_TENANT_ID="<your-tenant-id>"
export AZURE_CLIENT_SECRET="<your-client-secret>"

ファイルを編集した後、 source ~/.bashrc または source ~/.zshrc を実行して、現在のセッションに変更を適用します。

アプリからAzure サービスに対する認証

Azure Identity ライブラリは、さまざまなシナリオとMicrosoft Entraの認証フローをサポートする様々な資格情報の実装を提供します。 次の手順では、ローカルおよび運用環境でサービス プリンシパルを操作するときに ClientSecretCredential を使用する方法を示します。

コードを実装する

azure-identity ファイルにpom.xmlの依存関係を追加します。

<dependency>
    <groupId>com.azure</groupId>
    <artifactId>azure-identity</artifactId>
</dependency>

さまざまなAzure SDK クライアント ライブラリの特殊なクライアント クラスを使用して、Azure サービスにアクセスします。 アプリで Azure SDK クライアント オブジェクトを作成するJava コードの場合は、次の手順に従います。

  1. ClientSecretCredentialBuilder パッケージから com.azure.identity クラスをインポートします。
  2. ClientSecretCredentialClientSecretCredentialBuilder、およびtenantIdclientIdを使用して、clientSecret オブジェクトを作成します。
  3. ClientSecretCredential インスタンスを、Azure SDK クライアント オブジェクト ビルダーの credential メソッドに渡します。

この方法の例を次のコード セグメントに示します。

import com.azure.identity.ClientSecretCredential;
import com.azure.identity.ClientSecretCredentialBuilder;
import com.azure.storage.blob.BlobServiceClient;
import com.azure.storage.blob.BlobServiceClientBuilder;

String tenantId = System.getenv("AZURE_TENANT_ID");
String clientId = System.getenv("AZURE_CLIENT_ID");
String clientSecret = System.getenv("AZURE_CLIENT_SECRET");

ClientSecretCredential credential = new ClientSecretCredentialBuilder()
    .tenantId(tenantId)
    .clientId(clientId)
    .clientSecret(clientSecret)
    .build();

BlobServiceClient blobServiceClient = new BlobServiceClientBuilder()
    .endpoint("https://<account-name>.blob.core.windows.net")
    .credential(credential)
    .buildClient();

次のステップ

この記事では、サービス プリンシパルによる認証について説明しました。 この形式の認証は、JavaのAzure SDKで認証できるさまざまな方法の 1 つです。 次の記事では、認証のその他の方法について説明します。

サービス プリンシパル認証に関連する問題が発生した場合は、「 サービス プリンシパル認証のトラブルシューティング」を参照してください。

認証を習得した後、SDK によって提供されるログ機能の詳細については、 Azure SDK for Java のログ記録の構成を参照してください。