Harbor镜像漏洞扫描

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: Clair是CoreOS 2016年发布的一款开源容器漏洞扫描工具。该工具可以交叉检查Docker镜像的操作系统以及上面安装的任何包是否与任何已知不安全的包版本相匹配。漏洞是从特定操作系统的通用漏洞披露(CVE)数据库获取。

1) clair介绍

20191021163547617.png

关于clair

Clair是CoreOS 2016年发布的一款开源容器漏洞扫描工具。该工具可以交叉检查Docker镜像的操作系统以及上面安装的任何包是否与任何已知不安全的包版本相匹配。漏洞是从特定操作系统的通用漏洞披露(CVE)数据库获取。

通过从镜像文件系统中抽取静态信息以及维护一个组成镜像的不同层之间的差异列表,可以大大减少分析时间,而且不需要实际运行可能存在漏洞的容器。如果镜像所依赖的一个靠下的层存在漏洞,那么该镜像就会被识别为有漏洞,而且,通过使用图存储,可以避免重新分析镜像。

clair的目标是能够从一个更加透明的维度去看待基于容器化的基础框架的安全性。Clair=clear + bright + transparent

与 Clair 集成, 添加漏洞扫描功能(可以设置漏洞级别, 当漏洞级别达到一定程度时, 限制镜像的拉取) .

Clair总体工作原理

clair-01.png

Clair主要包括以下模块:

  • 获取器(Fetcher)- 从公共源收集漏洞数据
  • 检测器(Detector)- 指出容器镜像中包含的Feature
  • 容器格式器(Image Format)- Clair已知的容器镜像格式,包括Docker,ACI
  • 通知钩子(Notification Hook)- 当新的漏洞被发现时或者已经存在的漏洞发生改变时通知用户/机器
  • 数据库(Databases)- 存储容器中各个层以及漏洞
  • Worker - 每个Post Layer都会启动一个worker进行Layer Detect

Clair整体处理流程如下:

  • Clair定期从配置的源获取漏洞元数据然后存进数据库。
  • 客户端使用Clair API处理镜像,获取镜像的特征并存进数据库。
  • 客户端使用Clair API从数据库查询特定镜像的漏洞情况,为每个请求关联漏洞和特征,避免需要重新扫描镜像。
  • 当更新漏洞元数据时,将会有系统通知产生。另外,还有webhook用于配置将受影响的镜像记录起来或者拦截其部署。

Clair漏洞等级说明如下:

  • Unknown:社区暂未给出优先级或者Clair当前未同步支持
  • Negligible:几乎无任何影响的漏洞,不会单独给出一个针对性的修复更新版本 Low 低风险等级,一般会在更高风险等级漏洞修复版本中修复
  • Medium:中风险等级,如跨域、用户权限暴露等,会有针对性版本修复
  • High:高风险等级,漏洞在大多数人默认的安装版本中出现,如服务出错、数据丢失、root权限恶意获取等
  • Critical:最高风险等级,几乎所有版本都存在某漏洞,如造成用户大量数据丢失

2) 安装

cd /usr/local/harbor

# 关闭harbor
docker-compose stop

# 添加扫描插件
./prepare --with-clair
./prepare --with-clair --with-chartmuseum

# 重启Harbor服务
docker-compose -f docker-compose.yml up -d

3) 最佳实践

1.以非Root用户运行容器镜像

如果 Dockerfile 中没有指定 USER ,Docker 默认将会以超级用户 root 的身份运行容器,容器所属的命名空间(namespace)因此映射为 root 所有,这意味着容器有可能获取 Docker 宿主机的超级管理权限。不仅如此,以 root 用户身份运行容器,还扩大了攻击面,如果容器应用中存在安全漏洞,很容易造成权限提升。

在实践中,一般不需要容器拥有 root 权限。为了尽量降低安全威胁,创建专门的用户和用户组,在 Dockerfile 中使用 USER 指定用户,确保以最小权限的用户身份运行容器应用。

2.使用自己的私有注册中心

私有注册中心可以让您获得更完善的镜像的管理方式,并且通常提供更高级的功能,可以帮助确保库存安全。例如:

  • 复杂的镜像扫描工具,用于识别威胁和未修补的漏洞。
  • 严格的治理,例如基于角色的访问控制(RBAC)和合规性监视。
  • 数字签名,镜像认证和其他防篡改功能。
  • 用于开发,测试和生产多环境的镜像仓库。

相比之下,诸如Docker Hub之类的公共注册表一般仅提供基本服务-您必须信任镜像发布者,而镜像发布者可能未遵循相同的高安全标准。

这样,您最终可能会得到包含恶意或过时代码的镜像,并最终获得对数据泄露敞开大门的容器环境。

3.设定镜像的标签,保证镜像的不可更改性

每个 Docker 镜像可以有多个标签(tag),代表该镜像的不同变体。最常见的标签是 latest ,表示这是该镜像的最新版本。镜像标签是可更改的,也就是说镜像的作者可以多次发布相同标签的镜像。优先选用最详细的镜像标签,“:8.0.1-alpine” 等标签,不要使用像 latest 这样过于泛泛的标签。

4.选择最小的基础镜像

Docker hub上的某些镜像比其他的镜像更简化。比如在ubuntu仓库中,有些镜像的大小是部分版本的2倍以上。选用最小化基础镜像,即只包含项目确实需要的系统工具和库的镜像,就能最小化系统的攻击面,确保所用操作系统是安全的。

5.不要在容器镜像中包含机密信息

有时候,构建包含应用的容器镜像时,需要用到一些机密信息,例如从私有仓库拉取代码所需的 SSH 私钥,或者安全私有软件包所需的令牌。如果 Dockerfile 中包含复制机密信息的命令,构建镜像时,这行命令对应的中间容器会被缓存,导致机密数据也被缓存,有可能造成机密信息泄漏。因此,像令牌和密钥这样的机密信息必须保存在 Dockerfile 之外。

避免无意中复制机密信息:如果文件夹中有敏感文件,要么先移除这些文件,要么将这些文件包含在 .dockerignore 中,复制时会忽略这些文件。如果文件夹中有敏感文件,要么先移除这些文件,要么将这些文件包含在 .dockerignore 中,复制时会忽略这些文件

6.使用 COPY ,不要使用 ADD

从宿主机复制文件到容器镜像中的 Docker 命令有两个:COPY 和 ADD ,这两个命令本质上很相似,但具体功能并不相同:

  • COPY - 将本地文件或者目录(递归)复制到容器镜像中的目标目录,复制来源和目标都必须明确指定。
  • ADD - 与 COPY 类似的功能,有两个不同:(1)如果复制来源是本地压缩文件,ADD 将把该文件解压缩到目标目录;(2)ADD 也可以将远程 URL 指定的文件下载到目标目录。

为了避免可能导致的安全问题,请记住 COPY 和 ADD 的不同:

  • 使用 ADD 从远程 URL 下载文件,存在中间人攻击的风险,文件内容有可能因此被篡改。必须确保远程 URL 必须是安全的 TLS 链接,校验远程 URL 的来源和身份。译者注:实际上,官方文档并不鼓励使用 ADD 添加远程文件。
  • 如果复制的是本地压缩文件, ADD 自动将它解压缩到目标目录,这有可能触发 zip 炸弹或者 zip 任意文件覆盖漏洞。
  • 相比较而言,使用 COPY 复制文件或目录,会创建一个缓存的中间镜像层,优化镜像构建的速度。

7.使用 LABEL 指定镜像元数据

镜像元数据有助于用户更好地理解和使用该镜像。最常见的元数据是 maintainer ,它说明了镜像维护者的电邮地址和名字。

8.签名和校验镜像,防范中间人攻击

Docker 镜像的认证颇具挑战性。在生产环境使用这些镜像运行我们的代码,意味着我们对这些镜像的极大信任。因此,必须保证我们拉取的容器镜像确实是发布者发布的镜像,没有被任何人篡改。发生镜像篡改,有可能是因为 Docker 客户端和镜像中心之间的中间人攻击,或者是发布者的身份被人盗用并在镜像中心发布了恶意镜像。

9.使用多阶段构建小而安全的镜像

使用 Dockerfile 构建应用容器镜像时,会生成很多只是构建时需要的镜像层,包括编译时所需的开发工具和库,运行单元测试所需的依赖、临时文件、机密信息等等。

如果保留这些镜像层,不仅会增加镜像的大小,影响镜像下载速度,而且会因为安装更多软件包而面临更大的攻击危险。这对用到的镜像也是成立的——需要使用一个专门构建应用的镜像,但不会用它来运行应用代码。

Go 语言就是一个很好的例子。构建一个 Go 应用需要用到 Go 编译器。编译得到的 Go 应用能够在任何操作系统上直接运行,没有任何依赖,包括 scratch 镜像。

Docker 因此提供了多阶段构建的功能,允许在构建过程中使用多个临时镜像,只保留最后一个镜像。这样,用户得到两个镜像:

  • 第一个镜像——非常大的镜像,包含了构建应用和运行测试所需的所有依赖;
  • 第二个镜像——非常小的镜像,只包含运行应用所需的极少数依赖。

10.使用静态分析工具

使用静态分析工具,能够避免常见的错误,建立工程师自动遵循的最佳实践指南。

例如,hadolint 分析 Dockerfile 并列出不符合最佳实践规则的地方。在集成开发环境(IDE)中使用 hadolint 更好。例如,安装 VS Code 的 hadolint 扩展后,编写 Dockerfile 时,边写边检查,既快又好。

相关实践学习
通过容器镜像仓库与容器服务快速部署spring-hello应用
本教程主要讲述如何将本地Java代码程序上传并在云端以容器化的构建、传输和运行。
Kubernetes极速入门
Kubernetes(K8S)是Google在2014年发布的一个开源项目,用于自动化容器化应用程序的部署、扩展和管理。Kubernetes通常结合docker容器工作,并且整合多个运行着docker容器的主机集群。 本课程从Kubernetes的简介、功能、架构,集群的概念、工具及部署等各个方面进行了详细的讲解及展示,通过对本课程的学习,可以对Kubernetes有一个较为全面的认识,并初步掌握Kubernetes相关的安装部署及使用技巧。本课程由黑马程序员提供。   相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
Web App开发 安全 Java
开源漏洞扫描工具(OWASP-Dependency-Check)探索
背景 随着公司逐渐发展壮大,网络信息安全变得越来越重要。由此激发了我们成立兴趣小组(凯京爆破小组)研究网络信息安全的欲望。然而信息安全的防范,还得从底层编码开始做起。这样依赖性扫描工具(OWASP-Dependency-Check)就进入了我们的视线,既符合我们当前的需求又使用方便简单,自然而然的成为了我们探索的对象。
18348 0
|
安全 Linux 网络协议
几款Linux系统漏洞扫描、评估工具简介
一、Nmap Nmap 是一种常用工具,可用于判定网络的布局。我们可以在网络上使用 Nmap 来查找主机系统以及打开这些系统的端口。
2441 0
|
5月前
|
数据采集 云安全 SQL
数字化时代下的网络安全,漏洞扫描工具提供更好的保障
在数字化时代,企业的网络安全对于其成功实现数字化转型具有重要意义。漏洞扫描工具作为网络安全防护的重要组成部分,能够帮助企业快速发现漏洞,提高数字化转型的安全性和稳定性。
|
Prometheus Kubernetes 安全
5 款漏洞扫描工具:实用、强力、全面(含开源)(一)
5 款漏洞扫描工具:实用、强力、全面(含开源)
3558 1
5 款漏洞扫描工具:实用、强力、全面(含开源)(一)
|
7月前
|
安全 算法 Linux
【专栏】Linux 服务器还有漏洞?OpenVAS 是一款开源的漏洞扫描工具,用于全面评估 Linux 服务器安全
【4月更文挑战第28天】OpenVAS 是一款开源的漏洞扫描工具,用于全面评估 Linux 服务器安全。它具有全面性、准确性和实时性的特点,能扫描各种设备并及时发现安全漏洞。使用 OpenVAS 包括安装、配置和执行扫描,以及分析结果并采取修复措施。在使用过程中应注意扫描时间、范围和策略的选择。通过定期检查和修复漏洞,结合其他安全措施,可以提升服务器安全性。OpenVAS 是保障 Linux 服务器安全的重要工具,但安全维护也需要持续学习和适应新挑战。
209 1
|
监控 安全 API
5 款漏洞扫描工具:实用、强力、全面(含开源)(二)
5 款漏洞扫描工具:实用、强力、全面(含开源)
1038 0
5 款漏洞扫描工具:实用、强力、全面(含开源)(二)
|
安全 Linux iOS开发
【漏洞扫描工具】Acunetix-Web应用系统漏扫工具
Acunetix-Web应用系统漏扫工具,下载安装包以及破解补丁。
465 1
|
安全 定位技术
漏洞扫描工具 -- Skipfish
漏洞扫描工具 -- Skipfish
597 0
漏洞扫描工具 -- Skipfish
|
数据采集 安全
漏洞扫描工具 -- awvs13
漏洞扫描工具 -- awvs13
411 0
漏洞扫描工具 -- awvs13
|
SQL 安全 Oracle
5 款漏洞扫描工具:实用、强力、全面(含开源)(三)
5 款漏洞扫描工具:实用、强力、全面(含开源)
1461 0
5 款漏洞扫描工具:实用、强力、全面(含开源)(三)