在我们与客户的多次对话中,Docker 密钥管理已成为一个特别棘手的问题,似乎缺乏针对容器环境的优雅、跨平台的解决方案。这在企业领域并不是一个新问题,尤其是与大规模 DevOps 环境有关的问题,在容器环境中,管理密钥的挑战变得更加严重。
Verboten 快捷方式
很多时候,用户会走不安全的 “捷径” 将 secret 与容器一起使用,这可能会让他们的生活更轻松,但会让他们的组织面临风险。
一种快捷方式是将密钥放在容器映像中。从安全角度来看,这类似于将您的银行登录凭证放在键盘底部的便利贴上。这是一个不,不。如果密钥嵌入到容器映像中,则在整个管道中处理该映像的任何人都可以访问它,更糟糕的是,每当从映像实例化容器时,它就会在那里 - 在无法预测和控制的环境中。
另一个稍微好一点的捷径是使用 Docker 环境变量在运行时为容器提供密钥。这是一种更好的方法,因为密钥仅“存在于”特定的运行时环境中,但它仍然将密钥暴露给有权访问主机的用户,因为环境变量可以在 docker inspect <容器 id>
输出和 /proc/<pid>/environ
中查看。在 Aqua,我们早在 2016 年 6 月引入环境变量加密时就填补了这个特殊的安全漏洞。但是,使用环境变量传递密钥仍然不是一种可扩展的有效密钥管理方式,并且它仍然会在编排工具中留下未加密密钥值的痕迹。
在容器中包含 Secret
在企业环境中已经有经过验证的 Docker 密钥管理方法,例如使用 HashiCorp Vault。显然,机密的中央存储库应该通过用户访问控制进行加密和保护。但是,对于容器,还必须解决 4 个独特的挑战:
-
管理哪些容器可以访问哪些密钥:密钥应该只对实际需要它们的容器访问——这必须在容器级别完成。您需要一种机制,允许将 secret 映射到相关容器,然后指示哪个容器正在使用哪个 secret。
-
您何时实际从文件库中检索密钥?如上所述,将密钥放在容器映像中会将其暴露给比所需更多的用户和进程,并使其面临被滥用的危险。在容器和它需要的 secret 之间建立连接的正确时间是在容器运行时,而不是之前。
-
密钥检索后如何存储在容器中?容器在运行时必须有权访问密钥,但密钥不应存储在磁盘上或在主机级别公开。应从内存中检索密钥,并且检索方式应仅由相关容器访问。容器停止后,密钥将消失。
-
如何处理秘密轮换?密钥可能会随时间而变化。例如,数据库密码可能会在一段时间后更改,以降低暴露风险。在这种情况下,您需要一个足够智能的系统,以便使用新值更新当前正在使用该密钥的所有容器。
使用 Aqua 管理密钥
在我们的容器安全平台 2.0 版本中,我们为容器引入了完整的 Docker 密钥管理解决方案,并与 HashiCorp Vault 集成。
我们的解决方案允许您集中管理密钥和容器对密钥的访问,并实时查看哪些容器正在使用这些密钥。它在运行时将密钥注入容器,并确保密钥存储在内存中,并且只有指定的容器才能访问。
扫描图像中的 Secret
映像漏洞扫描程序可发现可能存储在映像中的密钥 – AWS 令牌、SSH 密钥或明文密码等密钥。现在,每当运行映像扫描(通常作为 CI/CD 构建的一部分)时,如果您的映像包含潜在的机密,您都会收到通知。
阅读有关管理和保护 Kubernetes 密钥的信息
原文始发于微信公众号(菜鸟小新):Docker 密钥管理的挑战
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论