服务注册中心配置

您可以通过设置 spring.cloud.vault.discovery.enabled=true(默认为 false)来使用 DiscoveryClient(例如来自 Spring Cloud Consul 的客户端)定位 Vault 服务器。这样做的结果是,您的应用需要一个包含适当发现配置的 application.yml 文件(或环境变量)。好处是,只要发现服务是固定的,Vault 就可以改变其地址。默认的服务 ID 是 vault,但您可以在客户端通过 spring.cloud.vault.discovery.serviceId 进行更改。

所有发现客户端实现都支持某种元数据映射(例如,对于 Eureka,我们有 eureka.instance.metadataMap)。服务的某些附加属性可能需要在其服务注册元数据中配置,以便客户端能够正确连接。未提供传输层安全详情的服务注册中心需要提供一个 scheme 元数据条目,设置为 httpshttp。如果未配置方案,并且服务未暴露为安全服务,则配置默认为 spring.cloud.vault.scheme,在未设置时为 https

spring.cloud.vault.discovery:
    enabled: true
    service-id: my-vault-service

Vault 客户端快速失败

在某些情况下,如果服务无法连接到 Vault 服务器,可能希望启动失败。如果这是期望的行为,请设置 bootstrap 配置属性 spring.cloud.vault.fail-fast=true,客户端将抛出异常并停止。

spring.cloud.vault:
    fail-fast: true

Vault 企业版命名空间支持

Vault 企业版允许使用命名空间在单个 Vault 服务器上隔离多个 Vault 实例。通过设置 spring.cloud.vault.namespace=… 配置命名空间后,在使用 Vault 的 RestTemplateWebClient 时,每个 outgoing HTTP 请求都会包含命名空间头部 X-Vault-Namespace

请注意,Vault 社区版不支持此功能,并且对 Vault 操作无效。

spring.cloud.vault:
    namespace: my-namespace

Vault 客户端 SSL 配置

SSL 可以通过设置各种属性以声明方式配置。您可以设置 javax.net.ssl.trustStore 来配置 JVM 范围的 SSL 设置,或者设置 spring.cloud.vault.ssl.trust-store 来仅配置 Spring Cloud Vault Config 的 SSL 设置。

spring.cloud.vault:
    ssl:
        trust-store: classpath:keystore.jks
        trust-store-password: changeit
        trust-store-type: JKS
        enabled-protocols: TLSv1.2,TLSv1.3
        enabled-cipher-suites: TLS_AES_128_GCM_SHA256
  • trust-store 设置信任库的资源。通过 SSL 保护的 Vault 通信将使用指定的信任库验证 Vault SSL 证书。

  • trust-store-password 设置信任库密码

  • trust-store-type 设置信任库类型。支持的值包括所有支持的 KeyStore 类型,包括 PEM

  • enabled-protocols 设置已启用的 SSL/TLS 协议列表(从 3.0.2 版本开始)。

  • enabled-cipher-suites 设置已启用的 SSL/TLS 密码套件列表(从 3.0.2 版本开始)。

请注意,仅当类路径中存在 Apache Http Components 或 OkHttp 客户端时,配置 spring.cloud.vault.ssl.* 才会生效。

租约生命周期管理(续期和撤销)

对于每个密钥,Vault 都会创建一个租约:包含时间周期、可续期性等信息的元数据。

Vault 承诺数据在给定的有效期(即 Time To Live,TTL)内有效。一旦租约过期,Vault 可以撤销数据,并且密钥的使用者不再能确定其是否有效。

Spring Cloud Vault 不仅管理登录令牌和密钥的创建,还维护租约生命周期。也就是说,与租约关联的登录令牌和密钥会在租约到期前安排续期,直到最终过期。应用程序关闭会撤销获取的登录令牌和可续期租约。

密钥服务和数据库后端(例如 MongoDB 或 MySQL)通常会生成可续期的租约,因此生成的凭据会在应用程序关闭时被禁用。

静态令牌不会续期或撤销。

租约续期和撤销默认启用,可以通过将 spring.cloud.vault.config.lifecycle.enabled 设置为 false 来禁用。不建议禁用此功能,因为租约可能过期,导致 Spring Cloud Vault 无法再访问 Vault 或使用生成的凭据访问服务,而且有效凭据在应用程序关闭后仍然保持活动状态。

spring.cloud.vault:
    config.lifecycle:
    	enabled: true
    	min-renewal: 10s
    	expiry-threshold: 1m
    	lease-endpoints: Legacy
  • enabled 控制是否对与密钥关联的租约进行续期,以及是否轮换过期的密钥。默认为启用状态。

  • min-renewal 设置续期租约之前所需的最小持续时间。此设置可防止过于频繁的续期。

  • expiry-threshold 设置到期阈值。租约会在到期前配置的时间段内进行续期。

  • lease-endpoints 设置续期和撤销的端点。0.8 版本之前的 Vault 使用 Legacy 端点,之后版本使用 SysLeases 端点。

  • lease-strategy 设置 LeaseStrategyDropOnErrorRetainOnErrorRetainOnIoError),用于控制租约续期时的错误处理。

会话令牌生命周期管理(续期、重新登录和撤销)

Vault 会话令牌(也称为 LoginToken)与租约非常相似,因为它有 TTL、最大 TTL,并且可能会过期。登录令牌过期后,就不能再用于与 Vault 交互。因此,Spring Vault 提供了一个 SessionManager API,用于命令式和响应式的使用。

Spring Cloud Vault 默认维护会话令牌生命周期。会话令牌是延迟获取的,因此实际登录会推迟到第一次使用 Vault 进行会话绑定操作时进行。一旦 Spring Cloud Vault 获取了会话令牌,它会一直保留该令牌直到过期。下一次使用会话绑定活动时,Spring Cloud Vault 会重新登录到 Vault 并获取一个新的会话令牌。在应用程序关闭时,如果令牌仍然处于活动状态,Spring Cloud Vault 会将其撤销以终止会话。

会话生命周期默认启用,可以通过将 spring.cloud.vault.session.lifecycle.enabled 设置为 false 来禁用。不建议禁用此功能,因为会话令牌可能过期,导致 Spring Cloud Vault 无法再访问 Vault。

spring.cloud.vault:
    session.lifecycle:
        enabled: true
        refresh-before-expiry: 10s
        expiry-threshold: 20s
  • enabled 控制是否启用会话生命周期管理以续期会话令牌。默认为启用状态。

  • refresh-before-expiry 控制会话令牌续期的时间点。续期时间是通过从令牌过期时间中减去 refresh-before-expiry 计算得出的。默认为 5 秒

  • expiry-threshold 设置过期阈值。该阈值表示一个会话令牌被视为有效的最小 TTL 持续时间。TTL 小于该阈值的令牌被视为已过期,不再使用。此值应大于 refresh-before-expiry 以防止令牌过期。默认为 7 秒