秘密のバックエンド

Key-Value バックエンド

Spring Cloud Vault は、バージョン付き (v2) とバージョンなし (v1) の両方の Key-Value シークレットバックエンドをサポートします。Key-Value バックエンドでは、任意の値を Key-Value ストアとして保存できます。1 つのコンテキストに 1 つまたは複数のキーと値のタプルを保存できます。コンテキストは階層的に編成できます。Spring Cloud Vault は、シークレットがバージョン管理を使用しているかどうかを自ら判断し、パスを適切な URL にマップします。Spring Cloud Vault では、アプリケーション名とデフォルトのコンテキスト名 (application) をアクティブなプロファイルと組み合わせて使用できます。

/secret/{application}/{profile}
/secret/{application}
/secret/{default-context}/{profile}
/secret/{default-context}

アプリケーション名はプロパティによって決まります。

  • spring.cloud.vault.kv.application-name

  • spring.cloud.vault.application-name

  • spring.application.name

プロファイルは次のプロパティによって決定されます。

  • spring.cloud.vault.kv.profiles

  • spring.profiles.active

シークレットは、コンマで区切ってアプリケーション名にパスを追加することで、キー / 値バックエンド内の他のコンテキストから取得できます。例: アプリケーション名 usefulapp,mysql1,projectx/aws の場合、次の各フォルダーが使用されます。

  • /secret/usefulapp

  • /secret/mysql1

  • /secret/projectx/aws

Spring Cloud Vault は、すべてのアクティブなプロファイルを可能なコンテキストパスのリストに追加します。アクティブなプロファイルは、プロファイル名を持つコンテキストへのアクセスをスキップしません。

プロパティは、保存されているときと同じように (つまり、追加のプレフィックスなしで) 公開されます。

Spring Cloud Vault は、マウントがバージョン管理されたキーと値のバックエンドを使用するかどうかに応じて、マウントパスと実際のコンテキストパスの間に data/ コンテキストを追加します。
spring.cloud.vault:
    kv:
        enabled: true
        backend: secret
        profile-separator: '/'
        default-context: application
        application-name: my-app
        profiles: local, cloud
  • enabled がこの値を false に設定すると、シークレットバックエンド構成の使用が無効になります。

  • backend は、使用するシークレットマウントのパスを設定します

  • default-context は、すべてのアプリケーションで使用されるコンテキスト名を設定します。

  • application-name は、キーと値のバックエンドで使用するアプリケーション名をオーバーライドします。

  • profiles は、キーと値のバックエンドで使用するアクティブなプロファイルをオーバーライドします。

  • profile-separator は、プロファイルを含むプロパティソース内のコンテキストからプロファイル名を分離します。

キーと値のシークレットバックエンドは、バージョン管理 (v2) モードと非バージョン管理 (v1) モードで動作できます。

関連事項:

Consul

Spring Cloud Vault は、HashiCorp Consul の資格情報を取得できます。Consul 統合には spring-cloud-vault-config-consul 依存関係が必要です。

pom.xml
<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-vault-config-consul</artifactId>
        <version>4.1.3</version>
    </dependency>
</dependencies>

統合を有効にするには、spring.cloud.vault.consul.enabled=true (デフォルトは false) を設定し、ロール名に spring.cloud.vault.consul.role= …を指定します。

取得したトークンは spring.cloud.consul.token に保存されるため、Spring Cloud を使用すると、Consul は追加の構成を行わずに生成された資格情報を取得できます。spring.cloud.vault.consul.token-property を設定することでプロパティ名を構成できます。

spring.cloud.vault:
    consul:
        enabled: true
        role: readonly
        backend: consul
        token-property: spring.cloud.consul.token
  • enabled がこの値を true に設定すると、Consul バックエンド構成の使用が有効になります。

  • role は、Consul ロール定義のロール名を設定します。

  • backend は、使用する Consul マウントのパスを設定します

  • token-property は、Consul ACL トークンが保存されるプロパティ名を設定します

RabbitMQ

Spring Cloud Vault は RabbitMQ の資格情報を取得できます。

RabbitMQ 統合には spring-cloud-vault-config-rabbitmq 依存関係が必要です。

pom.xml
<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-vault-config-rabbitmq</artifactId>
        <version>4.1.3</version>
    </dependency>
</dependencies>

統合を有効にするには、spring.cloud.vault.rabbitmq.enabled=true (デフォルトは false) を設定し、ロール名に spring.cloud.vault.rabbitmq.role= …を指定します。

ユーザー名とパスワードは spring.rabbitmq.username および spring.rabbitmq.password に保存されるため、Spring Boot を使用すると、追加の構成を行わなくても、生成された資格情報が取得されます。spring.cloud.vault.rabbitmq.username-property および spring.cloud.vault.rabbitmq.password-property を設定することで、プロパティ名を構成できます。

spring.cloud.vault:
    rabbitmq:
        enabled: true
        role: readonly
        backend: rabbitmq
        username-property: spring.rabbitmq.username
        password-property: spring.rabbitmq.password
  • enabled がこの値を true に設定すると、RabbitMQ バックエンド構成の使用が有効になります。

  • role は、RabbitMQ ロール定義のロール名を設定します。

  • backend は、使用する RabbitMQ マウントのパスを設定します

  • username-property は、RabbitMQ ユーザー名が保存されるプロパティ名を設定します

  • password-property は、RabbitMQ パスワードが保存されるプロパティ名を設定します

AWS

Spring Cloud Vault は AWS の認証情報を取得できます。

AWS 統合には spring-cloud-vault-config-aws 依存関係が必要です。

pom.xml
<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-vault-config-aws</artifactId>
        <version>4.1.3</version>
    </dependency>
</dependencies>

統合を有効にするには、spring.cloud.vault.aws=true (デフォルトは false) を設定し、ロール名に spring.cloud.vault.aws.role= …を指定します。

サポートされている AWS 認証情報の型:

  • iam_user (デフォルト)

  • assumed_role (STS)

  • federation_token (STS)

アクセスキーと秘密鍵は cloud.aws.credentials.accessKey と cloud.aws.credentials.secretKey に保存されます。Spring Cloud AWS を使用すると、それ以上の構成を行わなくても、生成された資格情報が取得されます。

spring.cloud.vault.aws.access-key-property および spring.cloud.vault.aws.secret-key-property を設定することで、プロパティ名を構成できます。

STS セキュリティトークンの場合、spring.cloud.vault.aws.session-token-key-property を設定することでプロパティ名を構成できます。セキュリティトークンは cloud.aws.credentials.sessionToken (デフォルト) に保存されます。

サンプル: iam_user

spring.cloud.vault:
    aws:
        enabled: true
        role: readonly
        backend: aws
        access-key-property: cloud.aws.credentials.accessKey
        secret-key-property: cloud.aws.credentials.secretKey

サンプル: assumed_role (STS)

spring.cloud.vault:
    aws:
        enabled: true
        role: sts-vault-role
        backend: aws
        credential-type: assumed_role
        access-key-property: cloud.aws.credentials.accessKey
        secret-key-property: cloud.aws.credentials.secretKey
        session-token-key-property: cloud.aws.credentials.sessionToken
        ttl: 3600s
        role-arn: arn:aws:iam::${AWS_ACCOUNT}:role/sts-app-role
  • enabled がこの値を true に設定すると、AWS バックエンド構成の使用が有効になります。

  • role は、AWS ロール定義のロール名を設定します

  • backend は、使用する AWS マウントのパスを設定します

  • access-key-property は、AWS アクセスキーが保存されるプロパティ名を設定します

  • secret-key-property は、AWS 秘密鍵が保存されるプロパティ名を設定します

  • session-token-key-property は、AWS STS セキュリティトークンが保存されるプロパティ名を設定します。

  • credential-type は、このバックエンドに使用する aws 認証情報の型を設定します。デフォルトは iam_user

  • ttl は、assumed_role または federation_token を使用するときに STS トークンの ttl を設定します。デフォルトは、vault ロールで指定された ttl です。最小 / 最大値も、AWS が STS に対してサポートする値に制限されます。

  • role-arn は、assumed_role の使用時にボールトロールに複数のロールが構成されている場合に引き受ける IAM ロールを設定します。

データベースバックエンド

Vault は、構成されたロールに基づいてデータベース資格情報を動的に生成するために、いくつかのデータベースシークレットバックエンドをサポートしています。これは、データベースにアクセスする必要があるサービスが資格情報を構成する必要がなくなったことを意味します。Vault から資格情報をリクエストし、Vault のリースメカニズムを使用してキーをより簡単にロールできます。

Spring Cloud Vault は、次のバックエンドと統合します。

データベースシークレットバックエンドを使用するには、構成でバックエンドと spring-cloud-vault-config-databases 依存関係を有効にする必要があります。

Vault は、プラグインによるデータベース統合を可能にする専用の database シークレットバックエンドを備えた 0.7.1 以降提供されています。汎用データベースバックエンドを使用することで、その特定のバックエンドを使用できます。必ず適切なバックエンドパスを指定してください。spring.cloud.vault.mysql.role.backend=database

pom.xml
<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-vault-config-databases</artifactId>
        <version>4.1.3</version>
    </dependency>
</dependencies>
複数の JDBC 準拠データベースを有効にすると、資格情報が生成され、デフォルトで同じプロパティキーに保存されるため、JDBC シークレットのプロパティ名を個別に構成する必要があります。

データベース

Spring Cloud Vault は、www.vaultproject.io/api/secret/databases/index.html (英語) にリストされているデータベースの資格情報を取得できます。統合を有効にするには、spring.cloud.vault.database.enabled=true (デフォルトは false) を設定し、ロール名に spring.cloud.vault.database.role= …を指定します。

データベースバックエンドは汎用のものですが、spring.cloud.vault.database は特に JDBC データベースをターゲットとしています。ユーザー名とパスワードは spring.datasource.username および spring.datasource.password プロパティから入手できるため、Spring Boot を使用すると、それ以上の構成を行わなくても、DataSource 用に生成された資格情報が取得されます。spring.cloud.vault.database.username-property および spring.cloud.vault.database.password-property を設定することで、プロパティ名を構成できます。

spring.cloud.vault:
    database:
        enabled: true
        role: readonly
        backend: database
        username-property: spring.datasource.username
        password-property: spring.datasource.password

複数のデータベース

アプリケーションが同じ種類の 2 つ以上のデータベースに接続する可能性があるため、単一のデータベースの資格情報では不十分な場合があります。バージョン 3.0.5 以降、Spring Vault は、spring.cloud.vault.databases.* 名前空間での複数のデータベースシークレットバックエンドの構成をサポートします。

この構成では、複数のデータベースバックエンドを受け入れて、資格情報を指定されたプロパティに具体化します。username-property と password-property を適切に構成してください。

spring.cloud.vault:
    databases:
        primary:
            enabled: true
            role: readwrite
            backend: database
            username-property: spring.primary-datasource.username
            password-property: spring.primary-datasource.password
        other-database:
            enabled: true
            role: readonly
            backend: database
            username-property: spring.secondary-datasource.username
            password-property: spring.secondary-datasource.password
  • <name> データベース構成のわかりやすい名前。

  • <name>.enabled がこの値を true に設定すると、データベースバックエンド構成の使用が有効になります。

  • <name>.role は、データベースロール定義のロール名を設定します。

  • <name>.backend は、使用するデータベースマウントのパスを設定します。

  • <name>.username-property は、データベースユーザー名が保存されるプロパティ名を設定します。プロパティのシャドウイングを避けるために、必ず一意のプロパティ名を使用してください。

  • <name>.password-property は、データベースパスワードが保存されるプロパティ名を設定します。プロパティのシャドウイングを避けるために、必ず一意のプロパティ名を使用してください。

Spring Cloud Vault は、最大リース時間に達した場合の新しい資格情報の取得と、それを使用した DataSource の構成をサポートしていません。つまり、Vault のデータベースロールの max_ttl が 24h に設定されている場合、アプリケーションが開始されてから 24 時間後にデータベースで認証できなくなることを意味します。

Apache Cassandra

cassandra バックエンドは Vault 0.7.1 では非推奨になっており、database バックエンドを使用して cassandra としてマウントすることをお勧めします。

Spring Cloud Vault は Apache Cassandra の資格情報を取得できます。統合を有効にするには、spring.cloud.vault.cassandra.enabled=true (デフォルトは false) を設定し、ロール名に spring.cloud.vault.cassandra.role= …を指定します。

ユーザー名とパスワードは spring.data.cassandra.username および spring.data.cassandra.password プロパティから入手できるため、Spring Boot を使用すると、追加の構成を行わなくても、生成された資格情報が取得されます。spring.cloud.vault.cassandra.username-property および spring.cloud.vault.cassandra.password-property を設定することで、プロパティ名を構成できます。

spring.cloud.vault:
    cassandra:
        enabled: true
        role: readonly
        backend: cassandra
        username-property: spring.data.cassandra.username
        password-property: spring.data.cassandra.password
  • enabled がこの値を true に設定すると、Cassandra バックエンド構成の使用が有効になります。

  • role は、Cassandra ロール定義のロール名を設定します。

  • backend は、使用する Cassandra マウントのパスを設定します

  • username-property は、Cassandra ユーザー名が保存されるプロパティ名を設定します

  • password-property は、Cassandra パスワードが保存されるプロパティ名を設定します

Couchbase データベース

Spring Cloud Vault は Couchbase の資格情報を取得できます。統合を有効にするには、spring.cloud.vault.couchbase.enabled=true (デフォルトは false) を設定し、ロール名に spring.cloud.vault.couchbase.role= …を指定します。

ユーザー名とパスワードは spring.couchbase.username および spring.couchbase.password プロパティから入手できるため、Spring Boot を使用すると、追加の構成を行わなくても、生成された資格情報が取得されます。spring.cloud.vault.couchbase.username-property および spring.cloud.vault.couchbase.password-property を設定することで、プロパティ名を構成できます。

spring.cloud.vault:
    couchbase:
        enabled: true
        role: readonly
        backend: database
        username-property: spring.couchbase.username
        password-property: spring.couchbase.password
  • enabled がこの値を true に設定すると、Couchbase バックエンド構成の使用が有効になります。

  • role は、Couchbase ロール定義のロール名を設定します。

  • backend は、使用する Couchbase マウントのパスを設定します

  • username-property は、Couchbase ユーザー名が保存されるプロパティ名を設定します

  • password-property は、Couchbase パスワードが保存されるプロパティ名を設定します

Elasticsearch

Spring Cloud、Vault は、バージョン 3.0 以降、Elasticsearch の資格情報を取得できます。統合を有効にするには、spring.cloud.vault.elasticsearch.enabled=true (デフォルトは false) を設定し、spring.cloud.vault.elasticsearch.role= …でロール名を指定します。

ユーザー名とパスワードは spring.elasticsearch.rest.username および spring.elasticsearch.rest.password プロパティから入手できるため、Spring Boot を使用すると、追加の構成を行わなくても、生成された資格情報が取得されます。spring.cloud.vault.elasticsearch.username-property および spring.cloud.vault.elasticsearch.password-property を設定することで、プロパティ名を構成できます。

spring.cloud.vault:
    elasticsearch:
        enabled: true
        role: readonly
        backend: mongodb
        username-property: spring.elasticsearch.rest.username
        password-property: spring.elasticsearch.rest.password
  • enabled この値を true に設定すると、Elasticsearch データベースバックエンド構成の使用が有効になります。

  • role は、Elasticsearch ロール定義のロール名を設定します。

  • backend は、使用する Elasticsearch マウントのパスを設定します

  • username-property は、Elasticsearch ユーザー名が保存されるプロパティ名を設定します

  • password-property は、Elasticsearch パスワードが保存されるプロパティ名を設定します

MongoDB

mongodb バックエンドは Vault 0.7.1 では非推奨になっており、database バックエンドを使用して mongodb としてマウントすることをお勧めします。

Spring Cloud Vault は MongoDB の資格情報を取得できます。統合を有効にするには、spring.cloud.vault.mongodb.enabled=true (デフォルトは false) を設定し、ロール名に spring.cloud.vault.mongodb.role= …を指定します。

ユーザー名とパスワードは spring.data.mongodb.username および spring.data.mongodb.password に保存されるため、Spring Boot を使用すると、追加の構成を行わなくても、生成された資格情報が取得されます。spring.cloud.vault.mongodb.username-property および spring.cloud.vault.mongodb.password-property を設定することで、プロパティ名を構成できます。

spring.cloud.vault:
    mongodb:
        enabled: true
        role: readonly
        backend: mongodb
        username-property: spring.data.mongodb.username
        password-property: spring.data.mongodb.password
  • enabled がこの値を true に設定すると、MongodB バックエンド構成の使用が有効になります。

  • role は、MongoDB ロール定義のロール名を設定します。

  • backend は、使用する MongoDB マウントのパスを設定します

  • username-property は、MongoDB ユーザー名が保存されるプロパティ名を設定します

  • password-property は、MongoDB パスワードが保存されるプロパティ名を設定します

MySQL

mysql バックエンドは Vault 0.7.1 では非推奨になっており、database バックエンドを使用して mysql としてマウントすることをお勧めします。spring.cloud.vault.mysql の構成は将来のバージョンで削除される予定です。

Spring Cloud Vault は MySQL の資格情報を取得できます。統合を有効にするには、spring.cloud.vault.mysql.enabled=true (デフォルトは false) を設定し、ロール名に spring.cloud.vault.mysql.role= …を指定します。

ユーザー名とパスワードは spring.datasource.username および spring.datasource.password プロパティから入手できるため、Spring Boot を使用すると、追加の構成を行わなくても、生成された資格情報が取得されます。spring.cloud.vault.mysql.username-property および spring.cloud.vault.mysql.password-property を設定することで、プロパティ名を構成できます。

spring.cloud.vault:
    mysql:
        enabled: true
        role: readonly
        backend: mysql
        username-property: spring.datasource.username
        password-property: spring.datasource.password
  • enabled がこの値を true に設定すると、MySQL バックエンド構成の使用が有効になります。

  • role は MySQL ロール定義のロール名を設定します

  • backend は、使用する MySQL マウントのパスを設定します

  • username-property は、MySQL ユーザー名が保存されるプロパティ名を設定します

  • password-property は、MySQL パスワードが保存されるプロパティ名を設定します

PostgreSQL

postgresql バックエンドは Vault 0.7.1 では非推奨になっており、database バックエンドを使用して postgresql としてマウントすることをお勧めします。spring.cloud.vault.postgresql の構成は将来のバージョンで削除される予定です。

Spring Cloud Vault は PostgreSQL の認証情報を取得できます。統合を有効にするには、spring.cloud.vault.postgresql.enabled=true (デフォルトは false) を設定し、ロール名に spring.cloud.vault.postgresql.role= …を指定します。

ユーザー名とパスワードは spring.datasource.username および spring.datasource.password プロパティから入手できるため、Spring Boot を使用すると、追加の構成を行わなくても、生成された資格情報が取得されます。spring.cloud.vault.postgresql.username-property および spring.cloud.vault.postgresql.password-property を設定することで、プロパティ名を構成できます。

spring.cloud.vault:
    postgresql:
        enabled: true
        role: readonly
        backend: postgresql
        username-property: spring.datasource.username
        password-property: spring.datasource.password
  • enabled がこの値を true に設定すると、PostgreSQL バックエンド構成の使用が有効になります。

  • role は、PostgreSQL ロール定義のロール名を設定します。

  • backend は、使用する PostgreSQL マウントのパスを設定します

  • username-property は、PostgreSQL ユーザー名が保存されるプロパティ名を設定します

  • password-property は、PostgreSQL パスワードが保存されるプロパティ名を設定します

PropertySource として公開するシークレットバックエンドをカスタマイズする

Spring Cloud Vault は、プロパティベースの構成を使用して、キー / 値および検出されたシークレットバックエンド用の PropertySource を作成します。

検出されたバックエンドは、シークレットバックエンドを PropertySource として使用するための構成状態を記述する VaultSecretBackendDescriptor Bean を提供します。SecretBackendMetadataFactory は、パス、名前、プロパティ変換構成を含む SecretBackendMetadata オブジェクトを作成するために必要です。

SecretBackendMetadata は、特定の PropertySource をサポートするために使用されます。

VaultConfigurer を登録してカスタマイズできます。VaultConfigurer を指定すると、デフォルトの Key-Value および検出されたバックエンド登録は無効になります。ただし、SecretBackendConfigurer.registerDefaultKeyValueSecretBackends() および SecretBackendConfigurer.registerDefaultDiscoveredSecretBackends() によるデフォルトの登録を有効にすることができます。

public class CustomizationBean implements VaultConfigurer {

    @Override
    public void addSecretBackends(SecretBackendConfigurer configurer) {

        configurer.add("secret/my-application");

        configurer.registerDefaultKeyValueSecretBackends(false);
        configurer.registerDefaultDiscoveredSecretBackends(true);
    }
}
SpringApplication application = new SpringApplication(MyApplication.class);
application.addBootstrapper(VaultBootstrapper.fromConfigurer(new CustomizationBean()));

カスタムシークレットバックエンドの実装

Spring Cloud Vault には、最も一般的なバックエンド統合のための秘密のバックエンドサポートが付属しています。使用するバックエンドからデータを取得する方法と、PropertyTransformer を提供してそのバックエンドによって提供されるデータを表示する方法を記述した実装を提供することで、あらゆる種類のバックエンドと統合できます。

バックエンドのカスタム実装を追加するには、次の 2 つのインターフェースの実装が必要です。

  • org.springframework.cloud.vault.config.VaultSecretBackendDescriptor

  • org.springframework.cloud.vault.config.SecretBackendMetadataFactory

VaultSecretBackendDescriptor は通常、VaultDatabaseProperties などの構成データを保持するオブジェクトです。Spring Cloud Vault では、構成からクラスを実体化するために、型に @ConfigurationProperties アノテーションが付けられている必要があります。

SecretBackendMetadataFactory は VaultSecretBackendDescriptor を受け入れて、Vault サーバー内のコンテキストパス、パラメーター化されたコンテキストパスと PropertyTransformer を解決するために必要なパス変数を保持する実際の SecretBackendMetadata オブジェクトを作成します。

VaultSecretBackendDescriptor 型と SecretBackendMetadataFactory 型の両方を、Java の ServiceLoader と同様に、Spring によって提供される拡張メカニズムである spring.factories に登録する必要があります。