当前位置: 首页 > 面试题库 >

为什么不建议将DOCKERFILE中的ARG传递给机密?

洪星文
2023-03-14
问题内容

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

注意:不建议使用构建时变量来传递诸如github密钥,用户凭据等秘密信息。

通过构建时变量传递的机密在什么时候处于危险之中?


问题答案:

2018年8月更新:

您现在有了docker build --secret id=mysecret,src=/secret/file

2017年1月更新:

Docker(swarm)1.13具有dockersecret

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

[…] secret命令只能帮助群集用户,而不是更通用的解决方案(就像他们附加持久卷一样)。
您如何管理您的秘密(它们是什么,谁可以访问它们)在很大程度上取决于系统,并且取决于您拼凑哪些付款和/或OSS来构成“平台”。
随着Docker公司开始提供平台,我并不感到惊讶,因为Hashicorp将Vault集成到Atlas时,他们的第一个实现是基于群体的-这很有意义。

秘密的传递方式真的不在太空的范围内docker run
AWS通过授予/拒绝权限的角色和策略以及一个SDK来执行此类操作。
Chef使用加密的数据包和加密“引导程序”进行身份验证。
K8S具有自己的版本,该版本刚在1.13中发布。
我确定mesos会及时添加类似的实现。

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

  • 通过“平台”提供的卷装载传递秘密(或(厨师/码头工人秘密/ k8s
  • 传递凭据以与外部服务对话以在启动时进行操作(iam / credstash / etc)

原始答案:2015年11月

这是在PR 54182的commit
54240f8(docker
1.9,2015年11月)中引入的,

构建环境位于中间容器的命令字符串之前,以帮助查找缓存。
它还有助于构建可追溯性。但是,从传递构建时间秘密的角度来看,这也使功能不太安全。

第13490期重申:

构建时环境变量
:构建时环境变量并非旨在处理机密信息。由于缺乏其他选择,人们正计划将其用于此目的。为了避免给人以它们适合秘密的印象,已决定在此过程中不对那些变量进行加密。

如9176条
评论中所述:

env变量是传递秘密的错误方法。我们不应该试图重新发明轮子,并立即提供一个严重的安全分发机制。

当您将秘密密钥存储在环境中时,您很容易不小心暴露它们-正是我们想要避免的事情:

  • 鉴于该环境对于该过程隐式可用,因此很难(即使不是不可能)跟踪访问以及如何公开内容
    * 让应用程序获取整个环境并打印出来是非常常见的,因为它对于调试非常有用,甚至可以作为错误报告的一部分发送。如此多的机密泄露给PagerDuty,以至于他们拥有一个完善的内部流程来将其从基础结构中清除。
    * 环境变量向下传递给子进程,这允许意外访问并破坏了最小特权原则。想象一下,在您的应用程序中,您调用了第三方工具来执行某些操作,突然之间,第三方工具可以访问您的环境,而上帝知道该怎么做。
  • 对于崩溃的应用程序,将环境变量存储在日志文件中以供以后调试是很常见的。这意味着磁盘上的纯文本机密。
  • 将秘密放入环境变量中很快就会变成部落知识。新工程师不知道他们在那里,也不知道在处理环境变量(将它们过滤到子流程等)时应该小心。

总体而言,env变量中的机密违反了最不令人惊讶的原则,是一种不良做法,并会最终导致机密泄露。



 类似资料:
  • 这里是Gradle 2.14和Groovy 2.4.7。我有以下groovy:

  • 问题内容: 如何将主机环境变量(例如用户名和主机名)传递给dockerfile? 例如,如果我的用户名是: 如何编写Docker文件以获得相同的输出? 问题答案: 我遇到了同样的问题。我的解决方案是在docker-compose.yml内部提供变量,因为yml支持使用环境变量。 我认为这对我来说是最有效的方式,因为我不喜欢在命令行中使用类似以下内容一遍又一遍地键入它 在容器中,声明将无效,将设置为

  • 问题内容: Docker 1.9允许将参数传递给dockerfile。参见链接:https : //docs.docker.com/engine/reference/builder/#arg 我该如何在ENTRYPOINT指令中传递相同的药品? 我的dockerfile有 ARG $ Version = 3.1 ENTRYPOINT /tmp/folder-$Version/sample.sh开始

  • 问题内容: 为什么此代码无法编译? 为什么我不能将类变量传递给? 问题答案: 该操作符对引用类型,像,而不是对象,如。您可能想要类似 旁注:如果编写,您的代码将更加简洁 但是,我不确定是否需要某种方法。

  • 问题内容: 我正在A中使用RUN指令安装rpm 但是,我想将值“ 2.3”作为参数传递。我的RUN指令应类似于: 哪里 问题答案: 您正在寻找和指导。这些是Docker 1.9中的新功能。查看https://docs.docker.com/engine/reference/builder/#arg。这将允许您添加到,然后使用构建。

  • 问题内容: 为什么经常被称为 代替 ? W3,MDN和MSDN都声明它是可选的。此外,ActiveX控件似乎不需要参数: 这种做法至少可以追溯到2005年的Google Maps中 ,但被缩小了,没有任何解释: 问题答案: 如果您看一下XMLHttpRequest的旧规范,似乎W3C似乎并不需要在某一点上将该参数设为可选,这可能导致人们提供了一个明确的null值,以防万一。 (搜索“应支持发送”)