Azure でホストされる Java アプリケーションを認証する

この記事では、Azure でホストされているアプリケーションの Microsoft Entra トークン認証が、Azure Identity ライブラリによってどのようにサポートされているかについて説明します。 このサポートは、この記事で説明する一連の TokenCredential 実装によって可能になります。

この記事に含まれるサブジェクトは次のとおりです。

Azure でホストされるアプリケーションに関連する認証の問題のトラブルシューティングについては、「Azure でホストされるアプリケーション認証のトラブルシューティング」を参照してください。

既定の Azure 資格情報

DefaultAzureCredential は、アプリケーションが最終的に Azure Cloud で実行されるほとんどのシナリオに適しています。 DefaultAzureCredential は、デプロイ時に認証によく使用される資格情報と、開発環境での認証に使用される資格情報を組み合わせたものです。 DefaultAzureCredential により、次のメカニズムを介して順番に認証を試行します。

DefaultAzureCredential authentication flow

  • 環境 - DefaultAzureCredential は、環境変数で指定されたアカウント情報を読み取り、それを使用して認証を行います。
  • マネージド ID - マネージド ID が有効になっている Azure ホストにアプリケーションがデプロイされている場合、DefaultAzureCredential はそのアカウントを使用して認証を行います。
  • IntelliJ - Azure Toolkit for IntelliJ 経由で認証した場合、DefaultAzureCredential はそのアカウントを使用して認証を行います。
  • Visual Studio Code - Visual Studio Code Azure Account プラグインを使用して認証した場合、DefaultAzureCredential はそのアカウントを使用して認証を行います。
  • Azure CLI - Azure CLI の az login コマンドを使用してアカウントを認証した場合、DefaultAzureCredential はそのアカウントを使用して認証を行います。

DefaultAzureCredential を構成する

DefaultAzureCredential は、DefaultAzureCredentialBuilder のセッターまたは環境変数による一連の構成をサポートしています。

  • 環境変数で定義されているように環境変数 AZURE_CLIENT_IDAZURE_CLIENT_SECRET、および AZURE_TENANT_ID を設定することで、それらの値によって指定されたサービス プリンシパルとして認証するように DefaultAzureCredential が構成されます。
  • ビルダーで .managedIdentityClientId(String)、または環境変数 AZURE_CLIENT_ID を設定すると、DefaultAzureCredential はユーザー定義マネージド ID として認証するように構成され、これらを空のままにしておくと、システム割り当てマネージド ID として認証するように構成されます。
  • ビルダーで .tenantId(String)、たは環境変数 AZURE_TENANT_ID を設定すると、DefaultAzureCredential は共有トークン キャッシュ、Visual Studio Code、IntelliJ IDEA 用の特定のテナントに対して認証するように構成されます。
  • 環境変数 AZURE_USERNAME を設定すると、DefaultAzureCredential は、共有トークンキャッシュから対応するキャッシュされたトークンを選択するように構成されます。
  • ビルダーで .intelliJKeePassDatabasePath(String) を設定すると、DefaultAzureCredential は IntelliJ 資格情報で認証するときに特定の KeePass ファイルを読み取るように構成されます。

DefaultAzureCredential を使用して認証する

次の例では、azure-security-keyvault-secrets クライアント ライブラリの SecretClient を、DefaultAzureCredential を使用して認証する場合を示しています。

// Azure SDK client builders accept the credential as a parameter.
SecretClient client = new SecretClientBuilder()
  .vaultUrl("https://<your Key Vault name>.vault.azure.net")
  .credential(new DefaultAzureCredentialBuilder().build())
  .buildClient();

DefaultAzureCredential を使用してユーザー割り当てマネージド ID を認証する

次の例は、ユーザー割り当てマネージド ID が構成された Azure リソースにデプロイされた DefaultAzureCredential を使用する azure-security-keyvault-secrets クライアントから SecretClient を認証することを示しています。

/**
 * The default credential uses the user-assigned managed identity with the specified client ID.
 */
DefaultAzureCredential defaultCredential = new DefaultAzureCredentialBuilder()
  .managedIdentityClientId("<managed identity client ID>")
  .build();

// Azure SDK client builders accept the credential as a parameter.
SecretClient client = new SecretClientBuilder()
  .vaultUrl("https://<your Key Vault name>.vault.azure.net")
  .credential(defaultCredential)
  .buildClient();

DefaultAzureCredential を使用して Azure Toolkit for IntelliJ でユーザーを認証する

次の例では、IntelliJ IDEA がインストールされ、ユーザーが Azure アカウントを使用して Azure Toolkit for IntelliJ にサイン インしたワークステーション上で、DefaultAzureCredential を使用して azure-security-keyvault-secrets クライアント ライブラリから SecretClient を認証することを示しています。

IntelliJ IDEA の構成の詳細については、「IntelliJCredential を目的とした Azure Toolkit for IntelliJ へのサインイン」を参照してください。

/**
 * The default credential uses the KeePass database path to find the user account in IntelliJ on Windows.
 */
// KeePass configuration is required only for Windows. No configuration needed for Linux / Mac.
DefaultAzureCredential defaultCredential = new DefaultAzureCredentialBuilder()
  .intelliJKeePassDatabasePath("C:\\Users\\user\\AppData\\Roaming\\JetBrains\\IdeaIC2020.1\\c.kdbx")
  .build();

// Azure SDK client builders accept the credential as a parameter.
SecretClient client = new SecretClientBuilder()
  .vaultUrl("https://<your Key Vault name>.vault.azure.net")
  .credential(defaultCredential)
  .buildClient();

マネージド ID 資格情報

マネージド ID は、Azure リソースのマネージド ID (システムまたはユーザー割り当て) を認証します。 そのため、アプリケーションが、IDENTITY/MSIIMDS エンドポイント、またはその両方によってマネージド ID をサポートする Azure リソース内で実行されている場合、この資格情報によってアプリケーションが認証され、シークレットを使用しない優れた認証エクスペリエンスが提供されます。

詳細については、「Azure リソースのマネージド ID とは」を参照してください。

マネージド ID を使用して Azure で認証する

次の例では、システム割り当てまたはユーザー割り当てのマネージド ID を有効にして、Azure 上の仮想マシン、アプリ サービス、関数アプリ、Cloud Shell、サービス ファブリック、Arc、または AKS 環境の ManagedIdentityCredential を使用して、azure-security-keyvault-secrets クライアント ライブラリから SecretClient を認証することを示しています。

/**
 * Authenticate with a managed identity.
 */
ManagedIdentityCredential managedIdentityCredential = new ManagedIdentityCredentialBuilder()
  .clientId("<user-assigned managed identity client ID>") // required only for user-assigned
  .build();

// Azure SDK client builders accept the credential as a parameter.
SecretClient client = new SecretClientBuilder()
  .vaultUrl("https://<your Key Vault name>.vault.azure.net")
  .credential(managedIdentityCredential)
  .buildClient();

環境変数

環境変数を使用して DefaultAzureCredentialEnvironmentCredential を構成できます。 認証の種類ごとに、特定の変数の値が必要です。

シークレットを持つサービス プリンシパル

変数名
AZURE_CLIENT_ID Microsoft Entra アプリケーションの ID。
AZURE_TENANT_ID アプリケーションの Microsoft Entra テナントの ID。
AZURE_CLIENT_SECRET アプリケーションのクライアント シークレットの 1 つ。

証明書を使用したサービス プリンシパル

変数名
AZURE_CLIENT_ID Microsoft Entra アプリケーションの ID。
AZURE_TENANT_ID アプリケーションの Microsoft Entra テナントの ID。
AZURE_CLIENT_CERTIFICATE_PATH (パスワード保護のない) 秘密キーを含む、PEM でエンコードされた証明書ファイルへのパス。

ユーザー名とパスワード

変数名
AZURE_CLIENT_ID Microsoft Entra アプリケーションの ID。
AZURE_USERNAME ユーザー名 (通常は電子メール アドレス)。
AZURE_PASSWORD 指定されたユーザー名に関連するパスワード。

構成はこの順序で試行されます。 たとえば、クライアント シークレットと証明書の値が両方存在する場合、クライアント シークレットが使用されます。

次のステップ

この記事では、Azure でホストされるアプリケーションの認証について説明しました。 この形式の認証は、Azure SDK for Java で可能な認証方法のうちの 1 つです。 次の記事では、他の方法について説明します。

Azure でホストされるアプリケーション認証に関連する問題に直面した場合は、「Azure がホストするアプリケーション認証のトラブルシューティング」を参照してください。

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