我最近一直在尝试使用Docker来构建一些服务,有一件事一直困扰着我,那就是把密码放在Dockerfile中。我是一名开发人员,所以在源代码中存储密码感觉就像是在脸上打了一拳。这是否应该引起人们的关注?关于如何处理Dockerfile中的密码,有什么好的约定吗?
发布于 2014-03-26 13:59:08
这肯定是一个令人担忧的问题。Dockerfile通常签入到存储库并与其他人共享。另一种方法是提供任何凭据(用户名、密码、令牌、任何敏感内容) as environment variables at runtime。这可以通过docker run
的-e
参数(对于CLI上的单个var)或--env-file
参数(对于文件中的多个变量)来实现。阅读this了解如何通过docker-compose使用环境。
使用--env-file
绝对是一个更安全的选择,因为如果使用set -x
,它可以防止出现在ps
或日志中的秘密。
但是,env var也不是特别安全。它们通过docker inspect
可见,因此任何可以运行docker
命令的用户都可以使用它们。(当然,任何有权访问主机上的docker
的用户也可以使用has root。)
我更喜欢的模式是使用包装器脚本作为ENTRYPOINT
或CMD
。包装器脚本可以首先在运行时将机密从外部位置导入到容器中,然后执行应用程序,提供机密。根据您的运行时环境的不同,具体的机制会有所不同。在亚马逊网络服务中,您可以使用IAM角色、Key Management Service和S3的组合在S3存储桶中存储加密的秘密。像HashiCorp Vault或credstash这样的东西是另一种选择。
AFAIK对于使用敏感数据作为构建过程的一部分,没有最佳模式。事实上,我有一个关于这个话题的SO question。可以使用docker-squash从图像中删除图层。但Docker中没有用于此目的的原生功能。
你可能会发现shykes comments on config in containers很有用。
发布于 2015-08-01 06:41:29
我们的团队避免将凭据放入存储库中,因此这意味着它们在Dockerfile
中是不允许的。我们在应用程序中的最佳实践是使用来自环境变量的证书。
我们使用docker-compose
来解决这个问题。
在docker-compose.yml
中,您可以指定一个包含容器环境变量的文件:
env_file:
- .env
确保将.env
添加到.gitignore
,然后在.env
文件中设置凭据,如下所示:
SOME_USERNAME=myUser
SOME_PWD_VAR=myPwd
将.env
文件存储在本地或团队其他成员可以获取的安全位置。
请参阅:https://docs.docker.com/compose/environment-variables/#/the-env-file
发布于 2017-07-14 01:40:44
Docker现在(版本1.13或17.06及更高版本)支持管理秘密信息。下面是一个overview和更详细的documentation
在kubernetes和DCOS中也存在类似的功能
https://stackoverflow.com/questions/22651647
复制相似问题