如何在 Docker 容器中安全地存储机密?

信息安全 秘密分享 码头工人 aws 环境变量
2021-09-06 01:40:44

我正在开发的应用程序有十几个秘密、SSL 证书和 API 密钥。目前我有一个添加到其中的文件,.gitignore其中包含我所有的秘密。如何安全地存储所有这些秘密?企业应用程序如何处理这个问题,安全性是重中之重?

我正在研究 AWS KMS,据我了解,我必须加密所有秘密,提交它,然后在运行时传递我的 AWS 凭证以解密秘密(用户只允许使用 KMS 密钥进行解密,没有为用户添加其他权限)。

现在,假设运行容器的机器受到威胁 - 秘密被加密,所以应该没问题,但是!如果docker inspect运行命令,它将显示所有环境变量(AWS 机密),所以我执行到容器中,我所要做的就是使用 env 变量来解密机密.. 有点违背了目的,或者我可能是在某处错过了一步?

注意:我当前的解决方案也不安全 - 文件被 gitignored,但它仍然存在于运行容器的机器上(稍后,在构建映像后,它们作为 env 变量公开)。

注 2:Git repo 是私有的

2个回答

Docker Secrets是在容器内共享和存储秘密的新推荐方法。Docker 故意选择在/run/secrets环境变量方法下将机密存储在文件中。

一般来说,您必须为运行容器的实例假设比容器本身更严格的安全性,因为正如您所指出的,那里的妥协会影响下游的一切。这与运行您的 ec2 实例的 VM 主机相同。

一个标准的解决方案是通过环境变量将秘密传递到容器中。我还看到了一些解决方案(用于存储在 Hashicorp Vault 中的机密),这些解决方案创建了一个安装到容器中的熔断文件系统,或者使用 Docker 卷驱动程序的类似方法。这并不那么简单,但如果你传递了很多秘密,可能会更容易。