Vault 后端
Spring Cloud Config Server 还支持将 Vault 作为后端。
有关 Vault 的更多信息,请参阅 Vault 快速入门指南。
要使配置服务器使用 Vault 后端,您可以使用 vault
配置文件运行配置服务器。例如,在配置服务器的 application.properties
中,您可以添加 spring.profiles.active=vault
。
默认情况下,配置服务器假定您的 Vault 服务器运行在 [127.0.0.1:8200](http://127.0.0.1:8200)
。它还假定后端的名称为 secret
,键为 application
。所有这些默认值都可以在配置服务器的 application.properties
中进行配置。下表描述了可配置的 Vault 属性:
名称 | 默认值 |
---|---|
host | 127.0.0.1 |
port | 8200 |
scheme | http |
backend | secret |
defaultKey | application |
defaultLabel | main (仅在 enableLabel 设置为 true 时使用) |
enableLabel | false |
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 服务器的令牌。
首先,在你的 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 Server 与 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 Server 应用程序需要额外依赖 Spring Vault 以启用额外的认证选项。有关如何添加该依赖项,请参阅 Spring Vault 参考指南。
多属性源
在使用 Vault 时,你可以为应用程序提供多个属性源。例如,假设你已将数据写入 Vault 中的以下路径:
secret/myApp,dev
secret/myApp
secret/application,dev
secret/application
写入 secret/application
的属性对所有使用 Config Server 的应用程序都可用。对于名为 myApp
的应用程序,任何写入 secret/myApp
和 secret/application
的属性都对其可用。当 myApp
启用了 dev
配置文件时,写入上述所有路径的属性都对其可用,列表中第一个路径的属性优先于其他路径。
启用按标签搜索
默认情况下,Vault 后端在搜索密钥时不使用标签。你可以通过将 enableLabel
功能标志设置为 true
来改变这一点,并且可以选择设置 defaultLabel
。当未提供 defaultLabel
时,将使用 main
。
当 enableLabel
功能标志开启时,Vault 中的密钥路径应始终包含三个部分(应用程序名称、配置文件和标签)。因此,在前一节的示例中,启用功能标志后,路径将如下所示:
secret/myApp,dev,myLabel
secret/myApp,default,myLabel # default profile
secret/application,dev,myLabel # default application name
secret/application,default,myLabel # default application name and default profile.
解密 Vault 密钥中的属性源
Spring Cloud Config Server 支持通过使用特殊的占位符前缀 {vault}
来解密来自 Vault 的属性。此功能允许在运行时直接从 Vault 动态解析敏感的配置属性。
配置步骤
所有与 Vault 集成的配置设置都应放在您的 application.yml
或 application.properties
文件中。以下是激活 Vault 配置文件、连接到 Vault 服务器以及使用 {vault}
前缀格式化属性所需的具体配置。
启用 Vault 配置文件
为你的 Spring Cloud Config Server 激活 Vault 配置文件:
spring:
profiles:
active: 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 所需的令牌。
属性格式化
使用 {vault}
前缀定义属性,以指定 Vault 路径和密钥用于检索机密:
some:
sensitive:
value: '{vault}:path/to/secret#key'
这种格式直接映射到 Vault 中存储密钥的位置(path/to/secret
)以及要检索的特定密钥键(key
)。
错误处理
如果配置服务器在解密过程中遇到任何问题,例如路径错误、访问问题或密钥缺失,受影响的属性将以前缀 invalid.
标记,其值将被设置为 <n/a>
。这种方法与处理以前缀 {cipher}
标记的属性的方式类似,但它是专门为与 Vault 集成而设计的,在解密失败时提供清晰的反馈。