秘密後端

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 相依性。

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.usernamespring.rabbitmq.password 中,因此使用 Spring Boot 將會取得產生的憑證,而無需進一步組態。您可以透過設定 spring.cloud.vault.rabbitmq.username-propertyspring.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.accessKeycloud.aws.credentials.secretKey 中。因此,使用 Spring Cloud AWS 將會取得產生的憑證,而無需進一步組態。

您可以透過設定 spring.cloud.vault.aws.access-key-propertyspring.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_rolefederation_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

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.usernamespring.datasource.password 屬性取得,因此使用 Spring Boot 將會取得 DataSource 的產生憑證,而無需進一步組態。您可以透過設定 spring.cloud.vault.database.username-propertyspring.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-propertypassword-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.usernamespring.data.cassandra.password 屬性取得,因此使用 Spring Boot 將會取得產生的憑證,而無需進一步組態。您可以透過設定 spring.cloud.vault.cassandra.username-propertyspring.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.usernamespring.couchbase.password 屬性取得,因此使用 Spring Boot 將會取得產生的憑證,而無需進一步組態。您可以透過設定 spring.cloud.vault.couchbase.username-propertyspring.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.usernamespring.elasticsearch.rest.password 屬性取得,因此使用 Spring Boot 將會取得產生的憑證,而無需進一步組態。您可以透過設定 spring.cloud.vault.elasticsearch.username-propertyspring.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.usernamespring.data.mongodb.password 中,因此使用 Spring Boot 將會取得產生的憑證,而無需進一步組態。您可以透過設定 spring.cloud.vault.mongodb.username-propertyspring.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 後端並將其掛載為 mysqlspring.cloud.vault.mysql 的組態將在未來版本中移除。

Spring Cloud Vault 可以取得 MySQL 的憑證。可以透過設定 spring.cloud.vault.mysql.enabled=true (預設為 false) 並提供角色名稱 spring.cloud.vault.mysql.role=… 來啟用整合。

使用者名稱和密碼可從 spring.datasource.usernamespring.datasource.password 屬性取得,因此使用 Spring Boot 將會取得產生的憑證,而無需進一步組態。您可以透過設定 spring.cloud.vault.mysql.username-propertyspring.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 後端並將其掛載為 postgresqlspring.cloud.vault.postgresql 的組態將在未來版本中移除。

Spring Cloud Vault 可以取得 PostgreSQL 的憑證。可以透過設定 spring.cloud.vault.postgresql.enabled=true (預設為 false) 並提供角色名稱 spring.cloud.vault.postgresql.role=… 來啟用整合。

使用者名稱和密碼可從 spring.datasource.usernamespring.datasource.password 屬性取得,因此使用 Spring Boot 將會取得產生的憑證,而無需進一步組態。您可以透過設定 spring.cloud.vault.postgresql.username-propertyspring.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

VaultSecretBackendDescriptorSecretBackendMetadataFactory 類型都必須在 spring.factories 中註冊,這是 Spring 提供的擴充機制,類似於 Java 的 ServiceLoader。