Share via


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 再試行関連のプロパティ。

サンプル

GitHub の spring-cloud-azure-starter-keyvault-secrets のサンプルを参照してください。