我最近一直在尝试使用 Docker 来构建一些可以使用的服务,而一直困扰我的一件事是将密码放入 Dockerfile 中。我是一名开发人员,因此将密码存储在源代码中感觉就像是一记重拳。这应该是一个问题吗?关于如何处理 Dockerfiles 中的密码,有什么好的约定吗?
最佳答案
这绝对是一个问题。 Dockerfile 通常被检入存储库并与其他人共享。另一种方法是提供任何凭据(用户名、密码、 token 、任何敏感信息)as environment variables at runtime .这可以通过 -e
参数(用于 CLI 上的单个变量)或 --env-file
参数(用于文件中的多个变量)到 docker运行
。阅读 this在 docker-compose 中使用环境。
使用 --env-file
绝对是一个更安全的选择,因为如果使用 set -x,这可以防止出现在
.ps
或日志中的 secret
然而,环境变量也不是特别安全。它们通过 docker inspect
可见,因此任何可以运行 docker
命令的用户都可以使用它们。 (当然,任何有权访问主机上的 docker
的用户也是 has root。)
我的首选模式是使用包装脚本作为 ENTRYPOINT
或 CMD
。包装器脚本可以在运行时首先将 secret 从外部位置导入到容器中,然后执行应用程序,提供 secret 。其确切机制因您的运行时环境而异。在 AWS 中,您可以使用 IAM 角色的组合,即 Key Management Service和 S3 将加密的 secret 存储在 S3 存储桶中。像 HashiCorp Vault或 credstash是另一种选择。
AFAIK 没有在构建过程中使用敏感数据的最佳模式。事实上,我有一个 SO question关于这个话题。您可以使用docker-squash从图像中删除图层。但是 Docker 中没有用于此目的的 native 功能。
你可能会发现害羞 comments on config in containers有用。
关于security - Docker 和保护密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22651647/