Vault 後端

Spring Cloud Config 伺服器也支援 Vault 作為後端。

Vault 是一種安全存取機密的工具。機密是指您想要嚴格控制存取的任何事物,例如 API 金鑰、密碼、憑證和其他敏感資訊。 Vault 提供統一的介面來存取任何機密,同時提供嚴格的存取控制並記錄詳細的稽核日誌。

有關 Vault 的更多資訊,請參閱 Vault 快速入門指南

若要啟用組態伺服器以使用 Vault 後端,您可以使用 vault profile 執行組態伺服器。例如,在組態伺服器的 application.properties 中,您可以新增 spring.profiles.active=vault

預設情況下,Spring Cloud Config 伺服器使用 Token 基礎驗證從 Vault 提取組態。 Vault 也支援其他驗證方法,例如 AppRole、LDAP、JWT、CloudFoundry、Kubernetes Auth。為了使用 TOKEN 或 X-Config-Token 標頭以外的任何驗證方法,我們需要在類別路徑中加入 Spring Vault Core,以便 Config 伺服器可以將驗證委派給該程式庫。請將以下依賴項新增至您的 Config 伺服器應用程式。

Maven (pom.xml)

<dependencies>
	<dependency>
		<groupId>org.springframework.vault</groupId>
		<artifactId>spring-vault-core</artifactId>
	</dependency>
</dependencies>

Gradle (build.gradle)

dependencies {
    implementation "org.springframework.vault:spring-vault-core"
}

預設情況下,組態伺服器假設您的 Vault 伺服器在 127.0.0.1:8200 上執行。它也假設後端的名稱為 secret,金鑰為 application。所有這些預設值都可以在組態伺服器的 application.properties 中設定。下表描述了可組態的 Vault 屬性

名稱 預設值

host

127.0.0.1

port

8200

scheme

http

backend

secret

defaultKey

application

profileSeparator

,

kvVersion

1

skipSslValidation

false

timeout

5

namespace

null

前表中的所有屬性都必須以 spring.cloud.config.server.vault 為前綴,或放置在複合組態的正確 Vault 區段中。

所有可組態的屬性都可以在 org.springframework.cloud.config.server.environment.VaultEnvironmentProperties 中找到。

Vault 0.10.0 引入了版本化的鍵值後端(k/v 後端版本 2),它公開了與早期版本不同的 API,現在它需要在掛載路徑和實際上下文路徑之間使用 data/,並將機密包裝在 data 物件中。設定 spring.cloud.config.server.vault.kv-version=2 將會考慮到這一點。

或者,支援 Vault Enterprise X-Vault-Namespace 標頭。若要將其傳送至 Vault,請設定 namespace 屬性。

在您的組態伺服器執行後,您可以向伺服器發出 HTTP 請求,以從 Vault 後端檢索值。為此,您需要 Vault 伺服器的 token。

首先,將一些資料放入您的 Vault 中,如下例所示

$ vault kv put secret/application foo=bar baz=bam
$ vault kv put secret/myapp foo=myappsbar

其次,向您的組態伺服器發出 HTTP 請求以檢索值,如下例所示

$ curl -X "GET" "http://localhost:8888/myapp/default" -H "X-Config-Token: yourtoken"

您應該會看到類似以下的響應

{
   "name":"myapp",
   "profiles":[
      "default"
   ],
   "label":null,
   "version":null,
   "state":null,
   "propertySources":[
      {
         "name":"vault:myapp",
         "source":{
            "foo":"myappsbar"
         }
      },
      {
         "name":"vault:application",
         "source":{
            "baz":"bam",
            "foo":"bar"
         }
      }
   ]
}

用戶端為讓 Config 伺服器與 Vault 通訊而提供必要驗證的預設方式是設定 X-Config-Token 標頭。但是,您可以省略標頭,並在伺服器中設定驗證,方法是設定與 Spring Cloud Vault 相同的組態屬性。要設定的屬性是 spring.cloud.config.server.vault.authentication。它應該設定為其中一種支援的驗證方法。您可能還需要設定特定於您使用的驗證方法的其他屬性,方法是使用與 spring.cloud.vault 文件中相同的屬性名稱,但改為使用 spring.cloud.config.server.vault 前綴。有關更多詳細資訊,請參閱 Spring Cloud Vault 參考指南

如果您省略 X-Config-Token 標頭並使用伺服器屬性來設定驗證,則 Config 伺服器應用程式需要額外依賴 Spring Vault 才能啟用其他驗證選項。有關如何新增該依賴項,請參閱 Spring Vault 參考指南

多個屬性來源

使用 Vault 時,您可以為您的應用程式提供多個屬性來源。例如,假設您已將資料寫入 Vault 中的以下路徑

secret/myApp,dev
secret/myApp
secret/application,dev
secret/application

寫入 secret/application 的屬性可供 所有使用 Config 伺服器的應用程式 使用。名稱為 myApp 的應用程式將可以使用寫入 secret/myAppsecret/application 的任何屬性。當 myApp 啟用 dev profile 時,寫入上述所有路徑的屬性都將可供使用,清單中第一個路徑中的屬性優先於其他路徑中的屬性。

解密屬性來源中的 Vault 機密

Spring Cloud Config 伺服器支援透過使用特殊的佔位符前綴 {vault} 來解密來自 Vault 的屬性。此功能允許在運行時直接從 Vault 動態解析敏感組態屬性。

組態步驟

用於與 Vault 整合的所有組態設定都應放置在您的 application.ymlapplication.properties 中。以下是啟用 Vault profile、連接到您的 Vault 伺服器以及使用 {vault} 前綴格式化屬性所需的特定組態。

啟用 Vault Profile

為您的 Spring Cloud Config 伺服器啟用 Vault profile

spring:
  profiles:
    active: vault

Vault 組態

設定與您的 Vault 伺服器的連線,並包含必要的驗證詳細資訊

spring:
  cloud:
    config:
      server:
        vault:
          host: vault.example.com
          port: 8200
          scheme: https
          backend: secret
          defaultKey: application
          kvVersion: 2
          authentication: TOKEN
          token: ${VAULT_TOKEN}
          skipSslValidation: true

這些設定指定 Vault 伺服器位址、驗證方法和存取 Vault 所需的 token。

屬性格式化

定義具有 {vault} 前綴的屬性,以指定 Vault 路徑和用於檢索機密的金鑰

some:
  sensitive:
    value: '{vault}:path/to/secret#key'

此格式直接對應到 Vault 中儲存機密的位置 (path/to/secret) 和要檢索的特定機密金鑰 (key)。

錯誤處理

如果 Config 伺服器在解密過程中遇到任何問題,例如路徑不正確、存取問題或金鑰遺失,則受影響的屬性將以 invalid. 為前綴,其值將設定為 <n/a>。此方法與處理以 {cipher} 為前綴的屬性類似,但它是專門為與 Vault 整合而設計的,在解密失敗時提供清晰的回饋。