本文将简介Docker技术,说明Docker的背景知识和安全议题。并在此介绍Docker映像文件检测工具Anchore Engine,通过模拟演练让大家了解如何运用Anchore Engine抓出Docker映像文件潜在安全问题,使系统安全得以保障。
在2014年,Docker的出现为用户提供了更轻量级的虚拟机环境,不仅可以通过虚拟机技术减少应用程序因环境不同而无法运行的困境,还可以降低对硬件资源的需求。此外,Docker具备高效的部署和高度可移植性等特点,深受开发者的喜爱,同时也是目前热门的微服务架构能够实现的重要推动力之一。在软件开发架构方面,微服务架构将架构中的每个组件和服务的工作切分得非常精细。然而,在过去,构建微服务架构并不容易,但随着Docker技术的出现,门槛也得以降低
然而,虽然Docker看起来有很多优点,但也存在着无法避免的安全问题。例如,部分Docker映像文件中包含的应用程序版本可能存在已知的漏洞信息,或者被恶意人士植入了恶意程序等。一旦这些有问题的Docker映像文件被实际部署到各个系统上,将会成为管理员和用户的噩梦。
Docker安全与工具检测
容器
是Docker技术中实现虚拟化的一种方式。然而,各种技术都会存在一定程度的风险,容器也不例外。接下来,我们将介绍Docker本身以及实现虚拟化技术的容器可能存在的安全风险,并且说明如何使用Anchore Engine
这个容器检测工具来检测容器的安全性。
Docker与容器安全性问题
- Docker自身漏洞
Docker本身也是一种应用程序,凡是应用程序多多少少都会存在一些漏洞,与Docker相关的CVE(公共漏洞和暴露)漏洞编号已超过30个。因此,确保在使用Docker时没有安全疑虑的最佳方式是定期将版本更新至最新版本,以降低安全风险。
- 宿主机核心漏洞
Docker技术的运作原理是,在一台主机上安装Docker引擎,以便在Docker引擎上启动多个容器服务,因此提供安装Docker引擎的这台主机便被称为「宿主机(Host Machine)」。Docker引擎会与宿主机共享操作系统的「核心(Kernel)」来访问系统的硬件资源。若系统核心有漏洞时,黑客就有机会通过在容器中的一些操作来获取操作宿主机之操作系统核心的权限,站在资安的角度来看,这是相当不安全的一个事件。
- Docker镜像来源
关于Docker镜像的来源,可以从三个方面进行说明:
黑客上传有问题的镜像文件:如果有黑客上传有问题的镜像文件,比如在镜像文件中插入后门程序等,并上传到公开的存储库(如Docker Hub)供大家下载,只要用户下载并使用该镜像文件来启动容器,就有可能导致系统上的严重安全问题。例如,在2021年3月,安全研究人员发现,一些下载次数超过千万次的镜像文件竟然内含挖矿程序
映像文件中包含过期的软件套件版本:容器中的服务启动取决于映像文件创建时写入的软件套件或代码。然而,经常发现映像文件中包含的软件套件版本没有更新,还可能检测到CVE漏洞,从而导致启动的容器运行有漏洞的服务
中间人攻击是一种在信息安全领域非常常见的攻击手法。黑客在网络传输过程中拦截发送方传输的内容,并进行篡改后再交给接收方。这样,接收方收到的内容就会是被篡改过的,而不是原始内容。在将镜像文件上传到公共存储库或下载到用户本地时,都需要通过网络传输,因此中间人攻击有可能发生。
常见的容器检测工具
大部分容器的安全性都来自于镜像文件。因为容器是通过镜像文件启动的,所以确保每次启动容器时使用的镜像文件是干净的成为一个非常重要的问题。目前市面上有许多种检测镜像文件的工具,下面列出并解释了最常用的三种检测工具,分别是Clair
、Trivy
和Anchore Engine
Clair
是由CoreOS公司发布的容器操作系统的映像文件安全分析引擎,通过扫描映像文件来监控容器的安全性。主要扫描对象是映像文件中与操作系统相关的漏洞。该项目的GitHub网址是github.com/quay/clair 然而,Clair的缺点在于安装较为复杂,而易用的Clair-cli工具已多年未更新。
Trivy
是一个开源的容器漏洞扫描工具,旨在帮助开发人员和安全团队发现和修复容器镜像中的安全漏洞。它能够自动扫描容器镜像中的软件包和操作系统组件,识别出已知的漏洞,并提供相应的建议和修复建议。Trivy的设计简洁而高效,可以轻松集成到CI/CD流程中,帮助团队在构建和部署容器时及时发现和解决安全问题。无论是个人开发者还是大型企业,Trivy都是一个强大而可靠的工具,可以提高容器安全性,保护应用程序免受潜在的威胁
Trivy是Aqua Security公司于2015年发布的容器检测工具,其特点是安装和使用都非常简便,用户可以迅速上手。该项目的GitHub网址是github.com/aquasecurit…
Anchore Engine
是由容器安全公司Anchore开发和管理的,它在功能方面比Trivy更加丰富,并且可以使用Docker进行安装。此外,与Clair专注于映像文件和操作系统相关的漏洞不同,Anchore Engine的主要扫描对象还包括与非操作系统相关的漏洞,并返回扫描的映像文件的CVE漏洞信息。该项目的GitHub网址是[github.com/anchore/Anc… Engine](github.com/anchore/Anc… Engine)
Docker的安全性很大程度上取决于映像文件,因此我们将依赖于检测工具来判断Docker映像文件是否安全。从上面的检测工具介绍中可以看出,与其他两种工具相比,Anchore Engine多了一个“非操作系统相关套件”的扫描功能,在扫描能力上稍显突出。因此,接下来我们将以Anchore Engine为例,逐步了解Anchore Engine的功能和实际操作方式,从安装到扫描和评估映像文件。
安装Anchore Engine并进行实际操作
这次的操作步骤都以Ubuntu Linux
为例,先安装再说明常用指令
安装Docker和Docker-compose
由于启动Anchore Engine
服务时需要与资料库Postgres等多个服务配合,因此我们使用Docker-Compose方式来启动这些服务。关于Docker的安装方式,你可以参考以下官方网站的教学:
- docker官网 docs.docker.com/engine/inst…
- 安裝Docker-Compose docs.docker.com/compose/ins…可以使用curl下载安装、apt或者使用Python的pip3方式来进行安装。
安装Anchore Engine
首先,执行指令
//下载Anchore官方的docker-compose.yaml文件
sudo curl -O https://engine.anchore.io/docs/quickstart/docker-compose.yaml
//启动Anchore Engine等相关服务。
sudo docker-compose up -d
接下来,输入命令"sudo docker-compose ps",确认是否成功执行。如果状态栏的state部分都显示为up (healthy),那就表示所有的启动都成功了,如图所示
请检查 Anchore Engine 是否成功启动
Anchore Engine常用指令
安装完成后,您可以通过Anchore Engine提供的指令与其进行交互。在Anchore Engine提供的参数操作中,以下是三个最常用的指令:
指令 | 意思 |
---|---|
Image | 与映像有关的操作,可以执行加入映像或获取映像内容等 |
System | 与系统相关的操作,如检查系统状态和同步漏洞资料库等 |
evaluate | 评估映像是否通过检查机制的参数 |
第一步:执行命令「sudo docker-compose exec api anchore-cli system status」,检查Anchore Engine的状态
第二步:然后执行命令「sudo docker-compose exec api anchore-cli system feeds list」以同步漏洞数据库,如果右边的数字都大于0,则表示同步完成
第三步:当漏洞数据库同步完成后,就可以加入要分析的镜像文件。以nginx的1.11.1版本的镜像文件为例,执行命令「sudo docker-compose exec api anchore-cli image add docker.io/library/nginx:1.11.1」。
第四步:在映像文件被添加后,Anchore Engine将开始进行分析。您可以通过以下命令查看当前分析状态:“sudo docker-compose exec api anchore-cli image wait docker.io/library/nginx:1.11.1”。该映像文件的结果将显示为“analyzed”(已分析)。
第五步:执行命令“sudo docker-compose exec api anchore-cli image content docker.io/library/nginx:1.11.1”,查看镜像内容。
第六步:如果要显示漏洞信息,可以选择“全部显示(all)”、“仅显示操作系统(os)相关”和“仅显示非操作系统(non-os)相关”的漏洞。只需在命令“sudo docker-compose exec api anchore-cli image vuln docker.io/library/nginx:1.11.1 all”中选择将最后的all改为os或non-os即可。执行后如果包含CVE漏洞,将会返回CVE编号
第七步:您可以使用以下命令来检查映像文件是否通过检查:sudo docker-compose exec api anchore-cli evaluate check docker.io/library/nginx:1.11.1。如果未通过检查,这意味着执行该映像文件可能会带来严重的安全问题,状态将显示为fail(未通过)。相反,如果通过了安全检查,状态将显示为pass(通过)。
实操
检查MySQL 5.7版镜像文件是否包含了等级为Critical和High的漏洞,命令为「sudo docker-compose exec api anchore-cli image vuln docker.io/library/mysql:5.7 all | grep “Critical|High”」,可以发现系统都没有返回任何与Critical和High相关的漏洞信息,命令和检测结果:
查看WordPress最新版本中Critical和High等级的漏洞信息