Docker:可以从结果图像中恢复在单个RUN命令中创建和删除的秘密吗?

时间:2017-05-30 19:17:37

标签: docker docker-build

我想在docker构建过程中使用一些密钥。所以我有想法将这些键作为构建参数注入构建过程。这应该是安全的。 official documentation states

  

此外,这些值不会像ENV值那样保留在中间或最终图像中。

以下是Dockerfile的示例:

FROM ubuntu:latest
ARG key
...
RUN echo $key > /tmp/key && doSomethingWithKey && rm /tmp/key
...

如您所见,我需要将此密钥粘贴到文件中。确保此密钥不会被烘焙"在最终图像中,我立即删除了密钥。

这是构建命令:

$ docker build --build-arg key="secret" .

现在我的问题是:这是安全的还是秘密密钥得到了存储"在最后的图像?

2 个答案:

答案 0 :(得分:2)

密钥不会存储在文件系统中,但会存储在图层元数据中,您可以在图片上看到docker history。因此,我建议不要这样做。

我最常见的是这个请求来自私人仓库的代码检查,其中登录到该仓库正在构建中使用。如果是这种情况,您应该在构建命令之前检查代码,然后从Dockerfile中执行已检出代码的COPY

答案 1 :(得分:2)

经过验证的答案:它会在最终图像中保留秘密值。

FROM alpine

ARG key
ARG securekey

RUN echo $key > /tmp/key
RUN echo $securekey > /tmp/securekey && rm /tmp/key


docker build . \
    --build-arg key=mykey-isnotsecure \
    --build-arg securekey=mykey-issecure -t test

使用docker save转储图片:

docker save test | strings | grep -o mykey............    

输出:

mykey-isnotsecure
mykey-issecure","
mykey-isnotsecure
mykey-isnotsecure
mykey-issecure","

正如BMitch所说:

docker history --no-trunc test
IMAGE                                                                     CREATED             CREATED BY                                                                                                     SIZE                COMMENT
sha256:e013810c5be50cffa0d9b5e723ec548cdcc686d99efdf792b2bda90baa0795c8   3 hours ago         |2 key=mykey-isnotsecure securekey=mykey-issecure /bin/sh -c echo $securekey > /tmp/securekey && rm /tmp/key   15 B
sha256:cabafd664056bc90ea9d71fafcdb65e4abe3d98a66c75066218fcf9a88962ba1   3 hours ago         |2 key=mykey-isnotsecure securekey=mykey-issecure /bin/sh -c echo $key > /tmp/key                              18 B
sha256:699ff2abecb92b13169a669d99c64fcc19c8d44590778c7b7ee944559208e81a   3 hours ago         /bin/sh -c #(nop)  ARG securekey                                                                               0 B
sha256:26aaa6f92951accc5cb21a13900f9cabee58f65119ffb0eb4b546c3ea19b3ce1   3 hours ago         /bin/sh -c #(nop)  ARG key                                                                                     0 B
sha256:a41a7446062d197dd4b21b38122dcc7b2399deb0750c4110925a7dd37c80f118   4 days ago          /bin/sh -c #(nop)  CMD ["/bin/sh"]                                                                             0 B
<missing>                                                                 4 days ago          /bin/sh -c #(nop) ADD file:ce33aabbc5f370e58ebe911e081ce093e3df18d689c2d5a5d092c77973f62a54 in /               3.97 MB

编辑。关于Time Machine事件的免责声明。

在我的Mac上:

▶ date
Tue May 30 16:45:39 ART 2017

我的容器是3小时轮班(ART vs UTC):

~
▶ docker run ubuntu date
Tue May 30 16:27:29 UTC 2017

ART == UTC-3