秘密後端

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 依賴。

pom.xml
<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 依賴。

pom.xml
<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.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.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.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 當使用 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

pom.xml
<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.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。