深入剖析Docker容器常见攻击手法与防护对策

548 阅读10分钟

Docker部署流程存在许多潜在弱点,使得不法分子有机可乘,发动攻击。例如,映像文件存储库上可能存在恶意映像文件,如果不小心让这些映像文件发布到容器主机上执行,攻击者就可以对容器主机或存储库服务器发动攻击。另外,容器之间的通信也很容易被窃听、拦截,甚至黑客可以直接攻击存在漏洞的容器,从而获得完整的系统权限。

> 在常见的Docker部署流程中,开发者会从仓库下载容器镜像文件以供开发使用,然后更新程序并将其上传到仓库,接着容器镜像文件会被发布到容器主机上进行执行。

> 即使是在常見的使用流程中,也存在许多潜在的弱点,给不法分子可乘之机。例如,公开的映像文件存储库上可能存在恶意映像文件,如果不小心将这些映像文件发布到容器主机上执行,攻击者就可以对容器主机或存储库服务器发动攻击。此外,容器之间的通信也很容易被窃听、拦截,甚至黑客可以直接攻击存在漏洞的容器,从而获得完整的系统权限。

**利用Linux Kernel技术构建隔离环境**

尽管Docker引发了轻量级虚拟化技术的热潮,但在容器技术的实现方面,Docker借用了许多Linux Kernel的技术,以确保容器的隔离性,例如命名空间(Namespace)机制,确保容器只能访问和读取经核准的部分资源。然而,在命名空间机制尚未覆盖的漏洞中,黑客可以利用这一点作为跳板来破坏系统。此外,Linux Kernel本身也存在漏洞,使攻击者能够突破命名空间的隔离机制,进一步获得更高的系统权限。

除了使用命名空间机制实现基本的隔离效果外,Docker还通过cgroup对资源进行管理。cgroup不仅可以控制CPU和内存资源,还有一个特别的功能是创建设备白名单(Device Whitelist),可以限制容器可以访问的设备类型。

Docker不仅通过命名空间和cgroup来实现容器的资源隔离,还引入了其他Linux内核机制,以限制容器执行程序的权限,从而增强容器环境的安全性。

**通过内容认证机制可以确保镜像文件的安全性**

Docker能够实现轻量、快速部署的特性,其中镜像是关键。平时,镜像仅存储在镜像仓库中,直到开发者有部署需求时,才发布到容器主机执行。为了确保镜像来自可信来源,Docker推出了内容认证机制(Content Trust),通过更新框架(The Update Framework,TUF)这个公开密钥基础架构(PKI),验证、签署Docker镜像,无需额外申请特殊凭证

"TUF是所有认证机制的根源",在每个不同的账号都有一只Root金钥,用于签署Root中介档案文件。而Root金钥又可往下细分,其中包括了时间戳记金钥(Timestamp Key)、目标金钥(Target Key)、快照金钥(Snapshot Key)以及授权金钥(Delegation Key)

每个密钥都有不同的用途。例如,时间戳密钥不仅用于签署时间戳中介文件以确保文件是最新版本,还用于确保缓存文件的一致性。目标密钥用于签署目标中介文件,这个文件的重要性在于确保容器存储库内文件的一致性。第三个密钥是用于签署缓存中介文件的缓存密钥,缓存中介文件记录了容器存储库内所有中介文件的大小、哈希值等信息。

Docker内容认证机制的运作原理是通过Notary服务器来管理TUF中介数据和相关密钥。除了Notary客户端,开发者也可以利用Docker客户端与Notary服务器进行通信,但更高级的密钥管理必须通过Notary客户端操作

但是危险的不仅是容器映像文件,提供映像文件存储的基础架构也是一个大隐忧。根据趋势科技的研究,去年仅美国就有超过1,000个公开存储库,接着在中国也发现超过500个公开存储库。公开存储库的危险在于,黑客可以上传被感染的映像文件,"一旦它被部署到正式环境,攻击者就可以通过这个容器,攻击容器网络或是容器主机。"为了加强容器存储库的安全性,建议开发者必须开启TLS认证。

**通过使用漏洞扫描工具,我们也可以加强容器的安全性**

开发者也要搭配容器漏洞扫描工具,确保镜像文件内容安全。比如Docker官方推出的漏洞扫描工具Docker Security Scanning,让开发者可以在私人容器存储库中对容器镜像文件进行扫描,确认它们是否暴露在已知风险或存在漏洞之中。开发者启用Docker内容认证机制后,当镜像文件上传至存储库后,系统会自动启动Docker Security Scanning进行漏洞扫描

Docker Security Scanning完成扫描后,除了能够显示哪些系统组件存在风险需要更新,同时也会列出每一层Image Layer可能存在的风险。然而,这种呈现方式的缺点在于开发者必须自行整理信息,并判断映像文件中存在哪些已知漏洞

Docker Security Scanning的优点之一是易于使用。它不仅能准确的扫描出结果,还能判断应用程式是通过手动安装还是自动安装。

此外,还推荐CoreOS发布的开源容器扫描工具Clair,用于分析应用程序容器中的漏洞。Clair拥有许多漏洞资源来源,包括Debian Security Bug Tracker、Ubuntu CVE Tracker、红帽资安档案、Oracle Linux资安档案。当这些来源更新漏洞数据时,Clair除了会发布通知,还会通过API,比对映像档过去及当前状态的差异,确认容器是否受到新漏洞影响。

### **三种常见的Docker容器攻击方法**

> 在第一种攻击方法中,黑客首先需要获取公开Docker主机的控制权,并创建一个特权容器。然后,利用这个容器来攻击主机中的容器或者主机本身。

> 第二种攻击手段是针对存在安全漏洞的容器进行攻击,即使该容器没有开放网络访问权限,黑客仍然可以通过容器网络和管理界面连接,从而获取容器主机的权限。

> 第三种攻击手段是利用映像文件作为媒介。黑客可以上传被感染的映像文件,在其部署到正式环境后,攻击者就可以通过这个容器来攻击容器网络或容器主机。

**容器网络需要进行加密设置**

另外一个问题是容器网络传输信息的安全性。目前Docker提供了三种不同的网络架构。首先是Docker默认的桥接网络架构(Bridge Network),系统会自动创建一个名为Docker0的桥接器,并将所有容器都加入到这个容器网络中

在这个架构中,容器主机充当路由和NAT服务器的角色。无论是容器连接到外部网络还是提供对外服务,都必须经过容器主机。因此,桥接网络架构存在的危险在于,在这个容器网络中,不仅所有人都可以与容器主机连接,容器之间的默认连接也没有使用防火墙保护

此外,还有一种网络架构称为MacVLAN,它是一种轻量级的网络虚拟化技术。与过去Linux常用的桥接模式相比,用于实现网络隔离,MacVLAN与Linux以太网接口连接,增强了与实体网络的隔离效果。然而,李勁頤指出,在这种网络模型中,位于同一虚拟网络下的容器之间的连接也没有进行权限管控

最后则是Overlay Network,通过VXLAN技术,结合不同的容器主机,形成一个巨大虚拟网络,此架构最大的问题在于VXLAN的网络流量并没有加密,让传输内容容易遭窃取、篡改。此外,就如前面的桥接网络、MacVLAN,内部容器间连接亦未受控制。目前容器网络普遍存在的共通问题,除了没有限制内部容器彼此间的传输行为,亦没有控制容器对容器主机的连接。其中的Overlay Network架构,虽然系统预设VXLAN并不加密,但Docker使用者在设置IPsec Tunnel参数时,可以选择加密,借此强化容器网络的安全。

> Docker提供了一种网络架构Overlay Network,通过VXLAN技术,结合不同的容器主机,形成一个巨大虚拟网络。这种架构最大的问题在于VXLAN的网络流量并没有加密。虽然系统默认VXLAN并不加密,但Docker使用者在设置IPsec Tunnel参数时,可以选择加密,从而加强容器网络的安全

**三个安全技巧,加强容器的安全性**

用户可以通过Docker内置的三个原生机制来增强容器的安全性。第一个安全术是善用命名空间(Username Space),让容器不再使用Root权限执行。在过去推出的Docker 1.9.0版本中,Docker就将此机制纳入其中,"即使在容器使用Root权限执行服务,也并非Host主机所拥有的Root权限。"

当容器在运行程序时,位于用户命名空间的执行环境,系统会通过Host主机获取其执行身份。即使在容器中,某使用ID利用Root权限执行程序也不会有影响,"因为Username space中,系统会以该用户真正握有Root权限",但是在容器底下有Root权限的帐号,仅是Host主机底下的一般权限帐号,"从Host主机的角度来看,所有容器下执行的程序都只是一般权限执行而已。"

第二点是要善于利用安全机制Capabilities,将特权账号能够执行的几十个程序进行划分,并逐一进行控制。徐千洋表示,虽然这个机制早在Linux中就可以使用,但由于用户必须熟悉Unix底层操作,并具备Linux Kernel的相关知识,所以一直无法普及

通过Capabilities机制,用户可以将Root权限所能执行的功能切割成数十个,使得没有Root权限的用户也能执行某些程序。举例来说,在Unix的设计中,如果用户想要启用数字小于1024的端口,必须获取Root权限。但是通过利用Capabilities,就不需要通过Root权限,就可以让某些服务开启低于1024的端口

最后一招是Linux内置的安全模块AppArmor,它负责控制程序在运行时对其他文件的操作。例如,如果某个文件被限制为只读,即使用户获得了具有任意读写权限的Root权限,也会被AppArmor阻止。