当前位置: 首页 > news >正文

如何使用 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本书助你零基础转行数据分析岗

干货 | 如何构建和推送容器镜像

收藏 | 数据仓库分层存储技术揭秘

上新 | 银行一线专家经验总结,全面揭示银行运维架构

点击阅读全文购买

相关文章:

  • 数据中台:企业数据质量参差不齐?听听专家怎么说
  • 【新书速递】信息安全标委会委员推荐的金融科技安全工具书
  • 终于有人把A/B测试讲明白了
  • 学会这7个绘图工具包,Matplotlib可视化也没那么难
  • 多图详解数据中台建设框架(建议收藏)
  • ASC20-21超算大赛开战——有一群年轻人正在用超算的力量改变世界
  • 【第54期】“换道超车”:无人驾驶在中国的落地之路
  • 微服务究竟是“灵丹”还是“毒药”?
  • 【新书速递】字节跳动、360的智能硬件产品经验总结
  • 手把手教你用Scrapy爬取知乎大V粉丝列表
  • 这样构建的用户画像!想不懂你的用户都难
  • 【新书速递】硅谷和国内的数据中台有哪些区别?
  • DB-Engines 5月数据库排名:MySQL或将超越Oracle?
  • 如何评价一套合格的推荐系统?
  • 无处不在的架构之美
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • 《剑指offer》分解让复杂问题更简单
  • CSS实用技巧
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • Java面向对象及其三大特征
  • java正则表式的使用
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • Node项目之评分系统(二)- 数据库设计
  • Vue2.x学习三:事件处理生命周期钩子
  • vue-router的history模式发布配置
  • 产品三维模型在线预览
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 给Prometheus造假数据的方法
  • 基于Android乐音识别(2)
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • 转载:[译] 内容加速黑科技趣谈
  • puppet连载22:define用法
  • 湖北分布式智能数据采集方法有哪些?
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • ​力扣解法汇总946-验证栈序列
  • !$boo在php中什么意思,php前戏
  • #### go map 底层结构 ####
  • #if和#ifdef区别
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (5)STL算法之复制
  • (BFS)hdoj2377-Bus Pass
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (篇九)MySQL常用内置函数
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • (转载)OpenStack Hacker养成指南
  • .form文件_一篇文章学会文件上传
  • .MyFile@waifu.club.wis.mkp勒索病毒数据怎么处理|数据解密恢复
  • .Net CoreRabbitMQ消息存储可靠机制
  • .net core开源商城系统源码,支持可视化布局小程序
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇
  • .NET MVC 验证码
  • .NET Standard / dotnet-core / net472 —— .NET 究竟应该如何大小写?
  • .NET 的静态构造函数是否线程安全?答案是肯定的!
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法