【问题标题】:Encrypt passwords stored in environment variables加密存储在环境变量中的密码
【发布时间】:2021-01-04 14:13:43
【问题描述】:

我有一个访问多个数据库的 NodeJS 应用程序。目前我已经使用dotenv 将数据库密码存储在环境变量中,以避免将它们保存在源代码中(并避免将它们提交到 repo)。

但是,这仍将密码以纯文本形式存储在位于服务器应用根目录中的 .env 文件中。如果服务器曾经被入侵,密码将在那里供某人用来直接连接到数据库。

解决这个问题的方法是,以某种方式加密密码,将加密的字符串保存在环境变量中,并让服务器(节点)在它们用于连接字符串之前对其进行解密..?

我相信,当某些东西被加密时,它总是可以被解密的。但是,这样做可以避免以纯文本形式存储密码,因此无法按原样使用它们来连接数据库。

npm 模块的推荐会很棒。我找到了crypto-jsforge,但我不知道我应该使用什么。

这是一个专业的解决方案..?我应该使用什么类型的加密......?

【问题讨论】:

  • re: 安全,从管理仪表板设置的变量和使用 fs ".env" 传递的变量之间存在差异,更多关于主题 @indiehackers.com/post/…

标签: node.js encryption


【解决方案1】:

只需首先加密您的密码并将其存储在 env 文件中,然后在需要时使用 crypto-js 对其进行解密。

var CryptoJS = require("crypto-js");
var data = "password";

var encrypted = CryptoJS.AES.encrypt(data, "my-secret");
console.log(encrypted.toString());

在环境中复制加密字符串和过去。

解密密码

var decrypted = CryptoJS.AES.decrypt(process.env.PASS, "my-secret");
var object = decrypted.toString(CryptoJS.enc.Utf8);

只有秘钥和JWT一样匹配才能解密。

【讨论】:

  • 这是不正确的,不会给你带来任何好处,一旦有人拿到了 repo,他们就有了密钥,他们有了密码。如果设法在服务器上获得 root 权限,他们将只查找 env 文件并获取密码和密码。从项目中找出秘密。
  • 大部分云服务器都提供设置环境变量的功能。所以不用担心 env 文件。
  • 那么如何存储“我的秘密”并再次安全地使用它们?
【解决方案2】:

你是对的,你根本不应该在生产中使用 dotenv。将所有“密钥”移动到您运行的机器上。大多数部署服务使用称为环境变量(heroku、AWS、Azure、Netlify)的东西,您可以在其中将它们标记为敏感。像 azure 这样的一些服务有一些特殊的服务,比如 Azure Key Vault,其中的密钥是加密的,可以通过 dev ops build 注入到项目中,也可以直接注入到 vps 或应用服务中。

如果您使用的是自定义 VPS 或类似的东西,那么您可以像任何常规 linux 机器变量一样设置它们,或者将环境变量添加到服务器启动方法或编辑您的 bashrc。

现在这样做的主要原因是实际上保护您免受存储库安全漏洞的影响。这就是为什么必须永远不要存储任何密钥或将 .env 文件保存到 repo 的原因。即使您加密了密钥,它们也会以纯文本形式存储在代码/仓库中的某处。

当有人通过升级或任何其他方法获得 root 权限时,你无法阻止他们阅读 bashrc 或查看服务器代码,所以基本上游戏结束了。

如果您担心自己的数据库,很可能您可以将 IP 列入白名单/黑名单或任何其他方式来限制来自外部来源的流量、加密数据库、确保项目中没有已知的漏洞、使用 ssl 连接、cors设置(基本上可以正确保护您的服务器)。

这里要介绍的重要主题是了解构建变量和运行时变量之间的区别。 Runtime vars 将被从 envs vars 调用注入,而 build 将被注入到最终代码中。

您可以添加加密作为另一层安全性,但前提是机密和密码分开保存。 Dotenv 文件只能用于本地开发。

【讨论】:

  • 我没有将我的 .env 保存到我的仓库中。 dotenv npm 模块没有提到要避免在生产中使用它,除非我在他们的 README 中的某个地方错过了它。
  • 那么,这里的问题是在哪里存储密钥,对吧..?该应用程序将在虚拟 Windows 服务器上运行,所以您是说我应该将密钥添加到此服务器上的环境变量中......?
  • 如果服务器本身被攻破了,攻击者不能只读取服务器环境变量吗..?这与应用配置中的密钥有何不同?
  • 嗯,它猜这取决于你的意思是什么?你的意思是像 Path Traversal 这样的东西吗?攻击者在哪里可以通过不受保护的路径/路由读取和执行服务器上的文件?那么通常优点是 bash 和服务器配置文件需要管理员权限。让我问你,如果攻击者可以通过任何方式获得root访问权限,那么他基本上可以在这一点上做任何事情,也许加密会阻止他一段时间,那么这有什么意义呢?
  • 并且可以肯定的是,加密是一个好主意,可以减缓攻击者的速度,但前提是你不秘密并一起传递。
猜你喜欢
  • 1970-01-01
  • 2018-07-12
  • 2021-02-12
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 2021-01-08
  • 2023-03-20
  • 1970-01-01
相关资源
最近更新 更多