秘密後端
Key-Value 後端
Spring Cloud Vault 支援 Key-Value 秘密後端,包含版本控制 (v2) 和未版本控制 (v1)。key-value 後端允許將任意值儲存為鍵值儲存。單一上下文可以儲存一個或多個鍵值組。上下文可以階層式組織。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
秘密可以從 key-value 後端內的其他上下文取得,方法是將其路徑新增至應用程式名稱,並以逗號分隔。例如,給定應用程式名稱 usefulapp,mysql1,projectx/aws
,將會使用以下每個資料夾
-
/secret/usefulapp
-
/secret/mysql1
-
/secret/projectx/aws
Spring Cloud Vault 會將所有活動設定檔新增至可能的上下文路徑清單。沒有活動設定檔將會略過存取具有設定檔名稱的上下文。
屬性的公開方式與其儲存方式相同 (即不帶額外前綴)。
Spring Cloud Vault 會在掛載路徑和實際上下文路徑之間新增 data/ 上下文,具體取決於掛載是否使用版本控制的 key-value 後端。 |
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-separator
在具有設定檔的屬性來源中,將設定檔名稱與上下文分隔開來
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.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
相依性。
<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
相依性。
<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
設定 IAM 角色以在為 vault 角色組態多個角色時使用assumed_role
擔任。
資料庫後端
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.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
多個資料庫
有時,單一資料庫的憑證不足,因為應用程式可能會連線到兩個或多個相同種類的資料庫。從 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
設定儲存資料庫密碼的屬性名稱。請務必使用唯一的屬性名稱,以避免屬性遮蔽。
另請參閱:Vault 文件:資料庫秘密後端
當達到最長租用時間時,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。