该文章翻译自:https://resources.whitesourcesoftware.com/blog-whitesource/docker-container-security
Docker近年来的大规模应用使容器安全成为使用容器进行开发或生产的组织的关键考量。鉴于在Docker被广泛使用之前,容器技术在许多方面都比虚拟机和其他部署技术更为复杂,因此保护Docker容器的安全也同样很复杂。
在本文中,我们将概述Docker容器的安全性。我们将说明为何保护Docker容器将有很大挑战,以及应更改Docker环境中的哪些默认设置以使您的容器更安全,最后还有关于监测容器安全时应遵循的最佳做法。
Docker容器安全:挑战
在使用Docker之前,大多数组织都使用虚拟机或裸金属服务器托管应用程序。从安全角度来看,这些技术相对简单。在加强部署和监视与安全相关的事件时,您只需要关注两层(主机环境和应用程序)。通常,您并不需要担心API、覆盖网络或复杂的软件定义的存储配置,因为它们通常不是虚拟机或裸金属部署的主要部分。
Docker容器的安全性更加复杂,这在很大程度上是因为典型的Docker环境包含许多活动部件。包括:
- 容器。您可能有多个Docker容器镜像,每个镜像都承载了单独的微服务。而在某个特定时刻,一个镜像还可能会有许多运行的实例。而每一个镜像和实例都需要您分别进行保护和监视;
- Docker守护程序,需要对其进行保护以确保其托管的容器的安全;
- Docker主机服务器,可以是裸金属服务器或虚拟机;
- 如果是将容器托管在云上使用ECS之类虚拟服务器的话,则还需要保护云上主机的安全;
- 可促进容器之间通信的覆盖网络和API;
- 容器外部的数据卷或其他存储系统;
因此,如果您觉得学习如何保护Docker容器很困难,请不要怪自己。Docker安全确实比其他安全方法更为复杂。
Docker容器安全:最佳实践
幸运的是,上面的挑战是可以克服的。然而本文并不准备写一份详尽的Docker安全指南(为此,您应该参考Docker官方文档),但以下是一些可以帮助您的最佳实践。
#1 设置资源配额
Docker易于实现的一件方便的事情是在每个容器的基础上配置资源配额。资源配额允许您限制容器可以占用的内存和CPU。
它不仅可以帮助保持您Docker环境的高效,防止一个容器或应用程序过度的占用系统资源。它还可以通过防止被已攻破的容器消耗大量资源来破坏服务或执行恶意活动来增强系统安全性。
使用命令行可以轻松设置资源配额。有关完整的详细信息,请参阅Docker文档。
#2 不要以root身份运行
我们知道,为了避免程序运行过程中种种权限设置问题,您喜欢直接以root用户身份运行它。
如果您是第一次学习使用Docker,那么在Docker测试环境中这样做可能是可以的,但是在生产环境中,几乎没有一个很好的理由让Docker容器以root权限运行。
这是一个易于遵循的Docker安全性最佳实践,因为Docker默认情况下就是不以root用户身份运行容器。因此,通常无需更改默认配置即可阻止以root用户身份运行。但是,您必须经受住使用root权限运行容器的诱惑,不能因为在某些情况下它更方便。
如果您使用Kubernetes编排容器,则可以使用POD安全策略中的MustRunAsNonRoot指令显式阻止容器以root身份启动(即使管理员尝试手动启动一个容器),以增强Docker安全性。
#3 保护您的容器注册表
容器注册表是Docker如此强大的部分原因。它们使您可以轻松地建立一个中央存储库,在此以后您只需要敲击几下键盘就可以从中下载容器镜像。
但是,如果您无法评估正在使用的注册表的安全上下文,那么容器注册表的简便性可能会带来安全风险。理想情况下,您将使用诸如Docker Trusted Registry之类的注册表,将其安装在自己的防火墙后面,以减轻来自Internet的破坏风险。
即使只能从防火墙后面访问注册表,您也应避免让任何人随意从注册表中上传或下载镜像。取而代之的是,使用基于角色的访问控制来明确定义谁可以访问什么,并将其他人的访问权限列入黑名单。尽管为了使访问更简单,并避免在新用户需要访问时避免配置新角色而让任何人都可以访问注册表很诱人,但是如果这样做可以防止注册表中的违规行为,那么这种不便之处还是值得的。
#4 使用受可信的安全镜像
说到注册表,您还应该确保您提取的容器镜像来自受信任的来源。这看起来似乎太简单了,但是鉴于互联网上有众多的公共可用容器镜像可以快速下载,因此很容易从未经验证或不信任的来源意外提取镜像。
因此,您应该考虑将官方信任的存储库(例如Docker Hub上的公共存储库)以外的公共容器注册表列入黑名单。
您还可以利用镜像扫描工具来帮助识别Docker镜像中的一些已知漏洞。大多数企业级容器注册表具有内置的扫描工具。其中的某些文件(例如Clair)也可以与注册表分开使用,以扫描单个镜像。
#5 确定代码来源
另外,继续上面容器镜像的主题-请记住,Docker镜像通常包含原始代码和来自上游来源的程序包。因此,即使您下载的镜像来自受信任的注册表,该镜像也可能包含来自其他可能不受信任来源的软件包。更复杂的是,这些程序包本身可以由从多个来源(包括第三方开放源代码存储库)中提取的代码组成,尽管从程序包本身来看,代码的来源可能并不总是很清楚。
在这种情况下,源代码分析工具很有用。通过对下载的Docker镜像中所有软件包的源代码进行扫描以识别代码的起源,您可以确定容器镜像中并入的任何代码是否包含已知的安全漏洞。(另一个好处是,源代码分析还可以帮助您保持涉及第三方代码的许可要求,即使您使用的软件包未提及其他许可,这也可能会影响您。)
#6 API和网络安全
如上所述,Docker容器通常严重依赖API和网络进行相互通信。这就是为什么必须确保安全得设计API和网络体系结构,并监视API和网络活动中是否存在可能表示入侵的异常。
由于API和网络不是Docker本身的一部分,而是与Docker结合使用的资源,因此保护API和网络的步骤不在本文讨论范围之内。但是,这里的核心信息是,当您使用Docker时,API和网络安全性特别重要,因此不应忽略它们。
结论
Docker是一个复杂的庞然大物,没有简单的技巧可用于维护Docker容器的安全性。相反,您必须从整体上考虑保护Docker容器并在多层次上进行加固。这样做是确保您可以充分利用Docker容器的所有好处而又不会面临重大安全问题的风险的唯一方法。
来源:freebuf.com 2020-12-30 18:41:17 by: 坚石网络空间安全
请登录后发表评论
注册