オンプレミスやサードパーティのデータ センターなど、Azureの外部でホストされているアプリでは、Microsoft Entra ID を介してアプリケーション サービス プリンシパルを使用してAzure サービスに対する認証を行う必要があります。 次のセクションでは、以下について学習します。
- Microsoft Entraにアプリケーションを登録してサービス プリンシパルを作成する方法。
- スコープのアクセス許可にロールを割り当てる方法。
- アプリ コードからサービス プリンシパルを使用して認証する方法。
専用のアプリケーション サービス プリンシパルを使用すると、Azureリソースにアクセスするときの最小特権の原則に従うことができます。 他のアプリまたはサービスを対象としたAzureリソースへの誤ったアクセスを防ぐために、開発中にアプリの特定の要件にアクセス許可を制限します。 この方法は、開発環境でアプリが過剰に特権を持たないようにすることで、アプリを運用環境に移行するときの問題を回避するのにも役立ちます。
アプリをホストする環境ごとに異なるアプリ登録を作成します。 サービス プリンシパルごとに環境固有のリソースアクセス許可を構成し、ある環境にデプロイされたアプリが別の環境のAzureリソースにアクセスしないようにすることができます。
Azureにアプリを登録する
アプリケーション サービス プリンシパル オブジェクトは、Azure ポータルまたはAzure CLIを使用して、Azureのアプリ登録によって作成されます。
Azure ポータルで、検索バーを使用して App registrations ページに移動します。
App registrations ページで、+ 新規登録を選択します。
「アプリケーションの登録ページ」で、次の手順を実行します。
- [名] フィールドに、アプリ名とターゲット環境を含むわかりやすい値を入力します。
- [サポートされているアカウントの種類] で、この組織のディレクトリ内のアカウントのみ (Microsoft Customer Led only - Single tenant (Microsoft カスタマー主導の場合のみ - シングル テナント)) を選択するか、要件に最も適したオプションを選択します。
[登録] を選択してアプリを登録し、サービス プリンシパルを作成します。
アプリの [アプリ登録] ページで、アプリケーション (クライアント) ID と Directory (テナント) ID コピーし、後でアプリ コード構成で使用できるように一時的な場所に貼り付けます。
[証明書またはシークレットの追加] を選択して、アプリの資格情報を設定します。
[証明書 & シークレット] ページで、[+ 新しいクライアント シークレット] を選択します。
開いた [クライアント シークレットの追加] ポップアップ パネルで次の操作を実行します。
- [ 説明] に、
Currentの値を入力します。 -
[有効期限] の値には、既定の推奨値である
180 daysのままにします。 - [追加] を選択してシークレットを追加します。
- [ 説明] に、
証明書 & シークレット ページで、クライアント シークレットの Value プロパティをコピーして、今後の手順で使用してください。
注
クライアント シークレットの値は、アプリの登録が作成された後に 1 回だけ表示されます。 このクライアント シークレットを無効にすることなく、クライアント シークレットをさらに追加できますが、この値を再度表示する方法はありません。
アプリケーション サービス プリンシパルにロールを割り当てる
次に、どのリソースに対してアプリに必要なロール (アクセス許可) を決定し、作成したサービス プリンシパルにそれらのロールを割り当てます。 ロールは、リソース、リソース グループ、またはサブスクリプション スコープで割り当てることができます。 この例では、ほとんどのアプリですべてのAzureリソースが 1 つのリソース グループにグループ化されるため、リソース グループ スコープでロールを割り当てる方法を示します。
Azure ポータルで、アプリを含むリソース グループの Overview ページに移動します。
左側のナビゲーションから アクセス制御 (IAM) を選択します。
[ アクセス制御 (IAM)] ページで、[ + 追加 ] を選択し、ドロップダウン メニューから [ ロールの割り当ての追加 ] を選択します。 [ ロールの割り当ての追加] ページには、ロールを構成して割り当てるためのタブがいくつか用意されています。
[ ロール ] タブで、検索ボックスを使用して、割り当てるロールを見つけます。 ロールを選択し、[ 次へ] を選択します。
[メンバー] タブで、次の 手順 を実行します。
- [ 値へのアクセスの割り当て] で、[ ユーザー、グループ、またはサービス プリンシパル ] を選択します。
- [メンバー] の値で 、[+ メンバーの選択] を選択して、[メンバーの選択] ポップアップ パネルを開きます。
- 先ほど作成したサービス プリンシパルを検索し、フィルター処理された結果から選択します。 [ 選択 ] を選択してグループを選択し、ポップアップ パネルを閉じます。
- [メンバー] タブの下部にある [確認と割り当て] を選択します。
[ 校閲と割り当て ] タブで、ページの下部にある [校閲と割り当て ] を選択します。
アプリ環境変数を設定する
実行時に、、DefaultAzureCredential、EnvironmentCredential など、ClientSecretCredentialの特定の資格情報で、環境変数の規則によってサービス プリンシパル情報を検索します。 Javaを使用する場合は、ツールと環境に応じて、複数の方法で環境変数を構成できます。
選択した方法に関係なく、サービス プリンシパルに対して次の環境変数を構成します。
-
AZURE_CLIENT_ID: Azureで登録されているアプリを識別するために使用されます。 -
AZURE_TENANT_ID: Microsoft Entra テナントの ID。 -
AZURE_CLIENT_SECRET: アプリ用に生成されたシークレット資格情報。
以下の環境変数を設定します。 プレースホルダーの値を、アプリ登録の実際の値に置き換えます。
export AZURE_CLIENT_ID="<your-client-id>"
export AZURE_TENANT_ID="<your-tenant-id>"
export AZURE_CLIENT_SECRET="<your-client-secret>"
運用サーバーで systemd サービスとして実行されているJava アプリケーションの場合は、ファイル内の環境変数を定義し、サービス ユニット ファイルの EnvironmentFile ディレクティブを使用して参照します。
[Unit]
Description=Java application service
After=network.target
[Service]
User=app-user
WorkingDirectory=/path/to/java-app
EnvironmentFile=/path/to/java-app/app-environment-variables
ExecStart=/usr/bin/java -jar app.jar
[Install]
WantedBy=multi-user.target
環境ファイルには、環境変数とその値の一覧が含まれている必要があります。
AZURE_CLIENT_ID=<your-client-id>
AZURE_TENANT_ID=<your-tenant-id>
AZURE_CLIENT_SECRET=<your-client-secret>
アプリから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 コードの場合は、次の手順に従います。
-
ClientSecretCredentialBuilderパッケージからcom.azure.identityクラスをインポートします。 -
ClientSecretCredential、ClientSecretCredentialBuilder、およびtenantIdでclientIdを使用して、clientSecretオブジェクトを作成します。 -
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();