将环境变量用于秘密数据是否不安全?

信息安全 秘密分享 环境变量
2021-08-11 19:22:12

在阅读了作者提出反对使用环境变量存储机密的论点的这篇博文后,我不确定如何继续部署我的应用程序。

他的主要论点如下:

  • 鉴于环境对进程隐式可用,即使不是不可能,也很难跟踪访问以及内容是如何暴露的 (ps -eww )。

  • 让应用程序获取整个环境并将其打印出来以进行调试或错误报告是很常见的。如此多的秘密被泄露给 PagerDuty,以至于他们有一个很好的内部流程来清除他们的基础设施。

  • 环境变量被传递给子进程,这允许意外访问。这违反了最小特权原则。想象一下,作为应用程序的一部分,您调用第三方工具来执行某些操作——突然间,第三方工具可以访问您的环境,天知道它会用它做什么。

  • 当应用程序崩溃时,它们通常会将环境变量存储在日志文件中以供以后调试。这意味着磁盘上的纯文本机密。

  • 将秘密放入 ENV 变量中,很快就会变成部落知识。不了解特定环境变量敏感性的新工程师将不会适当/小心地处理它们(将它们过滤到子流程等)。

这些对我来说似乎很合理,但我不是安全专业人士。他的替代建议是使用 Docker 的保密功能,但这是假设您使用的是 Docker ......我不是。我在 Heroku 上。所以我现在有点不确定。似乎没有任何支持在 Heroku 上使用 Vault,据我所知。

1个回答

一般来说,在环境变量中存储秘密确实有一些缺点,正如 Diogo 在他的帖子中所说。

一般来说,对于像 Heroku 这样的平台,或者使用像 Docker 这样的技术,应用程序预计是短暂的,专用的秘密管理工具是最好的方法。这个想法是应该有一个工具以加密形式保存秘密并在运行时将其提供给应用程序。

然后秘密可以存在于应用程序中,通常作为一个文件,可以根据需要从该文件中读取和使用秘密。

该领域的两个工具示例是Hashicorp VaultSquare 的 Keywhiz

除此之外,如果您在云上部署,通常云提供商应该有某种秘密管理工具,例如AWS Secrets Manager

我在 Heroku 上的秘密管理方面没有太多经验,但是他们似乎确实有一个名为ice的附加组件在该区域运行。