如何使用 Vault 安全地存储配置的 secret
导读:每一个应用程序都有需要保密的信息,这些信息可能包括数据库凭证,外部服务认证,甚至某些资源的位置。所有这些都统称为密钥。应用程序需要一个安全的地方来存储这些密钥,无论是在应用程序启动时还是在空闲时。
本文我们将讨论如何使用Vault进行密钥管理。
问题
如何安全地存储配置密钥?
解决方案
使用QuarkusVault(https://oreil.ly/UMKuH)
扩展插件去查找密钥。
在处理密钥时,最关键的是存储它们,使被禁止的用户无法读取,保护对密钥的访问,仅让需要这些密钥的服务可以访问它们。
Vault是一个为存储和使用密钥提供统一接口,并简化用例的工具。
关于 Vault
Vault(https://oreil.ly/UMKuH)是一个安全访问密钥的开源工具。如何在生产中运行Vault不在本书的讨论范围之内。
为了简化 Vault的安装,使用 VaultDocker 容器:
docker run --rm --cap-add=IPC_LOCK -eVAULT_ADDR=http://localhost:8200 \
-p8200:8200 --name=dev-vault vault:1.2.2
你可能需要设置以下环境变量:
$ exportVAULT_ADDR='http://0.0.0.0:8200'
解封密钥和根令牌显示在下面,以备你想封存 /解封 Vault或重新认证:
Unseal Key:s7WbMScSOh02ERK6XEfl6ep6BReRQZzl9VekrrnyKE8=
Root Token:s.ty3QS2uNaxPdiFsSZpCQfjpc ①
①令牌,用于初始化访问 Vault
在Vault容器内打开 shell,配置 Vault并添加一个 secret:
docker exec -it dev-vault sh
exportVAULT_TOKEN=s.ty3QS2uNaxPdiFsSZpCQfjpc ①
vault kv putsecret/myapps/vault-service/config foo=secretbar ②
①设置要访问的令牌
②在路径 secret/myapps/vault-service/config处用 foo 作为键创建一个新的 secret
创建一个允许对秘密进行读取访问的策略:
cat <<EOF | vault policy writevault-service-policy -
path"secret/data/myapps/vault-service/*" {
capabilities= ["read"]
}
EOF
最后一步是启用凭证(userpass引擎),以便从服务中访问secret:
vaultauth enable userpass
vault write auth/userpass/users/alexpassword=alex \
policies=vault-service-policy ①
①创建一个 ID 为 alex,密码为 alex 的用户
Vault支持多种认证方式对Vault服务进行认证,然后再开始使用密钥。在撰写本书时,
QuarkusVault扩展插件支持以下认证方式:
token
直接传递用户令牌,绕过认证过程。
user/password
使用用户名和密码凭证进行 Vault认证。
approle
使用一个role_id和 secret_id进行认证。这个方法面向自动化的工作流(机器和
服务)。role_id通常被嵌入到Docker容器中,secret_id则由Kubernetes集群以
cubby-hole响应的方式获取,将其封装(单次使用)并交付给目标服务。
kubernetes
使用 Kubernetes服务账户令牌对 Vault进行认证。
开始使用 Vault前,需要先注册 quarkus-vault扩展插件:
./mvnw quarkus:add-extension-Dextensions="quarkus-vault"
QuarkusVault扩展插件集成了MicroProfileConfiguration规范,因此可以使用@Config-Property注解注入一个密钥。配置应用程序使用用户名和密码作为Vault的认证方法,并设置存储密钥的基本路径:
quarkus.vault.url=http://localhost:8200 ①
quarkus.vault.authentication.userpass.username=alex ②
quarkus.vault.authentication.userpass.password=alex
quarkus.vault.kv-secret-engine-version=2 ③
quarkus.vault.secret-config-kv-path=myapps/vault-service/config
① Vault服务器的基本 URL
② 认证的凭证
③ 存储 secret 的路径
使用 @org.eclipse.microprofile.config.inject.ConfigProperty注解访问密钥中 foo键的值:
@ConfigProperty(name= "foo") ①
String foo;
@GET
@Produces(MediaType.TEXT_PLAIN)public String hello() {
return foo;
}
① 注入的键 foo 的 secret值
启动应用并向终端发送一个请求:
./mvnw clean compile quarkus:dev
curl http://localhost:8080/hello
secretbar
讨论
如果只有在运行时才知道路径,也可以通过注io.quarkus.vault.VaultKVSecretEngine接口,以编程方式检索密钥。
@Inject
VaultKVSecretEngine kvSecretEngine;
final Map<String, String>secrets = kvSecretEngine
.readSecret("myapps/vault-service/config"); ①
final String fooSecret =secrets.get("foo");
① 提供存储在 Vault键/值密钥引擎中的值
本文摘编于机械工业出版社出版的图书《Quarkus实战:专为Kubernetes而优化的Java解决方案》。
关于作者:
Alex Soto Bueno 是RedHat的开发者体验总监,自 2017 年以来一直是 JavaChampion。
Jason Porter 是一名首席软件工程师,在Red Hat从事中间件工程服务、Arquillian、Quarkus 和其他开发者体验项目。
本书向熟悉Java企业应用开发的中高级开发人员展示了如何快速上手Quarkus。你将了解如何在更广泛的Java生态系统中使用Quarkus,并掌握如何使该框架满足自己的特殊需求。每一章都以问题-解决方案-讨论的格式编写。
通过本书,你将学会:
• 通过在开发模式下启用实时重载来缩短开发周期。
• 连接到 Kafka 并与之通信。
• 使用响应式编程模型进行开发并轻松地为服务添加容错功能。
• 将应用程序构建为一个 Kubernetes 就绪的容器。
• 使用 OpenAPI 轻松地开发和测试原生 Quarkus应用程序。
本书向熟悉Java企业应用开发的中高级开发人员展示了如何快速上手Quarkus。你将了解如何在更广泛的Java生态系统中使用Quarkus,并掌握如何使该框架满足自己的特殊需求。每一章都以问题-解决方案-讨论的格式编写。
通过本书,你将学会:
通过在开发模式下启用实时重载来缩短开发周期。
连接到 Kafka 并与之通信。
使用响应式编程模型进行开发并轻松地为服务添加容错功能。
将应用程序构建为一个 Kubernetes 就绪的容器。
使用 OpenAPI 轻松地开发和测试原生 Quarkus 应用程序。
扫码关注【华章计算机】视频号
每天来听华章哥讲书
更多精彩回顾
书讯 | 5月书讯(下)| 5天小长假,一起读新书
书讯 | 5月书讯(上)| 5天小长假,一起读新书
资讯 | DB-Engines 4月数据库排名:Redis有望甩掉“千年老七”?
书单 | 8本书助你零基础转行数据分析岗
干货 | 如何构建和推送容器镜像
收藏 | 数据仓库分层存储技术揭秘
上新 | 银行一线专家经验总结,全面揭示银行运维架构
点击阅读全文购买