Docker容器的漏洞分析与安全研究

摘要

Docker是一个开源的应用容器引擎,它可以让用户将应用打包,并依赖包到可移植的容器中。然而,Docker也存在着安全问题。本文从文件系统隔离、进程和通信隔离、设备管理和主机资源约束、网络隔离和镜像传输等四个方面入手,对Docker的漏洞进行分析。与Linux内核的安全模块进行交互,采取积极有效的措施来提高Docker的安全性。本文介绍了当前Docker安全研究的概况,探讨和展望了Docker安全研究的发展趋势,为Docker在生产中更好的应用奠定了良好的基础。

第一节.Docker简介

云计算能够提供灵活机动的服务,具有快速部署和可移植的特点,在当今计算领域占据了大部分的市场份额[1]。其中,资源虚拟化技术[2]在实现云计算基础设施服务的按需分配方面发挥了重要作用。传统的Vmware、Xen、KVM和MicrosoftHyper-v等硬件层面的虚拟化,必须通过虚拟一个完整的操作系统层来降低资源利用率。为了寻找更高效的隔离技术替代,Docker在年3月推出了一些开源容器项目Docker[3]。为了寻找更高效的隔离技术替代方案,Docker已经成功地在各种场景中得到了广泛的应用。它的广泛应用使得对Docker安全的研究更加迫切和实用。

Docker[3]是一个开源引擎。Docker,可以自动将开发应用部署到容器中。在虚拟化的容器执行环境中,增加了一个应用部署引擎。该引擎的目标是提供一个轻量级、快速的环境,可以运行开发者的程序,并将程序从开发者的笔记本上方便、高效地部署到测试环境中。然后部署到生产环境中。

A.Docker主机的漏洞分析

Docker使用客户端服务器(client-server)模式。Docker客户端与Docker守护进程通信,Docker守护进程处理复杂繁重的任务,如构建、运行、发布Docker容器。Docker客户端和守护进程可以运行在同一个系统上。你也可以使用Docker客户端来连接远程Docker守护进程。Docker客户端和守护进程通过socket或RESTfulAPI进行通信[4]。DockerClient作为通信客户端与DockerDaemondaemon进行通信,从而管理Docker。

Docker模式如图1所示。

Fig.1.Dockerschemadiagram.–Docker模式图

B.Docker远程API和Dockerswarm

DockerRemoteAPI[5]是代替rcli(远程命令行接口)的RESTAPI,帮助发送请求、获取和发送数据、检索信息。

Swarm是Docker在年12月初推出的一个比较简单的工具,用于管理Docker集群。Swarm将一组Docker主机[6]转化为一个单一的虚拟主机。Swarm采用标准的DockerAPI接口作为其前端访问入口,即各种形式的DockerClient(Docker,Docker),Docker等都可以直接与Swarm通信,Swarm的结构图如图2所示。

图2.Swarm的结构图swarm的结构图

第二部分.Docker漏洞分析

Docker的漏洞主要体现在文件系统隔离、进程与通信隔离、设备管理与主机资源限制、网络隔离和镜像传输四个方面。对Docker的漏洞进行研究,可以为寻找有针对性的安全加固措施提供依据。

A.文件系统隔离

Docker中隔离文件功能的实现是基于Mount命名空间的。不同的文件[7]存放在不同的命名空间中,以避免文件结构之间的交互。但容器中的root权限与主机root用户的权限相似,特别是当主机中安装了RWmount,且容器具有root权限时,容器中的root权限就更大了。一旦容器执行“Chmoda+s[程序文件]”,运行程序的用户就可以获得root权限,从而大大增加了相关信息泄露的概率。

B.远程隔离和通信隔离

Docker使用PID命名空间[8]来隔离进程,分离进程的PID.有一个单独的计数程序。系统内核通过树来实现PID命名空间的维护,其中根命名空间处于顶层,父节点可以获取子节点信息,但子节点无法获取父节点信息。但需要明确的是:当其为1时,PID被终止,导致容器完全停止,拒绝服务。

C.设备管理和主机资源约束

Docker容器中域名和主机名的隔离是通过UTS命名空间实现的,而Cgroups[9]是用来限制资源的使用。但默认情况下是封闭的,容易增加设备资源、网络带宽和内存空间的耗尽概率。另外,考虑到用户可以在容器中获取资源,用户定义代码没有得到适当限制。会造成主机拒绝服务,特别是在使用SaaS、PaaS、IaaS时,应引起足够重视,防止拒绝服务的发生。

D.网络隔离和图像传输

Docker中的网络命名空间负责隔离网络资源,如IP路由表、TCP/IP协议、网络设备的隔离等。但默认情况下,Docker为容器指定IP和网络命名空间,然后用网桥连接。这种方式是只转发流量,不进行过滤,将面临较大的MACFlooding风险。镜像传输时,Docker不会检查拉回的镜像。如果更换了一些数据,可能会出现中间人攻击。

第三节Docker和内核安全系统

一些内核安全系统的存在可以用来增强Docker和内核的安全性,包括Linux函数[10]和Linux安全模块(LSM)。Linux函数限制了分配给每个进程的权限。LSM提供了一个框架,允许Linux内核支持不同的安全模型。LSM已被集成到Linux官方内核中,包括AppArmor、SELinux和AppArmor。

A.Linux功能

Docker容器运行在与主机系统共享的内核上,因此大多数任务都可以由主机处理。因此,在大多数情况下,没有必要为容器提供完整的root权限。因此,删除容器中的一些根功能,既不会影响容器的可用性和功能,又能有效提高系统的安全性。例如,可以从容器中删除CAP_来修改系统的网络功能。由于Docker在启动容器之前,所有的网络配置都可以由Docker守护进程来处理,因此,Docker在启动容器之前,可以将.NET_ADMIN功能删除。

Docker允许配置可以被容器使用的函数。默认情况下,即使入侵者获得了容器中的root访问权限,Docker也可以禁止其容器中的大量Linux函数,以防止入侵者破坏主机系统。一些被Docker禁用的功能。Docker容器的功能如TABLEI所示,可以在Linux手册页面中找到。

表一被docker容器禁用的部分功能

B.Apparmor

AppArmor[11]也是一种基于强制访问控制的Linux安全增强模型(如SELinux),但它将范围限制在单个程序上。它允许管理员在每个程序中加载安全配置文件,从而限制了程序的功能。

在启用AppArmor的系统上,Docker提供了一个接口,可以在启动新容器时加载预定义的AppArmor配置文件。配置文件将以强制模式加载到容器中,以确保容器中的进程受到配置文件的限制。如果管理员在启动容器时没有指定配置文件,Docker守护进程会自动将默认的配置文件加载到容器中,这样会拒绝访问主机上的重要文件系统,如Isys/fs/cgroups/和/sys/kerne/security/。

C.能力机制

能力机制使Linux的权限划分更加细化,改变了以往root用户所有权限的现象。能力机制将权限细分为37种不同的能力,涵盖了文档、进程、网络、系统、设备等操作权限。Docker在沉默识别的条件下,为容器提供有限的能力。用户也可以根据实际需求,在运行时增加或减少能力权限。能力机制存在的问题是,在某些方面分权还是不够,不能很好的满足容器限制的要求,CAP_SYS_ADMIN涵盖了很多权限,需要进一步细分。在为容器分配权限时,很难知道容器中需要哪些权限。为此,Docker提供的默认能力权限列表包含的范围更广。从安全的角度来看,这不是一个好的策略。

D.Sec


转载请注明:http://www.aierlanlan.com/rzdk/2373.html