金鑰後端

鍵值後端

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

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

pom.xml
<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.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>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.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>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.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 資料庫

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 使用基於屬性的配置來為鍵值和發現的秘密後端建立 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

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

© . This site is unofficial and not affiliated with VMware.