秘密のバックエンド
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-namespring.cloud.vault.application-namespring.application.name
プロファイルは次のプロパティによって決定されます。
spring.cloud.vault.kv.profilesspring.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, cloudenabledがこの値をfalseに設定すると、シークレットバックエンド構成の使用が無効になります。backendは、使用するシークレットマウントのパスを設定しますdefault-contextは、すべてのアプリケーションで使用されるコンテキスト名を設定します。application-nameは、キーと値のバックエンドで使用するアプリケーション名をオーバーライドします。profilesは、キーと値のバックエンドで使用するアクティブなプロファイルをオーバーライドします。profile-separatorは、プロファイルを含むプロパティソース内のコンテキストからプロファイル名を分離します。
| キーと値のシークレットバックエンドは、バージョン管理 (v2) モードと非バージョン管理 (v1) モードで動作できます。 |
関連事項:
Consul
Spring Cloud Vault は、HashiCorp Consul の資格情報を取得できます。Consul 統合には spring-cloud-vault-config-consul 依存関係が必要です。
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-vault-config-consul</artifactId>
<version>4.3.0</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.tokenenabledがこの値をtrueに設定すると、Consul バックエンド構成の使用が有効になります。roleは、Consul ロール定義のロール名を設定します。backendは、使用する Consul マウントのパスを設定しますtoken-propertyは、Consul ACL トークンが保存されるプロパティ名を設定します
RabbitMQ
Spring Cloud Vault は RabbitMQ の資格情報を取得できます。
RabbitMQ 統合には spring-cloud-vault-config-rabbitmq 依存関係が必要です。
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-vault-config-rabbitmq</artifactId>
<version>4.3.0</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.passwordenabledがこの値をtrueに設定すると、RabbitMQ バックエンド構成の使用が有効になります。roleは、RabbitMQ ロール定義のロール名を設定します。backendは、使用する RabbitMQ マウントのパスを設定しますusername-propertyは、RabbitMQ ユーザー名が保存されるプロパティ名を設定しますpassword-propertyは、RabbitMQ パスワードが保存されるプロパティ名を設定します
AWS
Spring Cloud Vault は AWS の認証情報を取得できます。
AWS 統合には spring-cloud-vault-config-aws 依存関係が必要です。
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-vault-config-aws</artifactId>
<version>4.3.0</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-roleenabledがこの値をtrueに設定すると、AWS バックエンド構成の使用が有効になります。roleは、AWS ロール定義のロール名を設定しますbackendは、使用する AWS マウントのパスを設定しますaccess-key-propertyは、AWS アクセスキーが保存されるプロパティ名を設定しますsecret-key-propertyは、AWS 秘密鍵が保存されるプロパティ名を設定しますsession-token-key-propertyは、AWS STS セキュリティトークンが保存されるプロパティ名を設定します。credential-typeは、このバックエンドに使用する aws 認証情報の型を設定します。デフォルトはiam_userttlは、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。
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-vault-config-databases</artifactId>
<version>4.3.0</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.passwordenabledがこの値を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.passwordenabledがこの値を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.passwordenabledこの値を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.passwordenabledがこの値を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.passwordenabledがこの値を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.passwordenabledがこの値を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.VaultSecretBackendDescriptororg.springframework.cloud.vault.config.SecretBackendMetadataFactory
VaultSecretBackendDescriptor は通常、VaultDatabaseProperties などの構成データを保持するオブジェクトです。Spring Cloud Vault では、構成からクラスを実体化するために、型に @ConfigurationProperties アノテーションが付けられている必要があります。
SecretBackendMetadataFactory は VaultSecretBackendDescriptor を受け入れて、Vault サーバー内のコンテキストパス、パラメーター化されたコンテキストパスと PropertyTransformer を解決するために必要なパス変数を保持する実際の SecretBackendMetadata オブジェクトを作成します。
VaultSecretBackendDescriptor 型と SecretBackendMetadataFactory 型の両方を、Java の ServiceLoader と同様に、Spring によって提供される拡張メカニズムである spring.factories に登録する必要があります。