服務註冊中心配置

您可以使用 DiscoveryClient (例如來自 Spring Cloud Consul) 透過設定 spring.cloud.vault.discovery.enabled=true (預設 false) 來定位 Vault 伺服器。 最終結果是您的應用程式需要一個 application.yml (或一個環境變數) 與適當的探索配置。 好處是 Vault 可以更改其坐標,只要探索服務是一個固定點。 預設服務 ID 為 vault,但您可以在客戶端使用 spring.cloud.vault.discovery.serviceId 更改它。

探索客户端實作都支援某種類型的元數據映射 (例如,對於 Eureka,我們有 eureka.instance.metadataMap)。 服務的一些其他屬性可能需要在其服務註冊元數據中配置,以便客戶端可以正確連接。 不提供傳輸層安全詳細資訊的服務註冊中心需要提供一個 scheme 元數據條目,設定為 httpshttp。 如果未配置 scheme 且服務未作為安全服務公開,則配置預設為 spring.cloud.vault.scheme,在未設定時為 https

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

Vault 客戶端快速失敗

在某些情況下,如果服務無法連接到 Vault 伺服器,則可能需要讓服務啟動失敗。 如果這是期望的行為,請設定啟動配置屬性 spring.cloud.vault.fail-fast=true,客戶端將會停止並拋出例外。

spring.cloud.vault:
    fail-fast: true

Vault 企業版命名空間支援

Vault 企業版允許使用命名空間在單個 Vault 伺服器上隔離多個 Vault。 透過設定 spring.cloud.vault.namespace=… 配置命名空間,在使用 Vault RestTemplateWebClient 時,會在每個傳出的 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 保證資料在給定的持續時間或存活時間 (TTL) 內有效。 一旦租約過期,Vault 可以撤銷資料,並且密鑰的消費者不再能確定其有效性。

Spring Cloud Vault 維護租約生命週期,而不僅僅是登入令牌和密鑰的建立。 也就是說,與租約關聯的登入令牌和密鑰會在租約到期之前排程續約,直到最終到期。 應用程式關閉會撤銷已取得的登入令牌和可續約的租約。

密鑰服務和資料庫後端 (例如 MongoDB 或 MySQL) 通常會產生可續約的租約,因此產生的憑證將在應用程式關閉時停用。

靜態令牌不會續約或撤銷。

租約續約和撤銷預設為啟用,可以透過設定 spring.cloud.vault.config.lifecycle.enabledfalse 來停用。 不建議停用,因為租約可能會過期,並且 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 設定 LeaseStrategy (DropOnErrorRetainOnErrorRetainOnIoError) 以控制租約續約時的錯誤處理。

會期令牌生命週期管理 (續約、重新登入和撤銷)

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.enabledfalse 來停用。 不建議停用,因為會期令牌可能會過期,並且 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 秒。

另請參閱: Vault 文件:令牌續約