与在环境变量中存储机密(密码、API 密钥)相比,Hashicorp Vault 有哪些安全优势?

信息安全 网络服务器 秘密分享 环境变量 哈希公司保险库
2021-09-06 21:32:57

似乎普遍建议将机密存储在 Hashicorp Vault 实例(或类似的密钥管理软件)中,并避免通过环境变量传递机密。从安全角度来看,在哪些特定场景中使用 Vault 比使用环境变量更好?

1个回答

Vault 的承诺是“秘密即服务”。它支持秘密的静态存储(想想加密的 Redis/Memcached)、直通加密(提供 Vault 明文,Vault 回馈您存储在数据库中的密文)和动态秘密获取。

在事物的静态秘密方面,数据在传输和静止时被加密。数据可以存储在内存、文件系统或第三方工具(如 Etcd 或 Consul)中。这对于应用程序级机密非常有用。Vault 支持基础加密密钥的在线轮换。如果您有 FIPS/HIPPA/PCI 合规性要求,Vault 可以使用默认配置轻松检查大多数这些框。

通过直通加密(或内部称为“传输”),Vault 充当加密服务,接受明文数据,对其进行加密并返回密文。我更详细地写了这个过程在 HashiCorp 博客上,但过程很简单。然后,此密文由您的应用程序管理。当应用程序需要返回明文时,它会向 Vault 进行身份验证和授权,向 Vault 提供密文,然后 Vault 返回明文(再次,如果授权)。这里有很多好处,但最大的好处是: 1. 您不必在应用程序中构建对称加密服务;只需进行 API 调用,并且 2. 加密密钥存储在完全独立且隔离的服务中;如果攻击者必须破坏多个系统。此外,Vault 的传输后端支持称为“派生密钥”的概念。这为存储在数据库中的数据启用了诸如每行加密密钥之类的东西,这样即使攻击者有数据库转储并且可以暴力破解第一个加密密钥,该密钥不会解密数据库中的其他行。就像静态秘密后端一样,中转后端支持密钥轮换。

在我看来,动态秘密后端是 Vault 真正区别于其他或本土解决方案的地方。Vault 可以连接到数据库、云凭据、CA 证书、管理 SSH 访问等,并从这些内容动态生成凭据。与传统凭证不同,这些凭证具有与之关联的租约,类似于 DNS 或 DHCP。当应用程序获得凭证时,它也会被授予该凭证的“租约”或生命周期。随着时间的推移,应用程序(或服务)必须与 Vault 沟通它仍在使用该凭据,否则 Vault 将撤销它。这有助于消除秘密蔓延,同时仍然提供访问凭证的编程方式。由于这是程序化的,应用程序的每个实例(或您的示例中的 python 脚本)都会收到不同的秘密。您可以轻松撤销单个应用程序的凭据,而不会影响整个系统。

以下是一些可以帮助您获得内部支持的用例:

  1. 使用 Vault 的GitHub 身份验证来验证您的开发人员和操作员。GitHub 团队成员身份映射到 Vault 中的策略。运营团队中的任何人都可以通过 SSH 访问产品,开发团队中的任何人都可以在暂存环境中生成动态 AWS 账户凭证以进行测试。

  2. 使用 Vault 的AppRole 身份验证让应用程序向 Vault 进行身份验证并检索令牌。从那里,应用程序的策略允许它检索启动数据,例如数据库凭据。如果应用程序崩溃,则数据库凭据会在租约到期时自动撤销。

  3. 您已检测到数据泄漏。您可以立即撤销所有受影响的凭据。这称为“碎玻璃”程序。

作为附加说明,您可以使用Consul Template 之类的工具将值从 Vault 提取到模板中,然后您的应用程序可以使用该模板。您的应用程序不需要“知道保险柜”。

最后,可能与帖子中的问题无关,但值得指出的是,Vault 还解决了大多数组织面临的“没有人可以完全访问系统”的挑战。通过使用Shamir 的秘密共享算法,将 Vault 服务器上线的过程与解锁传统银行 Vault 的过程非常相似——多人必须同时输入他们的密钥才能解锁。您还可以阅读有关Vault 安全模型的更多信息

对于有演示和内容的视频,请查看: