有没有办法在docker 1.10之后访问从中间层删除的文件?

时间:2017-10-11 21:39:23

标签: security docker dockerfile docker-build

在docker 1.10之后,docker history如果从其他地方拉出图像,则不再显示图像的中间层,而不是在本地构建。

This github issue讨论了这一变化,并提到使用docker savedocker load,您可以将中间层用作缓存。

这是否意味着,如果图像是构建的并且只是上传到存储库(即没有tar文件),那么下载图像的人无法恢复中间层?

我特别想知道的是:

COPY sensitive_file .
RUN do_something_with ./sensitive_file
RUN rm ./sensitive_file

是否可以像上面那样编写Dockerfile,并假设(除非docker中存在未知漏洞),其他人无法访问此敏感文件?

我知道还有其他方法可以处理凭据或敏感文件,例如设置本地服务器和RUN wget file && use file && rm file,使用swarm设置docker secret或使用docker vault。我不是在寻找处理敏感文件的不同方法;相反,我只是感兴趣,如果上述方法使文件可访问或不。谢谢!

2 个答案:

答案 0 :(得分:1)

即使您没有每个图层的图片ID,图片仍然以图层形式发货。您可以在。docker image inspect $image_name下的.RootFS.Layers部分中看到。

这些图层存储在硬盘驱动器上,并且可以根据所使用的存储驱动程序轻松访问。至少使用overlay2,这在.GraphDriver部分下的docker image inspect输出中可见。

最后,您可以在任何已从注册表中提取图像副本的docker引擎上使用docker save,将其转换回包含每个图层作为tar文件的tar文件。因此,通过注册表传输图像不会消除此攻击媒介。

答案 1 :(得分:0)

Docker Images由一个或多个文件系统层组成。 Dockerfile中修改文件系统的每个命令都将创建一个新的文件系统层。从较高层删除后,敏感文件将保留在其图层中(后续Dockerfile步骤)。

您需要导出/导入构建的图像以展平图像图层,并从使用建议步骤构建的图像中删除敏感文件。