次の方法で共有


Spring Cloud Azure シークレット管理

この記事は、✅ バージョン 4.19.0 ✅ バージョン 5.19.0 に適用されます。

Azure Key Vault シークレットに格納されているシークレットを保持する Spring Cloud Azure コンストラクト 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による認証を行う場合は、次のプロパティが必要です。

構成プロパティ

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 名とオブジェクト名の」セクション 参照してください。 プロパティ名に他の文字が含まれている場合は、次のセクションで説明する回避策を使用できます。

シークレット名に - の代わりに . を使用する

. はシークレット名ではサポートされていません。 アプリケーションに .を含むプロパティ名 (spring.datasource.urlなど) がある場合は、Azure Key Vault にシークレットを保存するときに .- に置き換えます。 たとえば、spring-datasource-url を Azure Key Vault に保存します。 アプリケーションでは、引き続き spring.datasource.url を使用してプロパティ値を取得できます。

手記

このメソッドは、spring.datasource-urlなどの要件を満たすことはできません。 Key Vault に spring-datasource-url を保存する場合、プロパティ値の取得は spring.datasource.urlspring-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 に 1000 個のシークレットを格納していて、そのうちの 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 に存在する場合、有効になるのは優先度によって決まります。

  • SystemEnvironmentPropertySource リストに PropertySource がない場合は、KeyVaultPropertySource が最も優先度が高くなります。
  • SystemEnvironmentPropertySource リストに PropertySource がある場合、SystemEnvironmentPropertySourceKeyVaultPropertySourceよりも優先度が高くなります。つまり、環境変数を使用して、アプリケーションの Key Vault シークレット値をオーバーライドできます。
  • PropertySource リストに複数のキー コンテナー プロパティ ソースがある場合、定義順序は優先順位になります。 上記のサンプルを例として取ると、key-vault-property-source-1key-vault-property-source-2よりも優先度が高くなります。

Key Vault プロパティ ソースのトークン資格情報を構成する

Key Vault PropertySourceに指定されたトークン資格情報を使用する必要がある場合は、TokenCredentialConfigurableBootstrapContextKeyVaultEnvironmentPostProcessor Bean を登録できます。この機能は Spring Cloud Azure 5.19.0 からサポートされています。 AzureCliCredentialを使用する例を次に示します。

public static void main(String[] args) {
    SpringApplication application = new SpringApplication(PropertySourceApplication.class);
    application.addBootstrapRegistryInitializer(registry -> 
            registry.register(TokenCredential.class, context -> new AzureCliCredentialBuilder().build()));

    application.run(args);
}

構成可能なすべてのプロパティ

財産 既定値 形容
spring.cloud.azure.keyvault.secret.property-source-enabled の 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 秘密鍵で大文字と小文字が区別されるかどうか。
spring.cloud.azure.keyvault.secret.property-sources[].secret-keys を する このプロパティ ソースでサポートされているシークレット キー。 このプロパティが見つからない場合は、すべてのキーを取得します。
spring.cloud.azure.keyvault.secret.property-sources[].refresh-interval 30m すべての 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 を使用してアクセスを承認する」を参照してください。
  • clientcredentialprofileproxyretry などの一般的なプロパティが 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 のサンプルを参照してください。