APP下载

容器镜像安全风险与防护研究

2023-08-10

信息安全研究 2023年8期
关键词:镜像攻击者仓库

陈 妍 张 福 胡 俊

1(公安部第三研究所 上海 200031)

2(北京升鑫网络科技有限公司 北京 100093)

近年来,企业数字化转型成为推动我国经济社会发展的重要战略手段.为持续深化产业数字化转型进程,构建以云计算为核心的数字基础设施已成为一种行业共识.以容器为核心的云原生技术作为下一代云计算的技术内核[1],具有高效稳定、快速响应的特点,能够带动业务走上提质增效、创新驱动的发展路线.

容器镜像在容器生态系统中发挥着至关重要的作用.容器镜像包含打包的应用程序及其依赖关系,以及启动时的进程信息,是容器运行的基础,所有容器都由容器镜像启动.从容器镜像创建的任何容器都会继承其所有特征,一旦镜像存在问题,所有由该镜像启动的容器都会出现同样的问题.因此,容器镜像安全是确保容器安全乃至云原生安全的重要一环,其重要性不言而喻.

但容器镜像也存在各种安全问题[2],包括镜像漏洞、镜像配置不合规、恶意镜像、镜像中包含敏感信息等.由于镜像是构建容器的源头,镜像一旦出现问题,波及范围较广,因此,有必要确保镜像的全生命周期安全.本文从介绍容器镜像的概念与特征入手,分析了容器镜像存在的安全风险,并提出了基于全生命周期的镜像安全防护措施.

1 容器镜像概述

1.1 容器镜像简介

容器镜像是容器化平台的最基本单元,本质上是一个只读软件包,包含了应用程序运行所需的一切内容,包括容器运行所需的容器引擎(如Docker或CoreOS)、系统库、实用程序、配置设置以及在容器上运行的特定工作负载.镜像可以部署在任何环境中,是容器化架构的核心组件.

容器镜像是分层建立的,由在父镜像或基础镜像上添加的多个层构成.容器镜像可以共享底层主机的操作系统内核,因此不需要包含完整的操作系统.与虚拟机(VM)相比,容器镜像所占用的计算资源更少.同时,容器镜像使用开放标准,可以跨不同的基础设施运行,实现互操作.此外,容器镜像通常存储在一个叫作镜像仓库的中心位置.通过Docker Hub等镜像仓库,用户可以存储自己的镜像,或查找和下载已创建好的镜像.

1.2 容器镜像的优势与特征

容器镜像的最大优势在于快速下载、立即启动,其优势与特征主要体现在以下几个方面:

1) 可移植性.从镜像中启动的容器可在虚拟机、裸机服务器、开发者笔记本电脑上运行,可轻松实现在本地服务器和云端的移动,大大提高了可移植性.

2) 轻量性.镜像层可重复使用,大大增强了容器应用的轻量特性.

3) 速度快.容器镜像是一个轻量级的软件包,可在几秒内部署,通过容器镜像可快速复制容器,并根据需要快速部署.

4) 扩展性.通过挂载包含不同配置与数据文件的目录或卷,增强容器的扩容能力;同时,容器镜像既可由内部开发也可从外部镜像仓库引入,提供容器的可扩展性.

5) 隔离性与稳定性.在容器部署中,应用程序从底层基础设施中抽象出来,且相互隔离.镜像构建后变成只读文件,是不可变基础设施的一部分;当由镜像启动的某些容器发生崩溃时,运行相同应用程序的其他容器可以继续正常运行.

2 容器镜像安全风险分析

在容器生态系统中,容器应用采用镜像这种不可变更的方式进行分发和运行.所有的容器实例均由镜像启动,而镜像中可能会存在软件漏洞、恶意程序、敏感信息等问题[3].若基础镜像或应用镜像出现这些问题,则由镜像启动的容器实例的影响范围将是1个或多个集群.整体来讲,容器镜像的安全风险可以分为3类:镜像自身安全风险、镜像管理风险及镜像仓库给镜像带来的风险[4-6].

2.1 镜像自身安全风险

镜像是实现容器化的第1层.由于大多数容器镜像是建立在第三方代码上的,所以即使它们经过定制开发,也会存在第三方漏洞等风险.镜像自身存在的安全风险主要包含以下几类:

1) 镜像漏洞.

镜像漏洞是容器面临的最常见的一种安全威胁,是嵌入在容器镜像中的安全风险.镜像漏洞通常由于程序库不安全或其他引入容器镜像的依赖关系不安全.此外,镜像中也可能包含在软件供应链攻击或对开发软件的类似攻击中嵌入的恶意代码.虽然有漏洞的镜像本身并不构成威胁,但如果基于有漏洞的镜像来创建或启动容器,这些容器就会把漏洞引入到运行环境中.

2) 应用漏洞.

即使容器镜像和容器运行环境是安全的,如果使用容器托管的应用程序在其源代码中包含缺陷,也会面临安全问题.例如,数据输入验证不充分可能会导致SQL注入攻击,让攻击者能够访问敏感信息.此外,如果出现缓冲区溢出漏洞,攻击者就能执行任意代码,获得容器管理权限,并逃逸到主机.

3) 恶意镜像.

尽管合法的容器镜像经常会包含漏洞,但攻击者通常会将恶意镜像伪装成合法镜像,这是容器镜像面临的一个更大风险.由于镜像只是打包在一起的文件集合,其中可能会被有意或无意地嵌入恶意文件.攻击者通过将包含恶意软件、木马病毒的镜像上传到Docker Hub等镜像仓库,并赋予恶意镜像一个看起来合法的名字(如mysqldatabase或nginxserver),可能会骗过管理员,导致管理员利用恶意镜像启动容器.

4) 敏感信息.

用户在将应用打包成镜像时,一些敏感信息如passwords,keys,credentials,secrets等会被直接嵌入文件系统.许多应用需要密钥或凭据才能实现组件间的安全通信,将敏感信息直接嵌入镜像虽然方便用户操作,但也造成很大的安全风险.所有能够访问镜像的人都可以通过查看镜像获取这些敏感信息.

5) 镜像配置不合规.

若容器镜像配置不合规也会增加容器的攻击面.如镜像中使用企业禁用的应用(如低版本、存在漏洞的jar包);镜像没有使用特定用户账户进行配置,导致运行时用户权限过高,如root权限.这些配置缺陷都会让容器面临不必要的安全风险.

2.2 镜像管理风险

镜像管理风险主要是对镜像来源及镜像构建过程控制不严格造成的.镜像作为创建容器的源头,若对镜像使用进行有效规范,可避免在容器运行时出现问题造成业务终止,引起运维成本飙升.

1) 镜像来源不可信.

由于镜像具有很强的可移植性,用户可以很便捷地从公有镜像仓库中将镜像拉取出来,部署到自己的生产环境中.但从公有镜像仓库下载的镜像,很可能会因为版本过期而存在软件漏洞,或者被攻击者植入木马病毒文件.

2) 镜像构建过程控制不严格.

作为一种最佳实践,企业应构建和维护基础镜像,并确保所有的应用均来源于基础镜像.但通常情况下,组织机构不会从头开始构建基础镜像.而非基础镜像构建的镜像可能是从外部获取的,会存在一些安全漏洞,或安装了一些不必要的系统应用,增加了容器的脆弱面.

2.3 镜像仓库风险

在容器化应用架构中,镜像仓库负责镜像的存储.私有镜像仓库可以用来与内部团队和授权方共享镜像,公有镜像仓库则可以供社区或公众存储和共享容器镜像.镜像仓库为用户存储和拉取镜像提供了便捷工具,但同时也会存在一些安全风险,主要包括仓库本身的安全风险和镜像拉取过程中的传输安全风险.

1) 镜像仓库安全风险.

如果对镜像仓库的账号及其权限管理不严格或传输未加密,就会导致镜像仓库面临镜像泄露、篡改和破坏等风险.例如,Harbor仓库1.7.0~1.8.2版本存在垂直越权漏洞,可导致任意管理员注册,从而控制镜像仓库.由于镜像中经常包含敏感组件,例如组织机构的专有软件和嵌入式密钥,这将给组织机构带来重大安全隐患.

2) 镜像拉取安全风险.

由于镜像仓库(特别是私有仓库)中存储的镜像可能用于运行敏感或专有应用或访问敏感数据,如果用户以明文形式拉取镜像,极易遭遇中间人攻击,将应用的大量技术细节暴露给攻击者,造成损失;或者攻击者在镜像的传输过程篡改镜像或冒名发布恶意镜像.

3 全生命周期的容器镜像安全防护

3.1 安全原则

鉴于容器镜像在容器安全中起着至关重要的作用,从同一镜像创建的所有容器都会继承镜像的所有特征,包括安全漏洞、错误配置甚至是恶意软件.下面列出的安全原则可帮助用户只使用安全并经过验证的镜像.

1) 最小基础镜像.许多镜像将完全安装的操作系统发行版作为其底层镜像.如果不需要通用系统库,用户的基础镜像中无需安装整个操作系统或其他对项目不重要的组件,以便减少攻击面.

2) 最低用户权限.用户配置文件通常需要指定一个USER,否则由该镜像启动的容器将默认以root身份在主机上运行.由于以root身份运行可能会导致成功入侵容器的攻击者获得对整个主机的控制权,从而产生严重的安全后果,因此,须在镜像文件中指定USER,确保启动的容器具有最低用户权限.

3) 镜像签名和验证.用户必须确保用于创建容器的镜像是从受信任的发布者处选择或自己创建的镜像.用户使用签名镜像可以避免通过网络篡改镜像(中间人攻击)或攻击者将恶意镜像推送到受信任镜像仓库的情况.

4) 修复开源漏洞.在生产环境中使用父镜像时,用户需信任该父镜像部署的所有组件,包括开源组件.在构建过程中自动扫描镜像,确保镜像中不包含漏洞、错误配置或后门.随着时间的推移,即使在最初被验证为安全的镜像也有可能存在漏洞.

3.2 关键技术

容器镜像是云原生环境中各类应用的标准交付格式.因此,需在镜像的构建、分发和运行全生命周期内,对容器镜像及其构建文件进行深度的安全检查,确保容器镜像的全生命周期安全[7-11],如图1所示.具体涉及的关键技术如下:

图1 容器镜像的生命周期

1) 构建阶段.

在镜像扫描时可能会发现大量漏洞,在这种情况下,用户首先需要清晰了解容器镜像是如何创建的.构建阶段是镜像创建的开始,如果能够从构建阶段就确保镜像安全,后面阶段就可以减少很多安全问题.为了从源头确保镜像安全,实现安全左移,可通过以下措施防止将外部漏洞引入镜像中:

① 代码与依赖关系.提高应用的交付速度是创建容器的关键,而应用可以说是组织机构的生命线.过去,应用安全始于代码,终于代码.现在,虽然容器和其他现代开发实践已经扩大了“应用代码”的含义,但应用安全问题仍然存在.开发人员可以通过最直接地控制镜像,在开发的早期发现问题,将安全工具与源代码整合在一起,从而自动化分析代码与依赖关系的安全性,并研究如何修复其中的安全问题.

② 镜像扫描.为保证容器镜像的安全,应实时扫描镜像中的软件包和组件,以发现常见的、已知的漏洞.进行镜像扫描时应能够发现包含在镜像所有层中的漏洞,而不仅仅是基础镜像层.此外,由于应用中的部分代码通常来自于易受攻击的第三方库,因此,镜像检测和分析必须能够检测镜像中包含的操作系统和非操作系统包的漏洞.如果软件包被曝出新漏洞,镜像扫描工具应该能够检索适用组件的新漏洞信息,并提醒开发者,以便及时采取补救措施.

③ 最小基础镜像与中间件.在可能的情况下基础镜像要尽可能小,只包含应用代码所需要的内容.原因在于最小基础镜像使用的代码少,依赖关系也少,可以降低攻击面.另一方面,如果选择使用最小基础镜像,在利用镜像启动容器时有可能需要添加工具和库,同时增加一些自己的代码和需要安装的内容,以便让应用顺利运行,而所有这些都需要加以监控,以防出现漏洞.在镜像进入生产阶段前,应该删除一切不是运行应用程序绝对必要的内容.或者,采用多阶段构建方式,在自动化构建过程中分阶段发现镜像中存在的问题.

④ 删除不必要的软件包.为减少容器的大小和最小化攻击面,不要在镜像中安装不必要的软件包.如果为了顺利运行容器需要安装一些软件包,则需要从可信来源下载并安装经过验证的软件包,例如通过apt-get从官方的Debian仓库获取软件包.

⑤ Secrets.切勿在容器镜像中存储任何Secrets.开发人员有时可能会在镜像中留下AWS密钥、API密钥或其他Secrets.如果攻击者获取了这些Secrets就会利用这些Secrets发起攻击.因此,Secrets应始终存储在镜像之外,并在运行时根据需要动态提供.

2) 分发阶段.

在分发阶段,检查镜像仓库中的镜像是否存在漏洞是关键所在.应该对镜像仓库进行盘点,并在添加镜像时进行镜像扫描以查找漏洞.用户还应该安排每日对镜像仓库进行自动扫描,检查是否存在新漏洞,并检查每天添加到存储库中的新镜像.对于这一阶段的镜像安全,可从以下几个方面入手:

① 选择可信镜像仓库.构建好容器镜像后需要将其进行存储.使用内部的私有镜像仓库可最大限度地确保安全性,但是也需要谨慎管理镜像仓库的基础架构和访问控制.用户也可以从Docker Hub,VMware Harbor等公有镜像仓库选择适合自身使用的镜像,但需要注意要避免从不受信任的镜像仓库拉取镜像.通过使用Docker官方镜像仓库或者其他能够验证来源的第三方镜像,或者使用Notary插件来检查数字签名,可以确保镜像质量.

② 镜像签名与验证.在容器生态系统中许多镜像是开源的,存储在公有镜像仓库中.通过镜像签名与验证,开发和安全团队就可以确认镜像是否来自可信源,是否被恶意篡改,从而增强对镜像的安全防护.不同的容器平台采用不同的方法实现镜像签名,但一般都是基于数字签名.镜像签名包括私钥(由镜像创建者使用)和公钥(供镜像用户确认其真实性使用).

3) 运行阶段.

通过镜像启动的容器在其生命周期的最后阶段部署到生产中.对于许多组织来说,这个阶段是最关键的.通常情况下,生产部署是容器生命周期中最长的时期,因此,需要持续监测威胁、错误配置和其他问题.在这一阶段,用户需要通过以下方式对镜像运行后的工作负载进行动态安全检查:

① 镜像扫描.在运行阶段,对生产仓库中的镜像以及节点中的镜像进行扫描非常重要,原因有三:其一,运行阶段的业务并不一定是由自研镜像启动的,虽然在之前的阶段中进行了镜像扫描,但在运行阶段,有些业务是由第三方的厂商提供支持,此时镜像由厂商提供的,并没有经过先前的镜像检查;其二,镜像可能由于权限管理不当,越过前面构建阶段的检查,而直接推送到镜像仓库或者容器节点上,而容器节点上也可能会被攻击者上传恶意镜像;其三,软件漏洞具有滞后性,即随着时间的迁移,软件应用可能会发现新的安全问题.

② 镜像阻断.在对镜像进行实例化运行时,针对不安全镜像进行告警和阻断,包括镜像中含有严重漏洞、发现木马病毒或风险文件等情况.由于节点镜像未必经过前面阶段的检查,因此,很有必要在集群节点上启用镜像阻断功能.

3.3 技术实践

本文基于容器镜像面临的安全风险,设计和开发容器镜像安全扫描工具,具体工具的技术架构如图2所示,该工具用于实现镜像从构建到制品仓库到部署运行全生命周期的端到端安全防护及检测.

图2 镜像扫描工具技术架构

镜像扫描工具包括风险输出模块、资产信息输入模块、安全控制模块、元信息存储模块、策略管理模块和展示模块.该工具的具体工作流程为:在镜像构建阶段,扫描器通过API调用、pipeline代码片段等方式与CI工具集成,在构建节点自动启动扫描器,触发对CI镜像的扫描,并将扫描结果回传至服务端.服务端根据镜像扫描结果与所设置的镜像合规性策略进行比对,输出是否放行镜像的结果至CI工具.若CI镜像不满足安全策略,则其推至镜像仓库的动作将被阻断,实现第1个安全卡点.经过验信的镜像将被推送至镜像仓库.但镜像中仍存在存量镜像、非CI构建镜像,扫描器也将对镜像仓库中的镜像进行清点并扫描,验证镜像的合规性.服务端将前端发起的镜像扫描任务下发给扫描器,由扫描器携带仓库访问token对仓库镜像进行清点,并对镜像进行扫描.扫描完成后,扫描器将扫描结果与镜像信息返回服务端,服务端将镜像扫描结果与合规策略进行比对,生成镜像是否合规的标签.在镜像部署阶段,触发对所部属镜像的扫描.服务端将对所部署镜像进行合规性验证,验证完成后,服务端将是否阻断镜像部署的结果嵌入用户工作流,以对不合规的部署行为进行阻断,实现部署环节的安全卡点.

最后,将该工具接入模拟金融行业真实业务运行环境的实训平台进行测试,运行约3个月,期间发现镜像中有千余高危漏洞、百余恶意文件,推动落地百余条安全规则,推动修复500余个不合规镜像.该工具不仅支持同时构建100多个任务的CI镜像扫描,也能对接云原生环境的自研CI平台,帮助用户在运维、开发阶段实现对镜像安全的管控.

4 结 语

随着云计算的进一步发展,以容器为核心的云原生技术已成为提升云计算使用效能的一项重要技术.目前,容器已成为打包、部署和运行软件代码关键技术,有助于改变应用的部署方式,提高部署的速度、可扩展性和可移植性.然而,越是新的技术越容易出现安全问题,容器技术也不例外.其中,容器镜像作为容器化架构的核心组件,其安全问题尤为重要.本文重点分析了容器镜像的特征以及面临的安全风险,并针对性地提出了基于全生命周期的镜像安全防护措施,包括分析了镜像安全防护的关键技术、开发了镜像扫描工具,该研究和实践旨在帮助用户在采用容器技术时,能够从容器镜像这个源头上解决问题,减少容器运行后面临的各类安全风险与威胁.

猜你喜欢

镜像攻击者仓库
仓库里的小偷
基于微分博弈的追逃问题最优策略设计
填满仓库的方法
镜像
四行仓库的悲壮往事
镜像
正面迎接批判
有限次重复博弈下的网络攻击行为研究
消防设备
镜像