Docker镜像安全深度扫描*
2021-03-21赵立农曾艺骁
赵立农,曹 莉,曾艺骁
(中国移动通信集团重庆有限公司,重庆 401121)
0 引言
Docker一般以集群的方式提供服务,是大量容器协作完成的一项任务,需要快速分发和启动大量Docker容器。加速Docker镜像的分发环节意义重大。Docker可以做到更快速的交付和部署,更高效的资源利用,更轻松的迁移和拓展,更简单的更新管理,因此在开发和运维领域应用广泛。
1 研究背景
1.1 背景分析
当今,容器安全相关方向的研究主要表现在集成结构本身的安全机制和容器关联主机相互的安全匹配。然而,容器固有的属性包括容器、各种运行时库和其他相关的开源项目表现出高度自动化。在容器自动化方面,有效的解决方案是能够加快代码开发和部署环节,往往应用在各种平台、具有不同镜像提供商的供应链结构以及第三方系统,能够有效解决对数据完整性强化和可靠性提升的要求。但是,这可能导致漏洞,即恶意用户可能会渗透这些漏洞。资料显示,某安全研究机构发布的关于Docker镜像安全的报告约有30%官方仓库的镜像存在安全风险,如Shellshock、Heartbleed以及Pooodle等高危漏洞[1]。
目前,虚拟机镜像的研究已经成熟,包括多播、P2P以及共享存储等技术,为Docker镜像的分发提供了参考。但是,Docker镜像具有不同于虚拟机镜像的独特特征,需要进行相应的设计和优化。同时,数据中心网络不同于互联网。在数据中心,网络速度快、延迟低,服务稳定,所有节点目标相同。因此,在设计Docker镜像的分发方法时,还应充分利用数据中心的特点。
1.2 研究现状分析
目前,国内外对云环境下虚拟机镜像安全性的研究相对较少。这种分离允许管理员将安全修补程序更新到基本级别(以实现更新修补程序的目的)。Manu A R等人通过分析和研究基于Docker容器的PaaS云平台的相关安全性,对比和分析基于Hypervisor和其他容器的PaaS所不同的安全性,提出从渗透测试的多角度和多维度强化容器安全的MST[2]。郭秉楠通过对PDFDA算法展开研究,设计了一套基于虚拟化技术的网络安全服务功能链编排系统[3]。同时,Amr A M等人通过分析宿主机的应用效果与容器运行环节中潜在的安全漏洞评估和差异化比对[4],表明Docker容器能够实现的攻击面相对于主机更广。岑义涛从容器漏洞方向出发展开研究,总结了Docker容器哪些方面需要安全加固[5],如登录环节的相关信息传输、Docker程序的提权环节安全性限制以及出入容器的相关环节流量监控防护。Catuogno L等人研究发现,与虚拟机和hypervisor相比,Linux容器在网络、磁盘、内存管理、启动和编译速度以及总体处理性能方面显示出了极大优势。他们质疑在Linux容器中运行服务是否比直接在基于主机的操作系统上运行服务更安全。因此,使用Docker v1.10进行了一系列实验,以评估在Docker容器中运行服务的主机的攻击面,并将其与在本文中描述的Debian-Jessie基本操作系统上运行相同服务的主机进行了比较。漏洞评估显示,容器会给主机带来新的攻击面[6]。
资料研究发现,关于Docker容器受到的攻击往往是较严重、影响范围广泛的远程访问带来的问题,尤其是配置欠合理易引起被远程攻击者侵入并通过改变私钥进而获得入侵宿主机的root权限。Combe T等学者通过相关研究,总结了Docker容器的常有攻击主要来自于不安全的离线路径[7],如本地配置安全问题、安全措施不到位的访问控制手段和策略以及容器使用功能加载包含漏洞的镜像。文献[5]提到了Docker在网络方面的常有攻击点,包括ARP攻击、容器间的嗅探、IPtable的漏洞利用和对IPtable的饱和攻击,同时统计了公有云平台和私有云平台的安全事件,发现公共使用的云平台的安全问题更严重。Chelladhurai J等人针对拒绝容器服务攻击对Docker容器的主要威胁进行研究,提出了关于Docker在拒绝服务攻击行为方面的检测与防御方案[8]。它主要针对容器的内存资源管理使用,推荐内存限制的DoS安全防御策略。实验表明,该安全策略能够有效缓解内存资源消耗方面的DoS攻击。但是,相关研究并没有有效解决当下威胁最大的0day、1day漏洞的安全问题,也没有研究提出有效手段来防御该类攻击。
杨文林等人的研究对象是Docker的关键部件,通过分析Docker容器在文件系统隔离、进程及通信隔离、设备管理及宿主机资源限制、网络隔离和镜像传输4个方面的脆弱性,针对性地对容器进行安全增强,提出了部件配置和共享内核的先进理论[9],探究了其程序的脆弱点和风险要素,分析相关的潜在漏洞,模拟威胁点的处理方案和解决措施,构建起完整的“能够高效解决现存漏洞-监控安全报警-控制措施程序错乱”的一套具备防御能力的监控报警机制措施,形成了防御入侵攻击行为方案,但研究成果并没有论证可行性和效率的量化指标。李平平通过LKM技术建立和实现Docker容器相关的进程对,使得内核资源能够有效访问控制机制结构框架[10]。极致化的体系构成能够从内核层建立起容器执行进程对宿主机的有效访问控制和安全预防,且实现内核代码模块对容器内执行程序进程的实时跟踪和反馈,进一步形成了操作系统层面有效拦截容器内进程恶意程序对宿主机攻击和潜伏窃取资源的访问保护。陈莉君提出了基于LKM研究技术的一套完整的资源信息隔离措施办法[11],建立起能够有效调节程序劫持代码,借助程序的进程环节,利用Cgroup信息维护、修改、读取相关的ProcFS文件内容,进而建立起容器内特定区域信息资源的安全隔离防御。Combe T建议使用更高级别的抽象研究策略(主要表现在任务、复制控制器和远程持久存储方面)以完全消除对于主机的依赖,从而促进容器实现更好的隔离[12]。王鹃公开了一个可信增强的Docker容器[13],针对Docker容器目前存在的镜像被篡改、容器恶意进程及非授权通信问题,利用可信计算的信任链技术,构造了一条从硬件到容器内部进程和文件的信任链,同时增加了包括进程监控、文件系统度量以及网络监控3大功能于一体的安全防护模块,从而全方位对Docker进行度量与细粒度的监控,保护容器及镜像不被篡改,同时限制容器网络通信行为并监控容器内部进程,极大地提高了Docker容器的安全性。
Dhakate S分析并研究了一种基于Docker容器的、轻量级的、采用分布式云平台的安全监控机制,通过建立起检测、报告、监控以及报警等多种功能的整体架构,形成一套一体化的整体性云监控平台系统[14]。Salvatore P站在前瞻性的角度,分析容器监控未来和现在面临的问题和挑战,主要包括监控引擎如何应对容器生命周期的动态和快速变更,错综复杂的发展环节中如何能够实现用户更多的便捷性。因此,提升容器监控系统的自动化程度,以便能够用于分布式集群环境。
2 Docker容器镜像安全问题
镜像安全问题主要表现在镜像校验和访问控制两个方面。
镜像校验通常是能够保证镜像完整性的主要途径,从而有效避免镜像程序被篡改破坏。Docker容器的镜像仓库里所涉及的全部镜像都各自对应一个manifest特点文件,这个文件主要含有镜像标签、镜像所属命名空间、程序的校验方法、镜像运行需要的信息及其文件程序的签名信息。执行环节中,用户在pull镜像环节往往会多次自动运行哈希验证程序。如果通过镜像的digest来pull镜像,会验证manifest的digest与传入的digest是否一致。在镜像的环节中还会有manifest中镜像ID来实时获取镜像配置文件的更新。镜像环节还能够借助配置文件内容生成digest,最后得出验证是否与镜像ID一致的结果。在下载manifest文件能够镜像后,主要是依照镜像文件具体的内容逐步计算和校验“diffID”相关代码,并与镜像配置文件中有关联的diffID进行进一步的比较验证环节。执行环节的每一步数据传输过后,往往都要有本地计算相关的一些校验环节,以及同时比对与前一步保存的文件的可靠结果分析。结果比对后,如果验证失败,能够警示并伴随着输出相关警告信息,有效提醒镜像相关下载环节中可能已经出现安全问题,如文件损坏或者镜像内容被人为侵入和篡改。
目前,Docker使用一个中心验证服务器来完成Docker镜像仓库的访问权限控制。通过操作每个Docker对应的客户端,开展相关Registry的一系列push/pull操作,得到正版授权文件official.json文本,获得registry对应目录的相关授权信息和授权信息签名,进一步完成在Docker Daemon启动时的MemoryGraph加载。每次pull文件镜像时执行MemoryGraph验证授权信息的时效性(即是否过期),并且验证信息的匹配性、完整性等,同时检查相关读写权限的安全性。
2.1 Docker容器镜像安全风险
2.1.1 Docker容器镜像没有统一监管
除了Docker Hub外,还有大量的第三方镜像仓库,如网易163、中国科技大学、道云以及阿里云等。第三方镜像仓库就像一个混乱的Android应用市场,缺乏统一的监管,带来了潜在的安全风险。
2.1.2 镜像安全漏洞多
相关研究报告显示,Docker中心超过30%的官方镜像包含高风险漏洞,其中近70%的镜像包含高风险或中等风险漏洞。
2.1.3 黑客上传存在木马病毒的镜像
如果黑客在制作镜像时嵌入特洛伊木马和后门等恶意软件,并将恶意镜像上载到公共仓库(如Docker中心),则用户的容器环境从一开始就不安全。例如,Docker支持gzip、bzip2和XZ这3种压缩算法,其中Gzip和bzip2使用go标准库,因此相对安全。XZ不使用本机go实现,且使用由C编写的XZ utils开源项目,因此存在恶意写入C程序的可能性。一旦编译,将导致执行任意代码漏洞。只要存在漏洞,当执行Docker拉取镜像时,整个系统可能会被破坏。
2.1.4 直接运行未经检查的镜像
设计编程者通常从Docker的官方Docker中心存储库下载镜像,其中一些镜像来自开发镜像中相应软件的官方组织,但大量镜像来自第三方组织甚至个人。在应用程序的整个生命周期中,设计编程者、测试人员、操作人员和维护人员会根据不同的要求下载和运行镜像,因此在容器运行前检查镜像非常重要。如果直接运行未经检查的镜像,可能会给生成环境带来安全风险。
2.2 Docker镜像分析
为了设计一个适合Docker镜像特征的分布系统,有必要深刻认识镜像特征和镜像层的分布。然而,当前对于镜像特征和镜像层的分布没有系统的统计和研究。为了深入理解Docker镜像特征,设计更符合Docker镜像特征的分布系统,下面分析Docker镜像的属性。
2.2.1 镜像大小分布
通过收集多方数据,大多数镜像在100 MB和1 GB之间,镜像平均大小为386 MB。与虚拟机镜像的GB级别相比,它并不大。但是,随着Docker技术的日益普及,以及运行Docker容器的群集数量和规模不断增加,应用程序可能需要启动数万台计算机进行部署。
如果众多服务器同时下载Docker镜像,将影响Docker镜像仓库的工作效率,且在正常情况下不能提供足够的下载量,进而影响整个集群的工作效率。
2.2.2 镜像的相似性
Docker镜像采用分层机制,因此多个镜像层可能公用一个基础镜像层。在所统计的镜像中,约35%的镜像有一个共同的、大小为125 MB的镜像层。这些镜像分别为nginx、registry、redis、mysql、node、postgres、wordpress、elasticsearch、rabbitmq、jenkins以及logstash。可以看到,具有公共镜像层的镜像很常见,镜像层的大小占整个镜像的很大比例。因此,当主机需要下载镜像时,在下载其他镜像时可能下载了镜像的一些镜像层。Docker镜像的这个功能更有利于BT协议下载模式。由于某些计算机可能下载了一些镜像层,因此这些计算机可以用作种子服务器。它可以为没有镜像层的其他主机提供数据,进一步减轻了仓库压力,加快了整个群集的下载和传输速度。
2.3 Docker容器配置安全风险
2.3.1 Docker守护进程配置风险
按照Docker的实现架构,Docker服务默认监听在Unix Socket上,如unix:///var/run/docker.sock。为了实现集群管理,Docker官方提供了一个远程管理接口的REST API,允许通过TCP远程访问Docker服务。
例如,在使用Docker Swarm时,Docker节点会开放一个TCP端口2375绑定在0.0.0.0上。
当执行一些完全没有加密程序和没有任何访问限制的Docker Remote API服务的情况下,通常是相当危险的。需要注意默认端口连接公开Internet的情况。如果被攻击者恶意捕获侵入,攻击者以此开展一些程序和文件信息数据的访问浏览,再破解相关信息、恶意窃取和篡改,最终将会引起敏感信息泄露丢失。此外,它存在删除容器上固有数据的风险。例如,恶意攻击篡改容器主机上的核心关键敏感信息,捕获相关的服务器根权限,用来修改主机文件和敏感信息资源,最后控制主机服务器。
2.3.2 Docker其他安全配置风险
通过网络、镜像、容器、仓库、Docker所依赖的Linux内核以及Docker软件本身总计6个方面开展相关的分析,进一步总结Docker容器存在的安全威胁。
(1)关于Docker网络安全方面的威胁。Docker容器使用网络桥接方法进行一些连接。需要主机上创建一个虚拟桥Dokcer0充当开关。一般来说,虚拟网桥拒绝过滤传输带来的一些数据包,所以得出的连接模式往往易受到ARP相关的欺骗攻击和MAC相关的泛洪攻击,且位于同一主机中的容器更易关联受感染容器周边的网络攻击。假如出现Docker run+P命令执行相关外部服务端口时,一旦出现操作不当,极易导致主机相关网卡的各个暴露端口形成映射,以侦听和窃取外部连接,最终带来严重的安全风险。
(2)Docker镜像安全威胁。在镜像构建程序的建立和执行中,设计编程者可能会无意中向镜像添加敏感信息(包括数据库身份验证密码),会给部署在生产环境中的应用程序带来安全风险。该镜像很容易被利用传输和其他部署使用,同时会为病毒后门潜伏的镜像建立起一些恶意传输通道提供便利条件。分析和研究发现,在镜像信息的具体构建环节中,执行者使用的主要关键镜像往往较大。建议使用现有的镜像操作前,有必要认真核对检测原有镜像中的安全问题,尤其是要核查存在的漏洞问题。在镜像相关的制作环节中,尽力降低对不相关的程序和信息依赖库的使用和引入。在镜像漏洞相关方面扫描,虽然存在安全扫描程序软件(如Docker安全扫描),但是很多软件往往无法提供有效的解决方案来修复镜像漏洞。
(3)Docker容器安全威胁。容器运行时,软件(如Docker)漏洞可能导致“容器逃逸”等情况的发生,导致容器被植入木马病毒,如挖矿程序等。当容器以root权限运行时,容器中的用户可以获取主机的资源;配置容器重新启动策略时,如果容器重新启动时间不受限制,频繁重新启动程序运行会耗尽计算机运行资源,并会引起拒绝服务攻击;如果将/root/目录加载到容器中,可能会导致容器逃逸攻击。
(4)Docker仓库安全威胁。为了确保镜像的传输安全性,在守护进程和注册表之间的关联程序之间开启TLS安全管控监督机制。为了监督预防镜像被篡改问题发生,需开启镜像签名和验证功能,但是仍然存在一些问题。Docker中心有数千名设计编程者,所有的设计编程者都能够使用他的私钥对镜像进行程序电子签名。但是,这种签名验证来预防安全问题的机制无法从源头保证设计编程者的可信度。Docker中心实现了用户升级镜像的自动生成功能,允许Docker中心跟踪指定的GitHub或存储。提交新项目时,它会自动重建镜像,并传递镜像部署连接实际的生产环境。此环节中,依赖项会自动从第三方资源平台下载。第三方资源平台可能是不安全的链接,依赖项可能在传输环节中被恶意篡改,是Docker的不安全因素。
(5)Linux内核支持安全威胁。大量研究人员致力于查找可用于执行任意代码或执行本地特权攻击的内核漏洞。发现的大量内核漏洞是基于与主机内核共享机制的Docker容器的一大威胁。
(6)Docker软件安全威胁。实际上,Docker用户组不能保证主机的安全性。在Docker守护进程分析镜像和Dockerfile文件的环节,如果无法很好地筛选这些输入数据,则可能会出现严重的安全问题。历史上有一个严重的事件触发漏洞,其构造了一个特殊的Dockerfile压缩文件,以获得在编译时执行任意代码的权利。在早期版本中,本地用户的授权问题也出现在Docker镜像中特殊软链接的构建中。
3 Docker镜像安全扫描研究
镜像文件的生命周期具体如下:
(1)用户将定制好的镜像上传(发布)到云平台的镜像库中;
(2)云管理员管理与维护镜像库内的镜像;
(3)镜像通过克隆复制一份新的镜像;
(4)镜像通过快照保存镜像的某个状态或通过回滚将镜像还原到某个状态;
(5)云平台分发镜像,创建一个新的虚拟机,使离线镜像转为在线状态;
(6)虚拟机在线状态通过关机销毁虚拟机及对应的镜像(目前大多的云平台都使用这种方式);
(7)删除镜像库内的镜像。
3.1 病毒木马检测
通过图像扫描,可以在镜像文件中找到网络外壳、二进制特洛伊木马以及病毒等恶意文件。每个容器镜像由一系列“镜像层”组成,在解包后需要分析和扫描这些层以查找安全漏洞。从CVE漏洞、木马病毒、可疑历史操作以及敏感信息泄露等方面对镜像文件进行分析,以及它是否是可信镜像。
当云用户发布镜像时,发布者将面临敏感信息被泄露的风险。尽管传统软件供应商也面临类似的风险,但镜像发布的风险更大,因为镜像包含已安装和配置的应用程序,其中配置可能包含危险的操作,如创建受密码保护的用户帐户。如果发布者创建运行实例的应用程序的镜像,她可能会无意中创建原始不公平的Open文件。除了保护信息在发布镜像时不被泄露,镜像发布者还希望与数量有限的特定用户共享镜像。因此,镜像库应该为镜像文件访问提供某种安全策略。
3.2 软件漏洞检测
通过镜像扫描发现镜像文件中的软件漏洞,并标记该漏洞的CVE和cnnvd编号,提供修复方案。镜像检测的核心是已知的系统CVE检测。扫描仪获取镜像后,将镜像分离成相应的镜像层和包,然后将这些包与多个CVE数据库包的名称和版本进行比较,以确定是否存在漏洞。
3.3 历史行为分析
本文通过镜像扫描对镜像的历史指挥行为进行审计,发现了镜像的危险操作行为。有证据表明,如果不管理休眠镜像,虚拟环境现阶段无法完全具备稳定状态,根本原因是昆虫携带的镜像间歇性会运行并感染其他计算机,直到检测并消除。所以,管理员始终都会伴随潜在的安全风险问题,也注定会带来一些费用和成本消耗。
3.4 信息泄露检测
容器镜像可能包含数据库密码、证书密钥以及敏感环境变量等,可能会导致信息泄露。共享虚拟镜像不可避免地会带来安全风险。在共享环节,通过差异性的角色和多维度阐述相关的安全风险漏洞,尤其是镜像的发布者和原始镜像库存在的安全问题。镜像使用者从镜像库还原镜像并在计算服务器上运行镜像。
3.5 镜像运行安全策略
研究发现有安全问题的容器镜像时,防护容器可以通过禁止其运行来达到防护的效果。
4 Docker镜像安全检测方法
对镜像中的文件进行分层提取后,同时逐层进行恶意代码检测,主要检测WebShell和木马病毒。这里主要采用模糊哈希、yara规则和机器学习的CNN-Text-Classfication分类算法3种检测方式。
(1)通过模糊哈希算法来匹配Docker镜像中的文件内容,对可疑的文件进行打分,同时使用病毒引擎进行恶意代码识别,还使用CNN-Text-Classfication分类算法对文件进行检测。3种检测方法都有相应的权重,最终会根据打分结果判断文件是否是木马病毒文件。
(2)通过对镜像文件进行解包后,从manifest.json中读取历史操作信息。将历史操作信息发送到扫描器分析层进行安全分析,对可疑历史操作进行标注并触发报警。
(3)通过manifest.json读取layer信息。分析layer信息,提取layer中的文件内容,并对证书格式文件进行内容匹配,检测是否存在信息泄露风险。
对镜像的证书标签和仓库来源进行可信检测,以排除从不可信的仓库或者直接安装的容器镜像,具体流程如图1所示。
图1 Docker镜像安全监测流程
其他扫描模块如第三方框架漏洞扫描和开源协议扫描模块与WebShell检测模块功能类似,因此未体现在流程图中。
第三方框架漏洞扫描模块。以java的Web框架漏洞扫描为例,如spring、struts,通过探测java构建包war、jar类型的文件中是否存在相关框架,并识别出对应版本来对接漏洞库判断漏洞是否存在。
开源协议扫描模块。通过检测镜像中代码目录里的LICENSE文件内容,识别出对应的开源协议。
5 结语
云计算技术当今已经取得了普遍应用和快速发展。随着技术的不断提升,云计算的虚拟化技术和容器发展已经成为研究重点。容器技术的兴起和推广应用,带来了基于Docker的云平台的快速发展与应用。Docker作为一种容器,由于轻量级虚拟化、快速简洁的操作系统功能,已越来越适用于云平台。通常Docker以群集的形式提供服务,需大量的容器配合完成任务,因此必须快速分发和启动大量Docker容器,加快Docker镜像的分布环节。
基于Docker镜像的特点,从多个角度概述Docker镜像发展背景和研究成果,针对性分析讨论了Docker容器镜像安全问题、Docker镜像、Docker容器配置安全风险3方面内容,并从病毒木马检测、软件漏洞检测、历史行为分析、信息泄露检测以及镜像运行安全策略5方面探究关于Docker的镜像安全扫描研究,利用模糊哈希、yara规则和机器学习的CNN-Text-Classfication分类算法进行Docker镜像安全检测。