【摘 要】 Docker的核心思想是利用扩展的Linux容器方案实现一种轻量级的虚拟化解决方案。本文介绍了Docker容器技术的架构和安全特性,在分析Docker容器安全风险的基础上,论述了Docker容器的安全增强方案。
【关键词】 Docker 容器 微服务 云计算
【中图分类号】 TP315 【文献标识码】 A
1 引言
随着互联网的迅猛发展,云计算作为一种商业计算模式在搜索服务、移动商务、开放协作等多样化需求的推动下迅速发展起来[1]。云计算以动态的、易扩展等优势提供了虚拟化资源的计算和存储方式,并受到谷歌、IBM、亚马逊、微软等IT厂商的大力推广和应用。虚拟化技术作为云技术的核心,逐渐受到人们的广泛关注。传统计算机运行主要采用虚拟机技术,它占用了大量系统资源,导致主机运行缓慢。所以,急需一种轻量级的虚拟技术,以提高信息隔离程度,减少资源消耗[2]。
Docker是一款适应市场需求的轻量级操作系统级虚拟化产品,利用Linux内核的资源分离机制以及Linux内核的控制组(Cgroups)建立独立运行的容器。容器间互相隔离,除了内核之外,每个容器可以有自己的库文件、配置文件、工具等,并且提供了良好设计的容器间通信机制,Docker技术的出现推动了基于云计算平台开发模式的变革和应用部署方式的变革[3]。
2 Docker技术介绍
2.1 概述
Docker设想是交付运行环境如同海运(如图1所示),操作系统如同一个货轮,每一个运行在操作系统基础上的软件都如同一个集装箱,用户可以通过标准化手段自由组装运行环境,同时集装箱的内容可以由用户自定义,也可以由专业人员制造。这样,交付一个软件,就是一系列标准化组件的集合的交付,如同乐高积木,用户只需要选择合适的积木组合,并且在最顶端部署上自己的应用。
2.2 Docker系统架构
Docker容器采用客户端与服务器的架构模式,如图2所示。服务端处理复杂的操作任务,例如,创建(Create)、运行(Run)、保存(Commit)容器等,Docker客户端作为服务端的远程控制器,可以用来连接并控制Docker的服务端进程。Docker守护进程和Docker客户端之间可以通过RESTful API或者套接字(Socket)进行进程间通信。
2.2.1 注册中心
注册中心是存储容器镜像的管理仓库,容器在运行过程中,守护进程与注册中心执行进程间通信。目前既有公有仓库(如Docker Hub),也有私有仓库(如Harbor)。与公有仓库相比,私有仓库可以保证容器镜像在本地网络获得。
2.2.2 容器
容器是Docker服务交付的最终体现形式。通过Docker客户端下发的命令,订制相应的服务并运行容器,Docker容器可以计算资源的配额,确保容器只能使用指定范围内的资源。
2.2.3 守护进程
Docker守护进程是Docker架构中一个常驻在后台的系统进程,用于接收和处理客户端发送的请求。该守护进程在后台启动一个服务端,负责接受客户端发送的请求;接受请求后,服务端通过路由与分发调度,找到相应的处理器(handler)来执行请求。
引擎是Docker架构中的运行引擎,它扮演容器存储仓库的角色,并且通过执行任务的方式对容器进行操作和管理。
2.2.4 函数库
函数库通过Go语言设计实现,可以直接访问内核中与容器相关的API,从而实现对容器命名空间、控制组、网络设备以及防火墙规则等资源的操作。
2.3 Docker安全特性
2.3.1 安全隔离特性
隔离能力是Docker容器技术的核心安全能力之一,主要通过Linux命名空间实现,用于隔离进程树、网络接口、挂载点、进程间通信以及用户等资源的方法。虽然多个容器运行在同一个平台上,但是它们分别位于自己的命名空间中,无法访问到命名空间外部的资源,这样即使某个容器被攻击或者存在某个恶意容器,入侵者也仅能访问到当前容器的所有内容。目前,Docker常用的命名空间包括进程命名空间(PID)、网络命名空间(NET)、文件系统命名空间(MNT)、主机与域名命名空间(UTS)以及用户与用户组命名空间(USER)等。
(1)进程命名空间
进程命名空间用来隔离进程空间,使得不同命名空间里的进程编号可以重复且互不影响,同时无法感知到运行在其他容器或者宿主机上的进程[4]。
(2)网络命名空间
网络命名空间用于实现网络资源隔离,每个命名空间有独立的网络设备、IP地址、IP路由表等。
(3)文件系统命名空间
文件系统命名空间实现对根文件系统的环境进行隔离,不同的命名空间对应不同的根文件系统,组织不同的文件系统挂载树,形成不同的文件系统目录结构。
(4)主机与域名命名空间
主机与域名命名空间允许每个容器拥有独立的主机名和域名,使其在网络上可以被视作一个独立的节点而非宿主机上的一个进程。
(5)用户与用户组命名空间
每个容器可以有不同的用户和用户组,也就是说可以在容器内部用内部的用户而非宿主机上的用户。
2.3.2资源管控特性
Docker通过Linux的控制组技术来实现容器的资源控制。控制组是由Linux内核提供的一种对各进程组所使用的物理资源(如处理器时间片、IO时间片、内存等)进行记录、限制和隔离的技术,其主要有以下3个功能。
(1)资源限制:限制每个进程组可以分配的资源数量。比如,内存子系统可以为某一进程组设定一个内存分配上限。
(2)优先级设定:为进程组指定特定的优先级,当各容器进程抢占资源时,宿主机依据优先级算法和各进程组设定的优先级分配资源。
(3)进程组控制:如某一应用或者容器发生了死锁,可以通过控制组技术中断这一进程。
3 Docker安全风险
继2017年容器安全被列入高德纳(Gartner)年度十大安全项目,2019年Gartner年度安全与风险管理峰会上,再一次将容器安全项目列入榜单,预示着容器技术得到了广泛的研究和应用,尤其是随着微服务架构和DevOps开发模式的盛行,越来越多的开发人员使用容器技术。但是容器技术是一种新型的技术革命,不仅仅存在传统的主机安全问题,同时也带来了新型的安全威胁,例如,容器使用的是共享的操作系统模式,对主机操作系统的漏洞攻击可能导致所有容器都受到破坏[5]。
3.1 逃逸安全风险
Docker容器的逃逸安全风险主要来源于危险配置、危险挂载、相关程序漏洞、内核漏洞等诸多方面[6]。
(1)危险配置威胁
用户可以通过修改容器环境配置,或在运行容器时指定参数来缩小或扩大Docker容器所需的最小权限,如果用户为存在安全风险的容器配置了危险参数,实际上是为攻击者提供了一定程度的逃逸可能性。例如,特权(Privileged)参数使得容器能够运行在特权模式,此时Docker容器将可以访问宿主机上的所有设备,同时能够修改宿主机强制访问控制策略,使容器具备与直接运行在宿主机上的进程几乎相同的访问权限,严重破坏了Docker容器的隔离机制。
(2)隔离不完善威胁
Linux内核层面提供的隔离防护措施还不够,仍有部分关键内容没有完全隔离,如系统运行的关键目录(如/proc、/sys等)、伪文件系统等,这些信息可以被恶意用户利用,为攻击创造有利条件。文献[7]的作者利用/proc目录中泄露的信息,创造最优条件,以最小代价对数据中心发起攻击[7]。
(3)内核漏洞安全威胁
操作系统内核的攻击是非常具有诱惑力的,大量研究者致力于发现可被用来执行任意代码或能进行本地提权攻击的内核漏洞,而此内核漏洞对基于与宿主机共享内核机制构建的Docker容器也同样适用,一旦宿主内核存在可以横向越权或者提权漏洞,那么尽管Docker使用普通用户执行,攻击者还是可以利用内核漏洞逃逸到宿主。例如,Linux内核3.16以前的版本存在一个内存溢出漏洞(CVE-2014-7822),由于splice系统调用在两个文件间拷贝数据时未检查拷贝大小,可溢出覆写内核数据,本地未授权用户可利用此漏洞越界写内存,导致系统崩溃。
3.2 镜像安全风险
镜像是Docker容器的静态表示形式,镜像安全决定了容器的运行时安全。Docker官方镜像仓库Docker Hub中的镜像可能由个人开发者上传,其数量丰富、版本多样,但质量参差不齐,甚至存在包含恶意漏洞的恶意镜像,存在较大的安全风险。具体而言,Docker镜像的安全风险分布在创建过程、获取来源、获取途径等方方面面。2017年有团队对镜像安全漏洞进行调研[8],并在《Docker Hub安全漏洞分析》一文中给出了一份镜像的统计数据,如表1所示。
总的来说,镜像安全主要表现在镜像脚本文件(Dockerfile)安全、镜像漏洞和仓库安全等诸多方面。
(1)镜像脚本安全威胁
镜像脚本是创建镜像的一种主要形式,主要考虑最小安装原则,同时考虑容器的易维护性,一般由基础镜像信息(FROM)、维护者信息(MAINTAINER)、镜像操作指令(RUN,ADD,COPY等)、容器启动时执行指令(CMD等)4个部分组成。
如果镜像脚本存在漏洞或被插入恶意脚本,那么生成的容器也可能产生漏洞或被恶意利用。例如,如果在脚本文件中没有指定用户,Docker将默认以root的身份运行该容器,若该容器遭到攻击,那么宿主机的root访问权限也可能会被获取;如果在脚本文件中存储了固定密码等敏感信息并对外进行发布,则可能导致数据泄露。
(2)镜像漏洞安全威胁
镜像漏洞安全风险具体包括镜像中的软件含有CVE漏洞、攻击者上传含有恶意漏洞的镜像等情况。
①CVE漏洞
镜像通常是通过官方镜像仓库Docker Hub或网易、阿里云等提供的第三方镜像仓库获取。然而,根据对Docker Hub中镜像安全漏洞的相关研究,无论是社区镜像还是官方镜像,其平均漏洞数均接近200个,包括nginx、mysql、redis在内的常用镜像都含有高危漏洞。
CVE-2019-5021报告指出,自Alpine Linux3.3版本开始的所有Docker镜像中,root用户包含一个空密码,如果在Docker容器中安装了shadow软件包并以非root用户身份运行服务,那么具有shell访问权限的用户可在容器内对账号进行提权[9]。
②恶意漏洞
恶意用户可能将含有后门、病毒等恶意漏洞的镜像上传至官方镜像库。2018年5月,Fortinet公司披露Docker账户(Docker123321)创建的17个包含用于数字货币挖矿恶意程序的Docker镜像。2018年6月,Kromtech公司发布了一份完整的报告,对该事件进行了复盘。该事件涉及的恶意镜像如表2所示。
3.3 网络安全风险
Docker容器网络默认使用桥接方式进行连接,通过在宿主机上创建一个虚拟的网桥Docker0扮演传统交换机的角色,并在各个网络接口间自动地进行分组转发。每创建一个新的容器,就为其增加一个虚拟网络接口,并将该网络接口连接到网桥Docker0。同一主机上的容器之间采用网桥模式,对转发的数据分组未进行任何过滤,容易遭受ARP欺骗和MAC泛洪攻击。当容器中的应用程序对内核资源恶意使用时,将会影响该主机上其他容器。例如,频繁恶意访问Linux系统的随机生成函数,将可能造成主机的其他业务无法正常运行。
容器的创建和删除频率较高,IP地址会随着容器的状态随机分配和绑定,新创建的容器使用的IP大多数情况下已被其他容器绑定过,因此,对IP原所属容器的攻击可能会重定向到新容器中。
4 Docker安全增强方案
4.1 增强容器之间的精准安全隔离
随着基于容器的微服务化技术的大规模落地使用,容器之间的东西向流量急剧增大,目前常见的解决方案是在硬件级进行隔离,这样所有的流量都不得不经过硬件交换设备和安全防护设备,增加容器环境的网络复杂度,并且会形成“发夹效应”,降低了数据传输效率,增加了网络流量和硬件设备的传输压力。
CNCF的容器平台的安全最佳实践文档中要求从容器级别实现隔离或者打通等安全管控,在不同业务的容器之间,按照既定规则—标签、地址、端口等限制,来实现网络分段,实现策略化的安全隔离。
4.2 增强对IP地址假冒的安全防护
容器平台的容器数量越来越多,对外暴露的风险点也会成倍增加,一旦有一个容器被攻破,攻击行为会尝试假冒IP地址、嗅探内部漏洞等动作,当攻击行为成功绕过南北防火墙之后,对内部造成的破坏将会非常巨大而且危险。不仅是攻破一个容器,还可能通过攻破容器再获取整个主机的管理权限,在整个网络内部做更深度的攻击和破坏。
针对该安全威胁,业界经常采用的方案是通过NSX-T的spoofguard功能,维护容器名和IP地址的引用表来防止IP地址欺骗,在容器启动过程中,用检索到的信息填充它与每个容器的IP地址,可以有效阻止未知容器发送或接受流量,提高容器环境的整体安全性。
4.3 增强对挖矿病毒的安全防护
容器挖矿病毒到处肆虐,能利用多个软件不同版本的各种漏洞,渗透到内部环境,来注入挖矿木马,并且在内部网到处嗅探、传染。此前的解决方法往往是发生了一次后,升级解决某个软件版本的漏洞,删除被感染环境的木马程序,但是各个软件升级调整又有新的漏洞以及源源不断的新木马变种。
针对该类安全问题建议从以下4个方面进行安全加固。
(1)在进行安全策略配置时,屏蔽掉常见的挖矿网站的IP地址。
(2)减少挖矿软件经常使用的服务软件,例如minerd挖矿程序利用Redis等中间件的漏洞发起攻击,获取root权限,植入挖矿木马。针对该类情况可以限定Redis所在容器的可访问地址范围,同时修改Redis的默认服务器端口。
(3)修改或者关闭容器集群的默认服务器端口,例如2375和2376等。
(4)建立健全漏洞发现和修复机制,定期对问题镜像进行漏洞修复。
5 结语
以Docker为代表的容器化技术逐渐成熟,已经在云计算、微服务、开发运维一体化等各个领域得到了广泛研究和应用。但是由于容器存在天然的安全问题和缺陷,相关的安全问题也不断出现。目前对容器安全的研究也是百家争鸣,主要有容器自身安全性研究、容器攻击威胁研究、容器安全加固方案研究、容器监控技术方案研究等各个方面。相信随着容器技术本身和配套安全解决方案研究的不断深入,容器技术将迎来下一个春天。
参考文献
[1] 浙江大学SEL实验室.Docker容器与容器云(第二版)[M].篮球比分:篮球比分邮电大学出版社,2016:28.
[2] 李明全.基于Docker的虚拟化技术分析与探究[J].信息与电脑(理论版),2020,32(01):21~22+25.
[3] 赵冠臣,王冬妮,刘至洋,孟振江.浅谈Docker容器技术[J].有线电视技术,2019(09):85~88.
[4] 李俊灏.Docker安全性分析及安全防护[J].科技视界,2019(20):240~241+201.
[5] Gartner's top 10 security projects for 2019[EB/OL].[2020-10-18].https://www.ciodive.com/news/gartners-top-10-security-projects-for-2019/549899/,2019.
[6] 江燕青.容器逃逸技术的探讨[J].福建电脑,2020,36(08):59~61.
[7] Gao X, Gu Z, Kayaalp M, et al. ContainerLeaks:Emerging Security Threats of Information Leakages in Container Clouds[C]. Ieee/ifip International Conference on Dependable Systems and Networks. IEEE, 2017:237~248.
[8] Shu R, Gu X, Enck W. A Study of Security Vulnerabilities on Docker Hub[C].ACM on Conference on Data and Application Security and Privacy. ACM, 2017:269~280.
[9]CVE-2019-5021[EB/OL].[2020-10-18].https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-5021,2019.