Share via


Spring Cloud Azure 認証

この記事の対象: ✔️ バージョン 4.14.0 ✔️ バージョン 5.8.0

この記事では、Spring Cloud Azure のすべての認証方法について説明します。

DefaultAzureCredential

DefaultAzureCredential は、アプリケーションを Azure Cloud で実行することを目的とするほとんどのシナリオに適しています。 これは、一般的にデプロイ時の認証に使用される資格情報と、開発環境での認証に使用される資格情報が組み合わせて DefaultAzureCredential に使用されているためです。

Note

DefaultAzureCredential は、適切な既定の動作で一般的なシナリオを処理して、SDK の使用を簡略化することを目的としています。 より多くの制御が必要な場合や、シナリオが既定の設定で提供されない場合は、他の資格情報の種類を使用する必要があります。

DefaultAzureCredential により、次のメカニズムを介して認証が試行されます。

Diagram showing the authentication mechanism for `DefaultAzureCredential`.

  • 環境 - 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 はそのアカウントを使用して認証を行います。

ヒント

セキュリティ プリンシパルに、Azure リソースにアクセスするための十分なアクセス許可が付与されていることを確認します。 詳細については、「Microsoft Entra ID を使用してアクセスを承認する」を参照してください。

Note

Spring Cloud Azure AutoConfigure 4.1.0 以降では、springCloudAzureCredentialTaskExecutor という名前の ThreadPoolTaskExecutor Bean が既定で自動的に登録され、Azure Identity によって作成されたすべてのスレッドを管理します。 このスレッド プールによって管理される各スレッドの名前には、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 が作成されます。 したがって、リソースが削除されると、その ID も Azure によって自動的に削除されます。 その ID を使用して Microsoft Entra ID にトークンを要求できるのは、必然的に、その Azure リソースのみとなります。
  • ユーザー割り当て - スタンドアロンの Azure リソースとしてマネージド ID を自分で作成することもできます。 ユーザー割り当てマネージド ID を作成して、それを Azure サービスの 1 つまたは複数のインスタンスに割り当てることができます。 ユーザー割り当てマネージド ID では、ID は、それを使用するリソースとは別に管理されます。

Note

ユーザー割り当てマネージド ID を使用する場合、spring.cloud.azure.credential.managed-identity-client-id または spring.cloud.azure.<azure-service>.credential.managed-identity-client-id を使用してクライアント ID を指定できます。 システム割り当てマネージド ID を使用する場合は、資格情報の構成は必要ありません。

ヒント

セキュリティ プリンシパルに、Azure リソースにアクセスするための十分なアクセス許可が付与されていることを確認します。 詳細については、「Microsoft Entra ID を使用してアクセスを承認する」を参照してください。

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

その他の資格情報の種類

より多くの制御が必要な場合や、シナリオが既定のDefaultAzureCredential 設定で提供されない場合は、他の資格情報の種類を使用する必要があります。

Microsoft Entra ID での認証と承認

Microsoft Entra ID では、Azure ロールベースのアクセス制御 (Azure RBAC) を使用して、セキュリティ プリンシパル (ユーザーまたはアプリケーションのサービス プリンシパルである可能性があります) にアクセス許可を付与できます。 セキュリティ プリンシパル (ユーザーまたはアプリケーション) が Event Hubs リソースなどの Azure リソースにアクセスしようとした場合、要求は承認される必要があります。 Microsoft Entra ID では、リソースへのアクセスは 2 段階のプロセスです。

  1. まず、セキュリティ プリンシパルの ID が "認証" され、OAuth 2.0 トークンが返されます。
  2. 次に、指定したリソースにアクセスする承認を得るため、Azure サービスへの要求の一部としてトークンを渡します。

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 を有効にするかどうか。

ヒント

すべての Spring Cloud Azure 構成プロパティの一覧については、「Spring Cloud Azure 構成プロパティ」を参照してください。

アプリケーションは、使用できる資格情報を見つけるために複数の場所を検索し、資格情報のプロパティが構成されていない場合は DefaultAzureCredential を使います。 特定の資格情報を使う場合は、ガイダンスとして次の例を参考にしてください。

次の例は、システム割り当てマネージド ID を使って認証する方法を示しています。

spring.cloud.azure:
  credential:
    managed-identity-enabled: true

次の例は、ユーザー割り当てマネージド 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>

Note

使用できる tenant-id 値は、次のとおりです。 commonorganizationsconsumers、またはテナント ID です。 これらの値の詳細については、「エラー AADSTS50020 - ID プロバイダーのユーザー アカウントがテナントに存在しない」の「間違ったエンドポイント (個人アカウントと組織アカウント) を使用する」セクションを参照してください。 シングルテナント アプリの変換の詳細については、「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>

Note

使用できる tenant-id 値は、次のとおりです。 commonorganizationsconsumers、またはテナント ID です。 これらの値の詳細については、「エラー AADSTS50020 - ID プロバイダーのユーザー アカウントがテナントに存在しない」の「間違ったエンドポイント (個人アカウントと組織アカウント) を使用する」セクションを参照してください。 シングルテナント アプリの変換の詳細については、「Microsoft Entra ID でシングルテナント アプリをマルチテナントに変換する」を参照してください

次の例は、サービス プリンシパルとクライアント PEM 証明書を使って認証する方法を示しています。

spring.cloud.azure:
  credential:
    client-id: ${AZURE_CLIENT_ID}
    client-certificate-path: ${AZURE_CLIENT_CERTIFICATE_PATH}
  profile:
    tenant-id: <tenant>

Note

使用できる tenant-id 値は、次のとおりです。 commonorganizationsconsumers、またはテナント ID です。 これらの値の詳細については、「エラー AADSTS50020 - ID プロバイダーのユーザー アカウントがテナントに存在しない」の「間違ったエンドポイント (個人アカウントと組織アカウント) を使用する」セクションを参照してください。 シングルテナント アプリの変換の詳細については、「Microsoft Entra ID でシングルテナント アプリをマルチテナントに変換する」を参照してください

次の例は、ユーザー資格情報を使って認証する方法を示しています。

spring.cloud.azure:
  credential:
    client-id: ${AZURE_CLIENT_ID}
    username: ${AZURE_USER_USERNAME}
    password: ${AZURE_USER_PASSWORD}

次の例は、別のサービス プリンシパルを使い、Key Vault で認証する方法を示しています。 この例では、2 つの資格情報 (1 つのシステム割り当てマネージド ID と 1 つのサービス プリンシパル) を使ってアプリケーションを構成します。 Key Vault Secret クライアントにはサービス プリンシパルが使われますが、他のコンポーネントには代わりにマネージド 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>

Note

使用できる tenant-id 値は、次のとおりです。 commonorganizationsconsumers、またはテナント ID です。 これらの値の詳細については、「エラー AADSTS50020 - ID プロバイダーのユーザー アカウントがテナントに存在しない」の「間違ったエンドポイント (個人アカウントと組織アカウント) を使用する」セクションを参照してください。 シングルテナント アプリの変換の詳細については、「Microsoft Entra ID でシングルテナント アプリをマルチテナントに変換する」を参照してください

Microsoft Entra ID を使用してアクセスを認可する

承認の手順では、セキュリティ プリンシパルに 1 つまたは複数の Azure ロールを割り当てる必要があります。 セキュリティ プリンシパルに割り当てられたロールによって、そのプリンシパルが持つアクセス許可が決定されます。

ヒント

すべての Azure 組み込みロールの一覧については、Azure の組み込みロールに関するページを参照してください。

次の表に、Spring Cloud Azure でサポートされている Azure サービスへのアクセスを承認するための Azure 組み込みロールを示します。

ロール 説明
App Configuration データ所有者 App Configuration データへのフル アクセスを許可します。
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 データ所有者 Azure Storage Blob コンテナーとデータに対するフル アクセス (POSIX アクセスの制御の割り当てを含む) を提供します。
ストレージ BLOB データ閲覧者 Azure Storage コンテナーと BLOB の読み取りと一覧表示を行います。
ストレージ キュー データ閲覧者 Azure Storage キューおよびキュー メッセージの読み取りと一覧表示を行います。
Redis Cache Contributor Redis キャッシュを管理します。

Note

Spring Cloud Azure Resource Manager を使用して Event Hubs、Service Bus、Storage Queue の接続文字列、または Cache for Redis のプロパティを取得する場合は、Azure 組み込みロール Contributor を割り当てます。 Azure Cache for Redis は特殊であり、Redis プロパティを取得するために Redis Cache Contributor ロールを割り当てることもできます。

Note

Key Vault アクセス ポリシーは、特定のセキュリティ プリンシパル (ユーザー、アプリケーション、またはユーザー グループ) が、Key Vault のシークレット、キー、および証明書に対して、さまざまな操作を実行できるかどうかを決定します。 アクセス ポリシーは、Azure portal、Azure CLI、または Azure PowerShell を使用して割り当てることができます。 詳細については、キー コンテナーへのアクセス ポリシーの割り当てに関するページを参照してください。

重要

Azure Cosmos DB では、Cosmos DB Built-in Data ReaderCosmos 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 を使用して Storage Blob サービスを認証します。

Connection strings

一部の Azure サービスでは、接続情報と資格情報を提供するために接続文字列がサポートされています。 接続文字列を使用してこれらの Azure サービスに接続するには、spring.cloud.azure.<azure-service>.connection-string を構成します。 たとえば、Event Hubs サービスに接続するように spring.cloud.azure.eventhubs.connection-string を構成します。