当前位置:  开发笔记 > 编程语言 > 正文

为什么不建议在DOCKERFILE中使用ARG来传递秘密?

如何解决《为什么不建议在DOCKERFILE中使用ARG来传递秘密?》经验,为你挑选了2个好方法。

在http://docs.docker.com/engine/reference/builder/#arg中,它建议秘密不通过ARGS传递.

注意:建议不要使用构建时变量来传递github密钥,用户凭据等秘密.

什么时候秘密通过构建时变量传递到危险之中?



1> VonC..:

2018年8月更新:

你现在有了docker build --secret id=mysecret,src=/secret/file.
请参阅" 在Docker中使用构建时参数的安全方法 ".

2017年1月更新:

Docker(swarm)1.13有docker secret.

然而,正如评论由史蒂夫·霍夫曼(bacoboy):

[...] secret命令只能帮助swarm用户不是更通用的解决方案(就像他们附加持久卷一样).
你如何管理你的秘密(它们是什么以及谁有权访问它们)是依赖于系统的,取决于你拼凑的付费和/或OSS的哪些部分来构建你的"平台".
随着Docker公司开始提供一个平台,我并不感到惊讶,因为Hashicorp正在将Vault集成到Atlas中,他们的第一个实现是基于swarm的 - 这是有道理的.

真的如何通过秘密落在空间之外docker run.
AWS使用角色和策略来执行此类操作以授予/拒绝权限以及SDK.
Chef使用加密的数据库和加密"bootstrapping"进行身份验证.
K8S有自己的1.13版本.
我确信mesos会及时添加类似的实现.

这些实现似乎分为两个阵营.

通过"平台"提供的卷安装或(厨师/码头秘密/ k8s)传递秘密

传递凭证与外部服务通信,以便在启动时获取内容(iam/credstash/etc)


原答案:2015年11月

这是在PR 15182的commit 54240f8(docker 1.9,2015年11月)中介绍的,

构建环境预先附加到中间continer的命令字符串以帮助缓存查找.
它还有助于构建可追溯性.但是,从传递构建时间秘密的角度来看,这也使得该功能的安全性降低.

问题13490重申:

构建时环境变量:构建时环境变量不是为处理机密而设计的.由于缺乏其他选择,人们计划将其用于此目的.为了防止给人以适合秘密的印象,我们决定故意不加密这些变量.

如9176 评论中所述:

env变量是传递秘密的错误方法.我们不应该试图重新发明轮子并提供开箱即用的残缺安全分配机制.

当您将密钥存储在环境中时,您很容易意外地暴露它们 - 这正是我们想要避免的:

鉴于环境可以隐式地用于流程,跟踪访问以及内容如何暴露是非常困难的,如果不是不可能的话

应用程序抓取整个环境并将其打印出来是非常常见的,因为它可用于调试,甚至可以将其作为错误报告的一部分发送.如此多的秘密被泄露给PagerDuty,他们有一个良好润滑的内部流程来从他们的基础设施中擦除它们.

环境变量向下传递给子进程,这允许非预期的访问并打破最小权限原则.想象一下,作为应用程序的一部分,您可以调用第三方工具来执行某些操作,突然之间第三方工具可以访问您的环境,上帝知道它将如何处理它.

对于崩溃的应用程序来说,将环境变量存储在日志文件中以供以后调试是很常见的.这意味着在磁盘上以纯文本形式保密.

将密码置于env变量中很快就会变成部落知识.新工程师不知道他们在那里,并且不知道他们在处理环境变量时应该小心(将它们过滤到子流程等).

总的来说,env变量中的秘密打破了最不惊讶的原则,这是一种不好的做法,并且会导致最终泄露的秘密.


这个答案是我见过的最好的答案,但很多这些评论都是指ENV而不是ARG.另外,没有提到推荐的方法将秘密传递给构建的推荐方法实际上是......
据我所知,VonC [尊重:]]回答了这个问题,但仍有一个问题是我们应该如何管理秘密并将它们传递给dockerfiles和/或最终组成......

2> Ash Berlin-T..:

原因很简单,通过简单地在图像上运行,任何拥有图像的人都可以看到秘密的价值history.

拿这个示例docker文件:

FROM alpine

ARG secret

RUN echo "${secret}"

(很简单,只是为了说明你如何使用秘密.)

然后我们建立它 $ docker build --build-arg secret=S3CR3T - < Dockerfile

Sending build context to Docker daemon 2.048 kB
Step 1 : FROM alpine
 ---> 13e1761bf172
Step 2 : ARG secret
 ---> Running in 695b7a931445
 ---> 5414c15a1cb6
Removing intermediate container 695b7a931445
Step 3 : RUN echo "${secret}"
 ---> Running in c90cf0d1414b
s3cr3t
 ---> f2bcff49ac09
Removing intermediate container c90cf0d1414b
Successfully built f2bcff49ac09

以及如何让"秘密"退出的例子(|1 secret=在第一行查找):

$ docker history f2bcff49ac09
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
f2bcff49ac09        8 seconds ago       |1 secret=S3CR3T /bin/sh -c echo "${secret}"    0 B
5414c15a1cb6        8 seconds ago       /bin/sh -c #(nop) ARG secret                    0 B
13e1761bf172        6 months ago        /bin/sh -c #(nop) ADD file:614a9122187935fccf   4.797 MB

如果您已在本地构建映像或从注册表中提取映像,则会出现这种情况.

如果您的目标是将构建时秘密保留在正在运行的容器之外,那么使用ARG会对您有所帮助 - 请考虑以下事项:

$ docker run --rm -ti f2bcff49ac09 sh
/ # env
HOSTNAME=7bc772fd0f56
SHLVL=1
HOME=/root
TERM=xterm
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/
$ # Note no secret in the above output

推荐阅读
郑谊099_448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有