mysql - 如何使用 Hashicorp Vault 访问 node.js 中的机密
问题描述
我刚刚在我的 Ubuntu 18.04 后端服务器上设置了 Hashicorp 的 Vault。它运行一个 node.js 后端服务器,该服务器使用环境变量来存储 MySQL 数据库的数据。但是,我认为这是不安全的,因此我改为使用 Vault。我现在已将所有机密存储在 Vault 中,并且可以在我的 node.js 应用程序中访问它,如下所示:
const rootKey = "hidden"
const unsealKey = "alsohidden"
var options = {
apiVersion: 'v1',
endpoint: 'https://url.com:8200',
token: rootKey
};
var vault = require("node-vault")(options);
vault.unseal({ key: unsealKey })
.then(() => {
vault.read('secret/db_host')
.then((res) => console.log("result:",res.data.value))
.catch((err) => console.error("error:",err));
});
这会导致在我的控制台日志中打印正确的主机地址。然而,这给我留下了两个问题:
1. 如何在我的 MySQL 连接中使用检索到的信息?我目前使用环境变量执行此操作:
var pool = mysql.createPool({
connectionLimit: 100,
host: process.env.DB_HOST, // how can I call the vault variables here?
user: process.env.DB_USER,
password: process.env.DB_PASS,
database: process.env.DB_BASE,
ssl : {
ca : fs.readFileSync('hidden'),
key : fs.readFileSync('hidden'),
cert : fs.readFileSync('hidden'),
},
dateStrings: true
});
2. 如果我将 rootKey 和 unsealKey 作为常量存储在我的 node.js 应用程序中,那么保密的意义何在?我认为应该有一种方法可以正确处理这个问题,因为现在直接将凭据存储在我的 .js 文件中并没有太大的不同..
解决方案
您不应该使用您的根密钥来访问机密。Vault 提供了几种身份验证方法。例如 - 用户密码对、github 身份验证(使用令牌)、LDAP、k8s 等等......
使用其中一种身份验证方法,您将获得带有策略的保险库令牌。该政策将只允许您访问您的相关秘密。
另一个阅读 Vault 的好地方:Learn Vault
如果您使用的是 kubernetes,您可以阅读本指南和本指南
编辑:关于第一个问题,这取决于您决定如何加载机密 - 您可以从文件、process.env 加载它们或使用 node-vault 包直接设置它们。我个人将它们从不同的进程写入文件,并使用dotenv包将它们加载到 process.env 。
推荐阅读
- java - 在 Android 设备上转换和保存图像文件时出现 NullPointerException
- c# - 命令执行后如何隐藏页面的一部分?
- python - 如何将几个标签添加到群体情节中?
- flutter - 可搜索的 SliverGrid 渲染错误的项目
- scala - 将火花数据帧隐蔽到 Scala 地图集合
- python - 如何在 NodeJS Heroku 应用程序中指定 Python 版本?
- javascript - Mathjax 渲染失败
- mysql - 将列转换为行以使用连接 MYSQL 进行查询
- vba - 检查和更改日期类型
- node.js - 节点js中出现UnhandledPromiseRejectionWarning?