Docker脆弱性分析与安全增强

2016-05-14 11:05杨文林谭曦郭俊廷王硕
网络空间安全 2016年4期
关键词:计算机应用虚拟化

杨文林 谭曦 郭俊廷 王硕

【 摘 要 】 容器虚拟化技术并没有虚拟任何硬件,它使用宿主机的系统内核,通过Namespace技术来隔离不同的容器隔离应用程序来实现虚拟化。因此它是工作在操作系统级的虚拟化技术。然而共享内核的方式也带来了许多安全问题。因此我们着手分析Docker主要部件Docker容器、Docker配置和Docker共享内核的技术原理,并且尝试寻找其脆弱点,从而针对存在的威胁提出解决方案,使得Docker的安全性足以适应生产环境。

【 关键词 】 计算机应用;Docker安全;脆弱性分析;虚拟化

【 中图分类号 】 TP309 【 文献标识码 】 A

【 Abstract 】 Linux Container technology does not virtualize any hardware, it just uses the hosts system kernel with namespace technology to isolate different containers and applications to achieve virtualization. Therefore, it is a virtualization technology that works on the operating system level. However, the way of sharing the kernel also brings many security problems. So in this paper, we had focused on analyze the major components of Docker: Docker Engine, Docker Repositories and the technology principles of Docker sharing kernel, and tried to find its vulnerability. Moreover, we had strengthened the most fragile places, so that we can finally propose solutions to resolve the risks of the existence now.

【 Keywords 】 computer application; docker security; vulnerability analysis; virtualization

1 引言

虚拟化技术是一种区别于传统的资源管理技术,它将计算机的计算能力、网络、存储等各类物理资源抽象化,打破了各物理结构间原本不可切割的障碍,使得用户可以按照需求更加经济、合理地去分配使用这些资源。虚拟化技术能够实现在一个平台上独立地运行多个既可以互不干扰而又可以协同工作的运算单元。Docker容器将用户程序、运行时库、系统工具、系统库等所有你会在服务器上需要的东西打包到一个完备的文件系统中。虚拟机通过模拟计算机硬件,每个虚拟机使用相互独立的硬件模拟器,都像拥有独立的硬件平台一样。对于虚拟机而言,每一个虚拟机都包含应用程序、运行库和相互独立的操作系统。

容器技术的虚拟化则是依托于Linux内核的LXC技术,辅以Namespace技术隔离不同的容器。容器内仅包含应用程序和必要的运行库,容器内运行的系统内核则使用与宿主机共享的系统内核。然而Docker共享系统内核的模式较虚拟机这种独立内核的模式自然安全性会降低很多,因为Docker暴露了更多的攻击面。不过只要在Docker内运行并提供合理的服务,同时再做好一些防护和监控措施,Docker仍然是一个非常实用的虚拟化工具。

2 Docker组件安全分析

Docker组件主要包含Docker引擎,Docker容器和Docker仓库三个部分。Docker引擎是Docker运行时的服务提供者,为整个Docker提供支持。其中包含了Docker使用的各种安全技术,比如Namespace、ControlGroup等。Docker容器是用户需要运行提供生产力的服务包,这里面运行着许多自定义的应用程序。Docker仓库是用户集中存放管理镜像的地方,当用户需要时Docker将会从这里下载指定容器或镜像。因此我们将攻击面概括为Docker引擎、系统内核以及Docker仓库三个部分。本文将深入讨论各部分内部以及之间的脆弱性。

2.1 Docker引擎脆弱性分析

2.1.1文件系统隔离

Docker 总体上使用Mount 命名空间来隔离文件系统。在写入数据时Docker使用了一种叫做“写时复制”的方式来保证容器内的写入操作。对于一个正在运行的容器,其文件系统都是从一个根目录开始的虚拟文件系统,在容器内部看起来像是一个真实的文件系统,然而在宿主机内则默认位于“//docker/containers/ /rootfs”。Mount 命名空间通过隔离文件系统挂载点对文件系统的隔离提供支持,不同的命名空间中的文件结构互不影响。但由于容器内root用户几乎等价于宿主机root用户,所以如果容器在创建时“rw mount”了宿主机的某个文件系统且容器内有root权限,那么在容器内执行“chmod a+s [program file]”操作则会导致所有运行这个程序的用户都将获得root权限,由此宿主机内用户得以提升特权,而且对于不同的容器,并不是所有文件都是完全独立的,比如/proc/fs,/proc/meminfo,/proc/debug,可能造成宿主机的这些敏感信息的泄露。

2.1.2进程隔离和通信隔离

Docker对于进程隔离使用的是PID 命名空间(PID namespace)技术,它对需要隔离的进程的PID重新标号,由此来隔离不同容器及容器和Host。每个PID 命名空间都有独有的计数程序。系统内核为所有的PID 命名空间维护了一个树,最顶层的是根命名空间(Root Namespace),是系统初始时创建的。运行于父节点的进程能够读取子节点的信息,反之则不可以。注意如果容器内PID为1的进程被终止,也就是容器内所有节点的根节点进程被终止,则该容器将完全停止。这可能存在DoS漏洞(Deny of Service,拒绝服务)的隐患。容器中进程间通信的方式为相同PID 命名空间的进程间进行通信,因此需要一个唯一标识符进行区别。IPC 命名空间包含系统IPC标识符和实现POSIX信息队列的文件系统。

2.1.3设备隔离与宿主机资源限制

Docker中使用UTS 命名空间来进行容器内的主机名和域名的隔离,这样每个容器都可以被网络上的其他节点看作是一个独立的节点。Docker作为虚拟化服务提供软件,我们必须重视拒绝服务漏洞。Docker使用Cgroups技术来限制资源的使用,然而默认状况下是不开启的,由此可能导致DoS的攻击面有磁盘空间、I/O带宽、CPU计算资源、内存空间,网络带宽甚至设备资源占用等的耗尽。由于容器内的资源是用户可以获取到的,如果允许用户自定义的代码的话,不做好适当的限制,将很有可能引发宿主机拒绝服务。这些限制在IaaS、PaaS、SaaS等的应用时需要十分注意。

2.1.4网络隔离与镜像传输

Network 命名空间为Docker提供网络资源隔离,包括网络设备、TCP/IP 协议栈、IP路由表等。Docker默认使用桥接方式,这种方式为每一个容器指定一个Network命名空间并分配IP地址,然后将其接入到虚拟网桥上。虽然这种方式能够很好的运行,但它只是单纯地转发所有流量而没有任何过滤,因此这可能会存在MAC Flooding风险。由于Docker目前并没有对拉回的镜像做正确的校验,使得在镜像传输的过程中可能被替换一些数据,即存在中间人攻击的可能性。

2.2 系统内核安全

Docker依赖于系统共享内核,因此系统内核的安全同时影响着Host和Container的安全。我们必须考虑系统内核的脆弱性可能会导致的严重后果。好在这种致命漏洞发现难度很大,利用起来也是很困难。容器内的用户所拥有的权限是由权能表决定的,不合理的权能分配会为攻击者提供更多的攻击途径。

2.3 Docker仓库安全

许多公司在生产环境中通常使用自建的Docker仓库来存放和管理Docker容器,那么如果Docker仓库如果可以被攻陷或者修改数据,那么从这里部署出去的所有容器都将成为攻击着的傀儡。所以需要确保镜像存放在可信仓库内。

3 Docker安全增强

3.1 容器间安全增强

Docker间安全主要来研究如何全面地增强不同Docker之间的独立性与抗影响性,因此本文又将范围继续细分到几个方面。

3.1.1 网络访问限制

对于网络面临的威胁,主要是网络流量的过滤以及限制威胁。得益于Linux系统中Iptables的强大和便捷,我们可以使用Iptables来进行各种网络限制,包括网络隔离以及网络区域划分等。当然,我们也可以使用更加开放的SDN类软件,比如OpenVSwitch,用它来替代Docker的默认网络,从而更加便捷地管理容器网络。

3.1.2 使用SSL 加密传输

由于Docker目前并没有对Pull的Images做正确性校验,使得当某宿主机在拉回镜像的时候可能被替换掉一些数据,从而存在中间人攻击的可能性。对于解决方案,自然可以通过自行修改Docker的源码的方式来添加相应校验代码,也可以直接利用SSL协议能够防中间人攻击的特性,使用SSL协议传输替代验证。

3.2 容器与宿主机间安全增强

容器与宿主机间安全增强我们主要讨论如何防止容器内部影响到宿主机,即当容器内部被攻陷的时候,如何防止攻击者进入到宿主机内,本文又将范围细分到几个方面。

3.2.1 控制容器内Linux权能表且使用SELinux等Linux安全模块

因为SUID 和SGID的存在以及Docker没有使用user namespace技术隔离root用户,意味着root用户在容器内外是没有区别的,从而可能存在容器内提升宿主机权限的风险。这时候通过“--cap-drop SETUID/SETGID ”参数就可以禁止容器内的用户使用此权限。同理,我们应该遵循最小特权原则,将容器内拥有的权限最小化,从而尽可能避免给攻击者很多权限。

安全增强模(Security-Enhanced Linux, SELinux) 是一个能够在内核中提供强访问控制(MAC)策略的内核模块。Docker默认是不开启SELinux功能的,如果需要使用它,可以通过执行“ setenforce enforcing”命令来开启它,并且在启动Docker Daemon的时候使用" --selinux-enabled "参数。当成功开启此功能之后,就可以通过“ --security-opt="YOUR PLOLICY"”来加载用户自定义的规则。纵观服务器安全配置问题,SELinux这种强大的工具被证明能够有效地增强服务器的安全性,因而也能极大地增强Docker容器和宿主机的安全。

3.2.2避免影响系统设备且对资源分配进行限制

由于Docker对于部分文件系统,例如/dev/*等没有完全隔离, 如果容器内需要某些特殊权限的话,则应尽可能只分配最小的权限。可以通过使用类似“--device=/dev/snd:/dev/snd:r ”的命令来给予最小的read权限(或替换成其他你所需要的权限),这样容器将无法获得对此设备的其他操作权限,从而最大化保证安全。

为了防止因资源耗尽导致拒绝服务的发生,合理的资源限制是非常有效地解决方案。通过Docker的Cgroups功能,用户可以轻易地部署限制策略。例如,若需要限制每个容器所占最大CPU资源可以使用“--cpuset=0,1 - c 2”参数;内存限制使用“-m 128m”参数;对于磁盘I/O的限制,Docker目前没有限制手段,不过我们仍然可以在宿主机内使用Cgroups来限制。

3.2.3禁用root权限且记录日志

永远不要运行安全性未知的用户程序,尤其是使用root权限运行。因为容器内外root用户是几乎等价的。如果需要使用的话,则应该使用经过限制部分权能的“类root”用户。虽然收集并归档日志文件并不能直接增强Docker的安全性,但对于管理人员去审核并发现未知漏洞或者对已知的入侵行为进行溯源能够有非常大的帮助。

4 结束语

综上所述,Docker是个非常有前景的虚拟化工具,它能够快速地创建各种容器来为用户提供各种服务。然而由于其原理的不安全性和开发人员的未知性,导致它轻便的同时也变得异常脆弱。为了使Docker的安全性足以保障在生产环境中使用,首先使用最新版本的Docker,因为通常最新版本的Docker存在的漏洞越少而且越安全,其次永远不要运行安全性未知的容器,尤其是使用root权限运行,最后建立一套“预防漏洞-监控异常-控制异常”三位一体的防御体系,来最大限度防止漏洞的利用,监控报警危险行为并控制入侵行为的影响范围。

参考文献

[1] Docker, Inc. What is Docker [EB/OL]. http://www.docker.com/whatisdocker,2015-1-29.

[2] Docker, Inc. Understand what are the major Docker components [EB/OL].https://docs.docker.com/introduction/understanding-docker,2015-3-21.

[3] 孙健波.Docker背后的内核知识[EB/OL]. http://infoq.com/cn/articles/docker-kernel-knowle-dge-namespace-resource-isolation, 2015-3-2.

[4] Merkel D. Docker: lightweight linux containers for consistent development and deployment [J]. Linux Journal,2014,2014(239): 2.

[5] Wikipedia. MAC-Flooding [EB/OL]. https://en.wikipedia.org/wiki/MAC-Flooding.

[6] Wikipedia. Responsible disclosure [EB/OL]. https://en.wikipedia.org/wiki/Responsible_disclo-sure,2015-9-9.

[7] Lantz B, Heller B, McKeown N. A network in a laptop: rapid prototyping for software-defined networks[C]//Proceedings of the 9th ACM SIGCOMM Workshop on Hot Topics in Networks. ACM,2010: 19.

[8] Docker, Inc. Protect Dockersocket [EB/OL]. https://docs.docker.com/articles/https,2015-4-7.

[9] Wikipedia. Security-Enhanced Linux [EB/OL]. https://en.wikipedia.org/wiki/Security-Enhanced_Linux,2015-8-9.

[10] Victor Vieux. Announcing Docker 1.2.0[EB/OL]. http://blog.docker.com/2014/08/announcing-docker-1-2-0/,2014-8-12.

作者简介:

杨文林(1993-),男,吉林大学,本科在读生;主要研究方向和关注领域:网络与信息安全。

谭曦(1994-),女,吉林大学,本科在读生;主要研究方向和关注领域:网络与信息安全。

郭俊廷(1993-),男,吉林大学,本科在读生;主要研究方向和关注领域:网络计算。

王硕(1993-),男,吉林大学,本科在读生;主要研究方向和关注领域:信息技术。

猜你喜欢
计算机应用虚拟化
网络信息安全技术管理背景下计算机应用研讨
高职计算机应用教学改革研究与实践
诠释CFC精髓的大数据时代医学案例
关于应用计算机辅助艺术设计有关问题研究
计算机应用的发展现状和发展趋势探讨
中职计算机应用课程教学改革与反思
浅谈虚拟化工作原理
用户怎样选择虚拟化解决方案
别再误会客户端虚拟化了
虚拟化整合之势凸显