我最近一直在试验Docker,以构建一些可玩的服务,而一直困扰我的一件事是将密码放入Dockerfile。我是一名开发人员,因此将密码存储在源代码中感觉像是一拳。这是否值得关注?关于如何在Dockerfiles中处理密码是否有良好的约定?
绝对是一个问题。Dockerfile通常签入存储库并与其他人共享。一种替代方法是在运行时提供任何凭据(用户名,密码,令牌,任何敏感内容)作为环境变量。通过-e参数(对于CLI上的各个var)或--env- file参数(对于文件中的多个变量)可以做到这一点docker run。阅读本文,了解如何将环境与docker-compose结合使用。
-e
--env- file
docker run
使用--env-file绝对是更安全的选择,因为这样做可以防止出现秘密(ps如果使用的话)set -x。
--env-file
ps
set -x
但是,env var也不是特别安全。通过可以看到它们docker inspect,因此,任何可以运行docker命令的用户都可以使用它们。(当然,任何有权访问docker主机的用户也都具有root用户。)
docker inspect
docker
我的首选模式是将包装脚本用作ENTRYPOINT或CMD。包装器脚本可以首先在运行时从外部位置将机密导入容器中,然后执行应用程序以提供机密。具体的运行机制取决于您的运行时环境。在AWS中,您可以结合使用IAM角色,密钥管理服务和S3将加密的机密存储在S3存储桶中。像HashiCorp Vault或credstash之类的东西是另一种选择。
ENTRYPOINT
CMD
AFAIK没有使用敏感数据作为构建过程一部分的最佳模式。实际上,我对此主题有一个特别的问题。您可以使用docker-squash从图像中删除图层。但是Docker中没有用于此目的的本机功能。
您可能会发现容器中有关config的摇晃注释很有用。