秘密後端
Key-Value 後端
Spring Cloud Vault 支援 Key-Value 秘密後端,包括版本化(v2)和非版本化(v1)。Key-Value 後端允許將任意值儲存為鍵值對。單個上下文可以儲存一個或多個鍵值元組。上下文可以分層組織。Spring Cloud Vault 會自行確定秘密是否使用版本控制,並將路徑對映到其相應的 URL。Spring Cloud Vault 允許結合活躍的 Profile 使用應用名稱和預設上下文名稱(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
Profile 由以下屬性確定:
-
spring.cloud.vault.kv.profiles
-
spring.profiles.active
透過將秘密後端中的其他上下文路徑新增到應用名稱(用逗號分隔),可以從這些上下文獲取秘密。例如,給定應用名稱 usefulapp,mysql1,projectx/aws
,將使用以下每個資料夾:
-
/secret/usefulapp
-
/secret/mysql1
-
/secret/projectx/aws
Spring Cloud Vault 會將所有活躍的 Profile 新增到可能的上下文路徑列表中。沒有活躍 Profile 時,將跳過訪問具有 Profile 名稱的上下文。
屬性按儲存方式暴露(即不帶額外的 J 字首)。
根據掛載是否使用版本化的 Key-Value 後端,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
覆蓋 Key-Value 後端使用的應用名稱 -
profiles
覆蓋 Key-Value 後端使用的活躍 Profile -
profile-separator
在帶有 Profile 的屬性源中分隔 Profile 名稱和上下文
Key-Value 秘密後端可以在版本化(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.2.1</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
依賴。
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-vault-config-rabbitmq</artifactId>
<version>4.2.1</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
依賴。
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-vault-config-aws</artifactId>
<version>4.2.1</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
且 Vault 角色配置了多個 IAM 角色時,設定要承擔的 IAM 角色。
資料庫後端
Vault 支援多種資料庫秘密後端,用於根據配置的角色動態生成資料庫憑據。這意味著需要訪問資料庫的服務不再需要配置憑據:它們可以從 Vault 請求憑據,並使用 Vault 的租約機制更輕鬆地滾動金鑰。
Spring Cloud Vault 集成了以下後端:
使用資料庫秘密後端需要在配置中啟用後端並新增 spring-cloud-vault-config-databases
依賴。
Vault 自 0.7.1 版本起自帶一個專用的 database
秘密後端,允許透過外掛進行資料庫整合。您可以透過使用通用資料庫後端來使用該特定後端。請確保指定適當的後端路徑,例如 spring.cloud.vault.mysql.role.backend=database
。
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-vault-config-databases</artifactId>
<version>4.2.1</version>
</dependency>
</dependencies>
啟用多個相容 JDBC 的資料庫將生成憑據,並預設儲存在相同的屬性鍵中,因此 JDBC 秘密的屬性名稱需要單獨配置。 |
Database
Spring Cloud Vault 可以獲取 www.vaultproject.io/api/secret/databases/index.html 中列出的任何資料庫的憑據。透過設定 spring.cloud.vault.database.enabled=true
(預設為 false
)並提供角色名稱 spring.cloud.vault.database.role=…
可以啟用整合。
雖然 database
後端是通用的,但 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
多個數據庫
有時,單個數據庫的憑據不足,因為一個應用可能連線到兩個或更多相同型別的資料庫。從 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 Database
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 使用基於屬性的配置來為 Key-Value 和發現的秘密後端建立 PropertySource
。
發現的後端提供 VaultSecretBackendDescriptor
Bean,用於描述將秘密後端用作 PropertySource
的配置狀態。需要一個 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
來呈現該後端提供的資料。
新增自定義後端實現需要實現兩個介面:
-
org.springframework.cloud.vault.config.VaultSecretBackendDescriptor
-
org.springframework.cloud.vault.config.SecretBackendMetadataFactory
VaultSecretBackendDescriptor
通常是一個持有配置資料的物件,例如 VaultDatabaseProperties
。Spring Cloud Vault 要求您的型別使用 @ConfigurationProperties
註解,以便從配置中例項化類。
SecretBackendMetadataFactory
接受 VaultSecretBackendDescriptor
來建立實際的 SecretBackendMetadata
物件,該物件持有您的 Vault 伺服器內的上下文路徑、解析引數化上下文路徑所需的任何路徑變數以及 PropertyTransformer
。
VaultSecretBackendDescriptor
和 SecretBackendMetadataFactory
型別都必須註冊在 spring.factories
中,這是 Spring 提供的一種擴充套件機制,類似於 Java 的 ServiceLoader。