この記事では、Spring Cloud Azure認証方法について説明し、Azure リソースへのアクセスをセキュリティで保護するための適切な資格情報の種類を選択するのに役立ちます。
Microsoft Entra ID を使用した認証と承認
Microsoft Entra IDを使用すると、Azureロールベースのアクセス制御 (Azure RBAC) を使用して、セキュリティ プリンシパル (ユーザーまたはアプリケーション サービス プリンシパル) にアクセス許可を付与できます。 セキュリティ プリンシパル (ユーザーまたはアプリケーション) が Event Hubs リソースなどのAzure リソースにアクセスしようとすると、要求が承認される必要があります。 Microsoft Entra IDを使用すると、リソースへのアクセスは 2 段階のプロセスになります。
- まず、セキュリティ プリンシパルの ID を認証し、OAuth 2.0 トークンを返します。
- 次に、要求の一部としてトークンを Azure サービスに渡して、指定したリソースへのアクセスを承認します。
資格情報の種類
Spring Cloud Azureを使用すると、DefaultAzureCredential、WorkloadIdentityCredential、ManagedIdentityCredential、ClientSecretCredential、AzureCliCredentialなど、さまざまな資格情報の種類を認証用に構成できます。
DefaultAzureCredential
DefaultAzureCredential は、アプリケーションが Azure Cloud で実行されることを意図しているほとんどのシナリオに適しています。これは、次の資格情報を組み合わせたためです。
- デプロイ時の認証に一般的に使用される資格情報。
- 開発環境での認証に使用される資格情報。
手記
DefaultAzureCredentialは、一般的なシナリオを適切な既定の動作で処理することで、Azure SDKの使用を簡略化します。 より詳細な制御が必要な場合、または既定の設定でシナリオがサポートされていない場合は、他の種類の資格情報を使用します。
DefaultAzureCredential は、次のメカニズムを使用して順番に認証を試みます。
- 環境 -
DefaultAzureCredentialは、環境変数で指定されたアカウント情報を読み取り、それを使用して認証を試みます。 - マネージド ID - マネージド ID が有効になっているAzure ホストにアプリケーションがデプロイされている場合、
DefaultAzureCredentialはそのアカウントを使用して認証を試みます。 - ワークロード ID - アプリケーションが仮想マシン (VM) にデプロイされている場合、
DefaultAzureCredentialはそのアカウントを使用して認証を試みます。 - 共有トークン キャッシュ - Visual Studioで認証した場合、
DefaultAzureCredentialはそのアカウントを使用して認証を試みます。 - IntelliJ - Azure Toolkit for IntelliJ を使用して認証した場合、
DefaultAzureCredentialはそのアカウントを使用して認証を試みます。 - Azure CLI - Azure CLI
az loginコマンドを使用してアカウントを認証した場合、DefaultAzureCredentialはそのアカウントを使用して認証を試みます。 - Azure PowerShell - Azure PowerShellで認証した場合、
DefaultAzureCredentialはそのアカウントを使用して認証を試みます。 - Azure Developer CLI - Azure Developer CLI を使用して認証した場合、
DefaultAzureCredentialはそのアカウントを使用して認証を試みます。
先端
セキュリティ プリンシパルに、Azure リソースにアクセスするための十分なアクセス許可があることを確認します。 詳細については、「Microsoft Entra IDを使用してアクセスを承認する」を参照してください。
手記
Spring Cloud Azure AutoConfigure 4.1.0 以降、azure Identity によって作成されたすべてのスレッドを管理するには、ThreadPoolTaskExecutor という名前の springCloudAzureCredentialTaskExecutor Bean を登録する必要があります。 このスレッド プールによって管理される各スレッドの名前には、az-identity-がプレフィックスとして付けられます。 この ThreadPoolTaskExecutor Bean は、Spring Boot によって提供される Executor Bean とは独立しています。
マネージド ID
一般的な課題は、ソリューションを構成するさまざまなコンポーネント間の通信をセキュリティで保護するために使用されるシークレットと資格情報の管理です。 マネージド ID を使用すると、資格情報を管理する必要がなくなります。 マネージド ID は、Microsoft Entra 認証をサポートするリソースに接続するときにアプリケーションが使用する ID を提供します。 アプリケーションでは、マネージド ID を使用してMicrosoft Entraトークンを取得できます。 たとえば、アプリケーションはマネージド ID を使用して、セキュリティで保護された方法で資格情報を格納したり、ストレージ アカウントにアクセスしたりできるAzure Key Vaultなどのリソースにアクセスできます。
アプリケーションで接続文字列やキーを使用する代わりにマネージド ID を使用します。セキュリティが強化され、シークレットと資格情報を管理する手間が省かれるためです。 この場合、DefaultAzureCredentialは、ローカルに格納されているアカウント情報を使用してローカルで開発し、アプリケーションを Azure Cloud にデプロイし、マネージド ID を使用するシナリオに適しています。
マネージド ID の種類
マネージド ID には、次の 2 種類があります。
- システム割り当て - 一部の Azure サービスでは、サービス インスタンスでマネージド ID を直接有効にすることができます。 システム割り当てマネージド ID を有効にすると、そのサービス インスタンスのライフサイクルにバインドMicrosoft Entraに ID を作成します。 そのため、リソースを削除すると、Azure によって自動的に ID が削除されます。 設計上、この ID を使用して Microsoft Entra ID からトークンを要求できるのは、その Azure リソースだけです。
- ユーザー割り当て - マネージド ID をスタンドアロン Azure リソースとして作成することもできます。 ユーザー割り当てマネージド ID を作成し、Azure サービスの 1 つ以上のインスタンスに割り当てることができます。 ユーザー割り当てマネージド ID では、ID を使用するリソースとは別に ID を管理します。
手記
ユーザー割り当てマネージド ID を使用する場合は、 spring.cloud.azure.credential.client-id または spring.cloud.azure.<azure-service>.credential.client-idを使用してクライアント ID を指定します。 システム割り当てマネージド ID を使用する場合、資格情報の構成は必要ありません。
先端
Azure リソースにアクセスするには、セキュリティ プリンシパルに十分なアクセス許可があることを確認します。 詳細については、「Microsoft Entra IDを使用してアクセスを承認する」を参照してください。
マネージド ID の詳細については、「Azure リソースのマネージド ID とは」を参照してください。.
その他の資格情報の種類
DefaultAzureCredentialによって提供されるよりも詳細な制御が必要な場合、または既定の設定でシナリオがサポートされていない場合は、他の資格情報の種類を使用します。
Microsoft Entra ID で認証する
Microsoft Entra認証をサポートするリソースにアプリケーションを接続するには、プレフィックスspring.cloud.azure.credentialまたはspring.cloud.azure.<azure-service>.credentialで次の構成を設定します。
次の表に、認証プロパティの一覧を示します。
| 財産 | 形容 |
|---|---|
client-id |
Azure でサービス プリンシパル認証を実行するときに使用するクライアント ID。 |
client-secret |
Azure でサービス プリンシパル認証を実行するときに使用するクライアント シークレット。 |
client-certificate-path |
Azure でサービス プリンシパル認証を実行するときに使用する PEM 証明書ファイルのパス。 |
client-certificate-password |
証明書ファイルのパスワード。 |
username |
Azure でユーザー名/パスワード認証を実行するときに使用するユーザー名。 |
password |
Azure でユーザー名/パスワード認証を実行するときに使用するパスワード。 |
managed-identity-enabled |
マネージド ID を有効にするかどうか。 |
token-credential-bean-name |
Azure で認証を実行するときに使用する TokenCredential 型の Bean 名。 |
先端
Spring Cloud Azure のすべての構成プロパティの一覧については、「Spring Cloud Azure 構成プロパティ
アプリケーションは複数の場所を検索して、使用可能な資格情報を見つけます。 各Azure SDKクライアント ビルダー ファクトリは、プロパティ token-credential-bean-nameを指定した場合は最初にTokenCredential型のカスタム Bean を採用し、資格情報プロパティを構成しない場合はDefaultAzureCredentialを使用するようにフォールバックします。
カスタマイズされた TokenCredential Bean を使用して認証する
次の例は、認証を行うカスタム TokenCredential Bean を定義する方法を示しています。
@Bean
TokenCredential myTokenCredential() {
// Your concrete TokenCredential instance
}
spring.cloud.azure:
credential:
token-credential-bean-name: myTokenCredential
システム割り当てマネージド ID を使用して認証する
次の例は、システム割り当てマネージド ID を使用して認証する方法を示しています。
spring.cloud.azure:
credential:
managed-identity-enabled: true
ユーザー割り当てマネージド ID を使用して認証する
次の例は、ユーザー割り当てマネージド ID を使用して認証する方法を示しています。
spring.cloud.azure:
credential:
managed-identity-enabled: true
client-id: ${AZURE_CLIENT_ID}
クライアント シークレットでサービス プリンシパルを使用して認証する
次の例は、クライアント シークレットでサービス プリンシパルを使用して認証する方法を示しています。
spring.cloud.azure:
credential:
client-id: ${AZURE_CLIENT_ID}
client-secret: ${AZURE_CLIENT_SECRET}
profile:
tenant-id: <tenant>
手記
tenant-id に使用できる値は、common、organizations、consumers、またはテナント ID です。 これらの値の詳細については、「id プロバイダーからのユーザー アカウントがテナント に存在しないエラー AADSTS50020 - ユーザー アカウントが存在しない 間違ったエンドポイント (個人および組織のアカウント) セクションを参照してください。 シングルテナント アプリの変換の詳細については、「Microsoft Entra IDでのシングルテナント アプリをマルチテナントに変換する」を参照してください。
クライアント証明書でサービス プリンシパルを使用して認証する
次の例は、クライアント PFX 証明書でサービス プリンシパルを使用して認証する方法を示しています。
spring.cloud.azure:
credential:
client-id: ${AZURE_CLIENT_ID}
client-certificate-path: ${AZURE_CLIENT_CERTIFICATE_PATH}
client-certificate-password: ${AZURE_CLIENT_CERTIFICATE_PASSWORD}
profile:
tenant-id: <tenant>
手記
tenant-id に使用できる値は、common、organizations、consumers、またはテナント ID です。 これらの値の詳細については、「id プロバイダーからのユーザー アカウントがテナント に存在しないエラー AADSTS50020 - ユーザー アカウントが存在しない 間違ったエンドポイント (個人および組織のアカウント) セクションを参照してください。 シングルテナント アプリの変換の詳細については、「Microsoft Entra IDでのシングルテナント アプリをマルチテナントに変換する」を参照してください。
次の例は、クライアント PEM 証明書でサービス プリンシパルを使用して認証する方法を示しています。
spring.cloud.azure:
credential:
client-id: ${AZURE_CLIENT_ID}
client-certificate-path: ${AZURE_CLIENT_CERTIFICATE_PATH}
profile:
tenant-id: <tenant>
手記
tenant-id に使用できる値は、common、organizations、consumers、またはテナント ID です。 これらの値の詳細については、「id プロバイダーからのユーザー アカウントがテナント に存在しないエラー AADSTS50020 - ユーザー アカウントが存在しない 間違ったエンドポイント (個人および組織のアカウント) セクションを参照してください。 シングルテナント アプリの変換の詳細については、「Microsoft Entra IDでのシングルテナント アプリをマルチテナントに変換する」を参照してください。
ユーザー資格情報を使用して認証する
次の例は、ユーザー資格情報を使用して認証する方法を示しています。
spring.cloud.azure:
credential:
client-id: ${AZURE_CLIENT_ID}
username: ${AZURE_USER_USERNAME}
password: ${AZURE_USER_PASSWORD}
他のユーザーとは異なる資格情報を使用してサービスを認証する
次の例は、別のサービス プリンシパルを使用してKey Vaultで認証する方法を示しています。 この例では、システム割り当てマネージド ID とサービス プリンシパルの 2 つの資格情報を使用してアプリケーションを構成します。 Key Vault シークレット クライアントはサービス プリンシパルを使用しますが、他のコンポーネントでは代わりにマネージド ID が使用されます。
spring.cloud.azure:
credential:
managed-identity-enabled: true
keyvault.secret:
credential:
client-id: ${AZURE_CLIENT_ID}
client-secret: ${AZURE_CLIENT_SECRET}
profile:
tenant-id: <tenant>
手記
tenant-id に使用できる値は、common、organizations、consumers、またはテナント ID です。 これらの値の詳細については、「id プロバイダーからのユーザー アカウントがテナント に存在しないエラー AADSTS50020 - ユーザー アカウントが存在しない 間違ったエンドポイント (個人および組織のアカウント) セクションを参照してください。 シングルテナント アプリの変換の詳細については、「Microsoft Entra IDでのシングルテナント アプリをマルチテナントに変換する」を参照してください。
Microsoft Entra ID を使用してアクセスを承認する
承認手順では、セキュリティ プリンシパルに 1 つ以上のAzure ロールを割り当てる必要があります。 セキュリティ プリンシパルに割り当てるロールによって、プリンシパルに付与されるアクセス許可が決まります。
先端
すべての Azure 組み込みロールの一覧については、「Azure 組み込みロールの」を参照してください。
次の表に、Spring Cloud Azure でサポートされている Azure サービスへのアクセスを承認するための Azure 組み込みロールを示します。
| 役割 | 形容 |
|---|---|
| アプリ構成データの所有者 | App Configuration データへのフル アクセスを許可します。 |
| アプリ構成データ閲覧者 | App Configuration データへの読み取りアクセスを許可します。 |
| Azure Event Hubs データ所有者 の |
Azure Event Hubs リソースへのフル アクセスを許可します。 |
| Azure Event Hubs データ レシーバー の |
Azure Event Hubs リソースへの受信アクセスを許可します。 |
| Azure Event Hubs データ送信者 の |
Azure Event Hubs リソースへの送信アクセスを許可します。 |
| Azure Service Bus データ所有者 の |
Azure Service Bus リソースへのフル アクセスを許可します。 |
| Azure Service Bus データ レシーバー の |
Azure Service Bus リソースへの受信アクセスを許可します。 |
| Azure Service Bus データ送信者 の |
Azure Service Bus リソースへの送信アクセスを許可します。 |
| ストレージ BLOB データ所有者 の |
POSIX アクセス制御の割り当てを含め、Azure Storage BLOB コンテナーとデータへのフル アクセスを提供します。 |
| Storage BLOB データ 閲覧者の | Azure Storage のコンテナーと BLOB の読み取りと一覧表示。 |
| ストレージ キュー データ リーダー | Azure Storage キューとキュー メッセージの読み取りと一覧表示。 |
| Redis Cache 共同作成者 | Redis キャッシュを管理します。 |
手記
Spring Cloud Azure Resource Managerを使用して Event Hubs、Service Bus、Storage Queue の接続文字列、または Cache for Redis のプロパティを取得する場合は、Azure組み込みロールContributorを割り当てます。 Azure Cache for Redis は特別なものであり、Redis Cache Contributor ロールを割り当てて Redis のプロパティを取得することもできます。
手記
Key Vault アクセス ポリシーは、特定のセキュリティ プリンシパル (ユーザー、アプリケーション、またはユーザー グループ) が、Key Vaultシークレット、キー、証明書に対して異なる操作を実行できるかどうかを決定します。 Azure ポータル、Azure CLI、またはAzure PowerShellを使用して、アクセス ポリシーを割り当てることができます。 詳細については、「Key Vault アクセス ポリシー割り当てる」を参照してください。
大事な
Azure Cosmos DB では、Cosmos DB Built-in Data Reader と Cosmos DB Built-in Data Contributorの 2 つの組み込みロール定義が公開されています。 ただし、ロール管理に対する Azure portal のサポートはまだ利用できません。 アクセス許可モデル、ロール定義、ロールの割り当ての詳細については、「Azure Cosmos DB アカウントの Microsoft Entra ID を使用してロールベースのアクセス制御を構成する」を参照してください。
SAS トークンを使用した認証
Shared Access Signature (SAS) を使用して、認証用のサービスを構成することもできます。
spring.cloud.azure.<azure-service>.sas-token プロパティを使用して、この認証を構成します。 たとえば、 spring.cloud.azure.storage.blob.sas-token を使用してストレージ BLOB サービスに対する認証を行います。
接続文字列を使用した認証
一部のAzure サービスでは、接続文字列をサポートして、接続情報と資格情報を提供します。 接続文字列を使用してこれらのAzure サービスに接続するには、spring.cloud.azure.<azure-service>.connection-stringを構成します。 たとえば、Event Hubs サービスに接続するように spring.cloud.azure.eventhubs.connection-string を構成します。