使用 Spring Cloud Config 进行分布式配置:Vault 后端
前文已经介绍过,Vault 是一种工具,它可以通过统一的接口对机密信息进行安全访问。为了使 Config Server 能够使用该类型的后端,开发人员必须使用 Vault 配置文件--spring.profile
s.active=vault 运行它。当然,在运行 Config Server 之前, 还需要安装并启动 Vault 实例。建议开发人员使用 Docker 来完成该任务。
由于这是本书第一次介绍与 Docker 相关的内容,并不是每个人都知道该工具,在本书第 14 章“Docker 支持”中简要介绍了 Docker, 并提供了它的基本命令和用例,因此,如果这是你第一次接触该技术,则不妨先跳到第 14 章翻看一下其内容。对于那些熟悉 Docker 的人来说,则应该很容易理解以下命令示例,它将在开发模式下运行 Vault 容器。开发人员可以使用 VAULT_DEV_ LISTEN ADDRESS 参数覆盖默认的侦听地址,或者使用 VAULT _DEV_ _ROOT_TOKEN_ ID 参数覆盖初始生成的根令牌的 ID。
docker run --cap-add- IPC LOCK -d --name =vault -e
'VAULT DEV_ ROOT TOKEN ID=client' -P 8200:8200 vault
1. Vault 入门
Vault 提供了一个命令行接口,可用于向服务器添加新值并从服务器读取它们。以下显示了调用这些命令的示例。但是,由于我们将 Vault 作为 Docker 容器运行,因此,管理机密最方便的方法是通过 HTTP API.
$ vault write secret/hello value=world
$ vault read secret/hello
HTTP API 可用于我们的 Vault 实例( 位于 ht://192. 168.99.100:8200/v1/secret 地址下)。调用该 API 的每个方法时,需要将令牌 X-Vault-Token 作为请求头传递。因为我们在启动 Docker 容器时已经在 VAULT_ _DEV. _ROOT_ TOKEN_ _ID 环境参数中设置了该值, 所以它等于 client.否则,它将在启动期间自动生成,并且可以通过调用命令 docker logsvault 从日志中读取。要开始使用 Vault, 开发人员实际上需要了解两种 HTTP 方法一 POST 和 GET.在调用 POST 方法时,可以定义应该添加到服务器的机密列表。在以下 curl 命令示例中,它所传递的参数就是使用 kv (key/value) 后端创建的,该后端的作用类似于键/值(Key/Value) 存储。
$ curl -H"X-Vau1t-Token: client" -H"Content-Type: application/json" -x
POST -d 'l"server . port": 8081, "sample. string.property": "Client
App", "sample . int.property": 1} '
http://192.168.99.100:8200/v1/secret/client-service
可以使用 GET 方法从服务器读取新添加的值。
$ curl -H "X-Vault-Token: client" -X GET
http://192.168.99.100:8200/v1/secret/client-service
2.与 Spring Cloud Config 集成
正如前文所述,开发人员必须使用-springprofiles active=vault 参数运行 Spring CloudConfig Server,这样才能启用 Vault 作为后端存储。要覆盖默认的自动配置设置,应该在 spring.?
cloud.config.server.vault.*键下面定义属性。以下示例显示了我们的示例应用程序的当前配置。在 GitHub 上也提供了这样一个示例应用程序,开发人员可以切换到 confg. vault 分支 tps:/github com/piomin/sample srinccou--tltree/config. vault)来访问它。
spring:
application:
name: config-server
cloud:
config:
server :
vault:
host: 192.168.99.100
port: 8200
现在,开发人员可以调用由 Config Server 公开的端点。虽然仍必须在请求头中传递令牌,但这一次它的名称是 X-Config-Token.
$ curl -X "GET" "http://localhost:8889/client-service/default" -H "X-
Config-Token: client"
其响应结果应该如下所示。这些属性是客户端应用程序的配置文件的默认属性。开发人员还可以添加所选配置文件的特定设置,方法是在逗号字符后面使用配置文件名称,以调用 VaultHTTP API 方法,如
htp:///2.168.99.100:8200/v1/secret/client service, zone1。如果调用路径中包含此类配置文件名称,则响应中将返回 default 和 zone1 配置文件的属性。
{
"name": "client-service",
"profiles": ["default"],
"label" :null,
"version":null,
"state" :null,
"propertySources":[{
"name" :"vault :client-service",
"source":{
"sample. int.property":1,
"sample. string .property":"Client App",
"server.port":8081
}
}]
}
3.客户端配置
使用 Vault 作为 Config Server 的后端时,客户端需要为服务器传递令牌,以便能够从 Vault 检索值。应使用 bootstrap.yml 文件中的 spring, cloud. configtoken 属性在客户端配置设置中提供此令牌。
spring:
评论