本文的翻译是专门为Linux安全课程的学生准备的。
在本文中,我们将重点关注Docker并讨论技巧和窍门,这些技巧和窍门为处理Docker映像提供了更安全和高质量的过程。
因此,让我们从10个Docker映像安全最佳实践的清单开始。
1.偏好基本图像
通常,您可以使用基本的Docker容器映像启动项目,例如,通过“默认”使用
FROM node
编写
Dockerfile
。 但是,在指定节点映像时,请记住,完全安装的Debian Stretch发行版是用于构建它的基础映像。 如果您的项目不需要任何通用的系统库或实用程序,那么最好避免使用功能齐全的操作系统(OS)作为基本映像。
在
《 2019年Snyk开源安全状态报告》中,我们发现Docker Hub网站上的许多流行Docker容器都包含包含许多已知漏洞的映像。 例如,当您使用流行的通用
docker pull node
映像时,实际上是将操作系统输入到应用程序中,如您所知,该应用程序的系统库中有580个漏洞。

从安全报告中可以看到,我们在Docker Hub中测试的十个最受欢迎的Docker镜像中的每个镜像都包含已知漏洞。 首选只包含运行项目所需的必要系统工具和库的最小映像,还可以最大程度地减少攻击者进行攻击的空间并确保提供安全的OS。
了解有关图像安全性的更多信息2.最低特权用户
当
Dockerfile
未指定
USER
,默认情况下,容器以root用户身份运行。 实际上,为什么容器必须具有root用户特权的原因很少。 Docker默认使用root用户启动容器。 然后,当将此名称空间映射到正在运行的容器中的root用户时,可以得出结论,该容器可能在Docker主机上具有root用户访问权限。 在具有root用户的容器中运行应用程序可进一步扩大攻击空间,并在应用程序本身容易受到攻击时提供一种简便的提升特权的方法。
为了最大程度地减少曝光,请在Docker映像中为应用程序创建专用的用户和组; 在
Dockerfile
使用
USER
指令来验证容器是否以特权最少的访问来启动应用程序。
图像中可能不存在专用用户; 使用
Dockerfile
的说明创建该用户。
以下是如何针对通用Ubuntu映像执行此操作的完整示例:
FROM ubuntu RUN mkdir /app RUN groupadd -r lirantal && useradd -r -s /bin/false -g lirantal lirantal WORKDIR /app COPY . /app RUN chown -R lirantal:lirantal /app USER lirantal CMD node index.js
上面的例子:
- 创建没有密码,没有安装主目录和没有shell的系统用户(-r)
- 将我们创建的用户添加到我们预先创建的现有组中(使用groupadd)
- 将最后一个参数添加到我们要创建的用户名中,并结合我们创建的组
Node.js和高山图像,它们已经包含一个名为
node
的通用用户。 这是使用通用用户节点的示例Node.js:
FROM node:10-alpine RUN mkdir /app COPY . /app RUN chown -R node:node /app USER node CMD [“node”, “index.js”]
如果您正在开发Node.js应用程序,则可以参考官方的
Docker和Node.js最佳实践 。
3.签名并验证映像以避免MITM攻击
Docker映像的真实性是一个问题。 我们依赖这些图像,因为我们实际上将它们用作在生产环境中运行我们的代码的容器。 因此,重要的是要确保我们使用的图像恰好是发布者提供的图像,并且双方都没有改变它。 伪造可以通过Docker客户端与注册表之间的有线连接或通过黑客入侵所有者帐户的注册表来替换映像来进行。
验证Docker映像
默认Docker设置允许您在不验证其真实性的情况下检索Docker映像,这可能导致使用未经验证来源和作者的Docker映像。
建议您始终在使用图像之前先对其进行验证,而不管其政策如何。 要进行验证试验,请使用以下命令临时启用Docker Content Trust:
export DOCKER_CONTENT_TRUST=1
现在,尝试拉出您知道尚未签名的图像-请求将被拒绝,并且图像将不会被接收。
签名Docker映像
首选来自受过Docker Hub验证和监督的受信任合作伙伴的
Docker认证映像,而不是无法验证其来源和真实性的映像。
Docker允许您对图像进行签名,从而提供了另一种保护级别。 要签名图像,请使用
Docker Notary 。 公证人会为您检查图像签名,如果图像签名无效,则会阻止启动图像。
如上所示,启用Docker Content Trust后,Docker映像的程序集会对映像进行签名。 首次登录映像时,Docker会为您的用户创建私钥并将其存储在
~/docker/trust
中。 然后,使用此私钥在创建任何其他图像时对它们进行签名。
有关设置签名映像的详细说明,请参阅
官方Docker文档 。
4.查找,修复和跟踪开源组件中的漏洞
当我们为Docker容器选择基本映像时,我们间接承担了与基本映像相关联的所有安全问题的风险。 这些设置可能是配置不当的默认设置,它们对操作系统以及与我们选择的基本映像相关联的系统库的安全性没有帮助。
一个好的第一步是使用最小的基本映像来运行应用程序而不会出现问题。 通过限制漏洞,有助于减少攻击空间; 另一方面,它不会自行进行任何检查,也不会保护您免受将来可能针对使用的基本映像版本识别的漏洞。
因此,一种防止开源软件中的漏洞的方法是使用诸如Snyk之类的工具添加对所使用的Docker映像的所有层中可能存在的漏洞的连续扫描和跟踪。

使用以下命令在Docker映像中扫描已知漏洞:
监控Docker映像中的已知漏洞,以便在发现Snyk映像中的新漏洞之后,可以通知并提供有关如何修复它的建议,如下所示:
$ snyk monitor --docker node:10
根据Snyk用户执行的扫描,我们发现44%的Docker映像扫描显示了已知漏洞,并且可以使用更新的,更安全的基本映像。 Snyk独有的此修订咨询,使开发人员可以采取行动并更新其Docker映像。
Snyk还发现,对于所有Docker映像扫描的20%,只需重建Docker映像以
减少漏洞 。 在Snyk博客上找到有关2019年开放安全报告数量的更多信息。
第一部分结束。
在第二部分中继续,现在我们邀请所有人参加有关该主题的免费网络研讨会: “ Docker漏洞。 随着特权的提升,从容器逃逸到主机 。 ”