金鑰後端
鍵值後端
Spring Cloud Vault 支援鍵值秘密後端,包括版本化(v2)和非版本化(v1)。鍵值後端允許將任意值儲存為鍵值儲存。單個上下文可以儲存一個或多個鍵值對。上下文可以分層組織。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 依賴項。
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-vault-config-consul</artifactId>
<version>5.0.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.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>5.0.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.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>5.0.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-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>5.0.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
多個數據庫
有時,單個數據庫的憑據不足,因為一個應用程式可能連線到兩個或更多同類型的資料庫。從 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 資料庫
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 密碼的屬性名稱
另請參閱: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。
發現的後端提供 VaultSecretBackendDescriptor bean 來描述配置狀態,以便將秘密後端用作 PropertySource。需要 SecretBackendMetadataFactory 來建立 SecretBackendMetadata 物件,該物件包含路徑、名稱和屬性轉換配置。
SecretBackendMetadata 用於支援特定的 PropertySource。
您可以註冊一個 VaultConfigurer 進行自定義。如果您提供 VaultConfigurer,預設的鍵值和發現的後端註冊將被停用。但是,您可以使用 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。