容器质量保证的命令行工具
项目描述
Singularity容器工具
这些是用于Singularity容器的工具,针对与持续集成一起使用进行安全和质量检查进行了优化。有关包在持续集成环境中使用的示例,请参阅stools-clair存储库。
在此工作中,我们将使用Clair OS与持续集成(travis和circle)结合,以扫描Singularity容器中的安全漏洞。
标签
请注意,在第一次发布之后,版本号与PyPI上的发布相对应,而不是与Singularity版本相对应。
- v0.0.13 (master) 添加了报告保存支持
- v3.2.1 使用Singularity v3.2.1及以上版本
- v2.4.5 使用Singularity v2.4.5
背景
Clair旨在作为服务器连续扫描Docker 层中的漏洞。由于以下原因,这不太适用于研究领域:
- Docker容器以层(.tar.gz文件)的形式出现,而Singularity镜像则是单个二进制文件,无法很好地与Clair“连接”。
- 大多数研究人员都无法支持此类服务的持续运行。
另一方面,一个典型的研究人员确实会使用像TravisCI和CircleCI这样的服务来运行他们的代码库进行测试。由于这些服务现在提供了运行容器和其他服务类型的功能,我们实际上可以这样做
- 在测试期间启动Clair服务器
- 构建一个Singularity镜像,并扫描文件系统内容(在镜像最终确定之前)。
虽然这不是一个持续运行的服务,但我们至少可以确保每次构建容器时都对其进行扫描(然后很可能合并到生产中使用)。如果用户利用Singularity Hub或Singularity注册服务器,在通过这些各种测试后,镜像将被推送到或构建用于生产。
这个实验基于这个线程中的早期讨论。
基本用法
首先需要克隆仓库
git clone https://github.com/singularityhub/stools
cd stools
构建容器
如果您愿意,可以构建容器(或使用来自Docker Hub的标记版本)。
$ docker build -t vanessa/stools-clair .
使用docker compose启动应用程序。请注意,您应该将想要扫描的镜像放在$PWD中,这些镜像将被映射到容器的/code
中(参见docker-compose.yml文件)。您可以更改这些设置,只要确保您想要添加的容器都放在这里即可。
$ docker-compose up -d
确保您的容器已启动并运行!有一个clair服务器我们将与之交互,还有一个用于数据库。
$ docker-compose ps
Name Command State Ports
-----------------------------------------------------------------------------------------------------------------
clair-db docker-entrypoint.sh postgres Up 0.0.0.0:5432->5432/tcp
clair-scanner /clair -config=/config/con ... Up 0.0.0.0:6060->6060/tcp, 6061/tcp, 0.0.0.0:8080->8080/tcp
此外,请注意,由于reports文件夹位于挂载的当前工作目录中,因此它将出现在容器的/code/reports
中。我们稍后会需要知道这一点。
扫描镜像
让我们扫描一个本地镜像,它在容器中的/code
映射到$PWD。首先从您选择的注册表中拉取一个
$ singularity pull shub://vsoch/singularity-images
现在让我们开始扫描!我们通过向clair-scanner
容器执行命令来完成这项工作。最基本的用法将只是打印报告到stdout,如下所示
$ docker exec -it clair-scanner sclair singularity-images_latest.sif
...
CVE-2016-9843 (Low)
http://people.ubuntu.com/~ubuntu-security/cve/CVE-2016-9843
The crc32_big function in crc32.c in zlib 1.2.8 might allow context-dependent attackers to have unspecified impact via vectors involving big-endian CRC calculation.
保存报告
但是,如果您想将报告保存到文件(json),可以添加--report
参数,指向您选择的现有输出目录。例如,由于reports提供在我们的当前工作目录中,并且已经绑定到容器的/code/reports
,我们可以将其指定为参数
$ docker exec -it clair-scanner sclair --report /code/reports singularity-images_latest.sif
使用--report
参数不会禁用打印到stdout。但是,如果您想禁用它,可以添加--no-print
选项。一个示例JSON报告可以在reports文件夹中找到。
$ docker exec -it clair-scanner sclair --report /code/reports --no-print singularity-images_latest.sif
有关打印到stdout的完整示例(使用具有已知漏洞的容器),请参阅示例测试文件夹。