Spring Cloud Azure シークレット管理
この記事の対象: ✔️ バージョン 4.14.0 ✔️ バージョン 5.8.0
Spring Cloud Azure により、Azure Key Vault Secrets に格納されているシークレットを保持する PropertySource
が構築されます。
依存関係のセットアップ
<dependency>
<groupId>com.azure.spring</groupId>
<artifactId>spring-cloud-azure-starter-keyvault-secrets</artifactId>
</dependency>
ヒント
Key Vault のすべての機能をサポートするために spring-cloud-azure-starter-keyvault
も用意されています。 これを使用する場合は、構成するプロパティは spring.cloud.azure.keyvault.enable
であり、既定値は true です。 その後、spring.cloud.azure.keyvault.<keyvault-service>.enable
を使用して不要なサービスを無効にできます。
基本的な使用方法
client-id
または client-secret
によって認証する場合は、次のプロパティが必要です。
Configuration Properties
spring:
cloud:
azure:
keyvault:
secret:
property-sources:
- name: key-vault-property-source-1
endpoint: ${ENDPOINT_1}
- name: key-vault-property-source-2
endpoint: ${ENDPOINT_2}
Java コード
@SpringBootApplication
public class SampleApplication implements CommandLineRunner {
@Value("${sampleProperty1}")
private String sampleProperty1;
@Value("${sampleProperty2}")
private String sampleProperty2;
@Value("${samplePropertyInMultipleKeyVault}")
private String samplePropertyInMultipleKeyVault;
public static void main(String[] args) {
SpringApplication.run(SampleApplication.class, args);
}
public void run(String[] args) {
System.out.println("sampleProperty1: " + sampleProperty1);
System.out.println("sampleProperty2: " + sampleProperty2);
System.out.println("samplePropertyInMultipleKeyVault: " + samplePropertyInMultipleKeyVault);
}
}
詳細な使用方法
プロパティ名の特殊文字
Key Vaultシークレット名では、[0-9a-zA-Z-]
の文字のみがサポートされています。 詳細については、Azure Key Vault キー、シークレット、証明書の概要に関するページの「Vault-name と Object-name」セクションを参照してください。 プロパティ名に他の文字が含まれている場合は、次のセクションで説明する回避策を使用できます。
シークレット名に .
の代わりに -
を使用する
.
はシークレット名ではサポートされていません。 アプリケーションに .
に含まれるプロパティ名 (例: spring.datasource.url
) が含まれている場合は、Azure Key Vault にシークレットを保存するときに .
を -
に置き換えます。 たとえば、Azure Key Vault に spring-datasource-url
を保存します。 アプリケーションでは、引き続きプロパティ値を取得するために spring.datasource.url
を使用できます。
Note
この方法では、spring.datasource-url
のような要件を満たすことができません。 spring-datasource-url
を Key Vault に保存すると、プロパティ値を取得するために spring.datasource.url
および spring-datasource-url
のみがサポートされますが、spring.datasource-url
はサポートされていません。 このケースを処理するには、「プロパティ プレースホルダーを使用する」セクションを参照してください。
プロパティ プレースホルダーを使用する
たとえば、application.properties ファイルでこのプロパティを設定しているとします。
property.with.special.character__=${propertyWithoutSpecialCharacter}
アプリケーションは propertyWithoutSpecialCharacter
キー名を取得し、その値を property.with.special.character__
に割り当てます。
大文字と小文字を区別する
大文字と小文字を区別するモードを有効にするには、次のプロパティを設定します。
spring.cloud.azure.keyvault.secret.property-sources[].case-sensitive=true
Key Vault にすべてのシークレットが取得されるわけではない
Key Vault に 1,000 個のシークレットを格納したが、そのうちの 3 個だけ必要な場合。 spring.cloud.azure.keyvault.secret.property-sources[].secret-keys
を使用することで、3 つのシークレット名を列挙できます。
更新間隔の設定
既定では、KeyVaultPropertySource
内のシークレットは 30 分ごとに更新されます。 spring.cloud.azure.keyvault.secret.property-sources[].refresh-interval
を使用して時間を構成できます. たとえば、spring.cloud.azure.keyvault.secret.property-sources[].refresh-interval=60m
は 60 分ごとに更新することを意味します。 自動更新を無効にするには、0
に設定します。
PropertySource の優先順位
複数の PropertySource にキーが存在する場合、どれが有効になるかは優先順位によって決まります。
- PropertySource のリストに
SystemEnvironmentPropertySource
が存在しない場合は、KeyVaultPropertySource
の優先順位が最も高くなります。 - PropertySource リストに
SystemEnvironmentPropertySource
が存在する場合は、SystemEnvironmentPropertySource
の優先順位の方が KeyVaultPropertySource より高くなります。 これは、アプリケーションで環境変数を使って Key Vault のシークレットの値をオーバーライドできることを意味します。 - PropertySource リストに複数の KeyVaultPropertySource がある場合、定義の順序は優先順です。 上のサンプルを例にすると、
key-vault-property-souece-1
の方がkey-vault-property-souece-2
より高い優先順位です。
すべての構成プロパティ
プロパティ | 既定値 | 説明 |
---|---|---|
spring.cloud.azure.keyvault.secret.property-source-enabled | true | Key Vault プロパティ ソースを有効にするかどうかを指定します。 |
spring.cloud.azure.keyvault.secret.property-sources[].name | このプロパティ ソースの名前。 | |
spring.cloud.azure.keyvault.secret.property-sources[].endpoint | Azure Key Vault エンドポイント。 | |
spring.cloud.azure.keyvault.secret.property-sources[].case-sensitive | false | 秘密鍵に大文字と小文字の区別があるかどうか。 |
spring.cloud.azure.keyvault.secret.property-sources[].secret-keys | このプロパティ ソースでサポートされる秘密鍵。 このプロパティがない場合は、すべてのキーが取得されます。 | |
spring.cloud.azure.keyvault.secret.property-sources[].refresh-interval | 30 分 | すべての Key Vault シークレットを更新する時間間隔。 |
spring.cloud.azure.keyvault.secret.property-sources[].service-version | API 要求を行うときに使用するシークレット サービスのバージョン。 | |
spring.cloud.azure.keyvault.secret.property-sources[].client | クライアント関連のプロパティ。 | |
spring.cloud.azure.keyvault.secret.property-sources[].credential | 資格情報関連のプロパティ。 | |
spring.cloud.azure.keyvault.secret.property-sources[].profile | プロファイル関連のプロパティ。 | |
spring.cloud.azure.keyvault.secret.property-sources[].proxy | プロキシ関連のプロパティ。 | |
spring.cloud.azure.keyvault.secret.property-sources[].retry | 再試行関連のプロパティ。 |
- セキュリティ プリンシパルに、Azure Key Vault シークレットにアクセスするための十分なアクセス許可が付与されていることを確認するには、「Microsoft Entra ID を使用してアクセスを承認する」を参照してください。
client
、credential
、profile
、proxy
、retry
などの一般的なプロパティがspring.cloud.azure.keyvault.secret.property-sources[].xxx
で構成されていない場合は、spring.cloud.azure.xxx
が使用されます。 これらの一般的なプロパティの詳細については、「Spring Cloud Azure の構成」を参照してください。- 入れ子になったプロパティの詳細については、「Spring Cloud Azure 構成プロパティ」を参照してください。
サンプル
GitHub の spring-cloud-azure-starter-keyvault-secrets のサンプルを参照してください。