Docker:使用 Trivy 和 Copa 修补镜像漏洞
Docker 容器镜像通常包含继承自其基础操作系统包的安全漏洞。与其从头重建镜像,不如使用 Trivy 扫描漏洞,并使用 Copa 直接修复它们。本教程演示了如何在 Ubuntu、Debian、RHEL、CentOS 和 Fedora 系统上使用这两个强大的开源工具识别并修复容器漏洞。
在本教程中,您将学习:
- 如何在 Ubuntu/Debian 上安装 Trivy 漏洞扫描器
- 如何安装Copa容器修补工具
- 如何扫描 Docker 镜像中的操作系统漏洞
- 如何自动修补容器漏洞
- 如何验证补丁后的镜像没有漏洞
文章摘要: 使用 Trivy 扫描 Docker 镜像中的漏洞,并使用 Copa 自动修复它们。
| 步骤 | 命令/操作 |
|---|---|
| 1. 扫描图像 | |
| 2. 导出 JSON 报告 | |
| 3. 启动 BuildKit | |
| 4. 补丁图像 | |
步骤 1:安装 Trivy 漏洞扫描器
Trivy 是由 Aqua 安全公司开发的开源漏洞扫描器。它可以检测操作系统软件包、应用程序依赖项和容器镜像中的漏洞。
Ubuntu/Debian
-
安装依赖项:首先安装添加仓库所需的 wget 和 gnupg 软件包:
$ sudo apt-get install wget gnupg -y 添加 Trivy GPG 密钥:下载并添加 Trivy 仓库签名密钥:
$ wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | gpg --dearmor | sudo tee /usr/share/keyrings/trivy.gpg > /dev/null添加 Trivy 仓库:将官方 Trivy 仓库添加到您的源列表中:
$ echo "deb [signed-by=/usr/share/keyrings/trivy.gpg] https://aquasecurity.github.io/trivy-repo/deb generic main" | sudo tee -a /etc/apt/sources.list.d/trivy.list安装 Trivy:更新软件包列表并安装 Trivy:
$ sudo apt-get update $ sudo apt-get install trivy -y
RHEL/CentOS/Fedora
添加 Trivy 仓库:创建 Trivy 仓库文件:
# sudo tee /etc/yum.repos.d/trivy.repo << 'EOF' [trivy] name=Trivy repository baseurl=https://aquasecurity.github.io/trivy-repo/rpm/releases/$basearch/ gpgcheck=1 enabled=1 gpgkey=https://aquasecurity.github.io/trivy-repo/rpm/public.key EOF安装 Trivy:使用 dnf 或 yum 安装:
# sudo dnf install trivy -y
通过检查版本来验证安装:
$ trivy --version步骤 2:安装 Copa 修补工具
Copa(Copacetic)是一个 CNCF 沙箱项目,可以直接修补容器镜像,而无需完全重建。它使用来自 Trivy 等扫描器的漏洞报告来应用安全更新。Copa 以单个二进制文件的形式分发,可在所有 Linux 发行版上运行。
下载 Copa 二进制文件:从官方 Copa GitHub 发布页面获取预编译的二进制文件:
$ wget https://github.com/project-copacetic/copacetic/releases/download/v0.9.0/copa_0.9.0_linux_amd64.tar.gz解压档案:解压下载的 tar 包:
$ tar -xzf copa_0.9.0_linux_amd64.tar.gz-
安装 Copa:将可执行文件移动到系统路径中:
$ sudo mv copa /usr/local/bin/ 验证安装:确认 Copa 已正确安装:
$ copa --version
步骤3:扫描容器镜像的漏洞
在打补丁之前,你需要识别容器镜像中的漏洞。以下步骤以 linuxconfig/instantprivacy 为例——请用你自己的镜像名称替换它。
拉取容器镜像:下载你想要扫描的镜像:
$ sudo docker pull linuxconfig/instantprivacy扫描漏洞:运行 Trivy 扫描操作系统层面的漏洞。
--ignore-unfixed标志会排除没有可用修复的漏洞:$ sudo trivy image --vuln-type os --ignore-unfixed linuxconfig/instantprivacy导出 JSON 报告:Copa 需要以 JSON 格式提供扫描结果:
$ trivy image --vuln-type os --ignore-unfixed -f json -o instantprivacy.json linuxconfig/instantprivacy
步骤 4:使用 Copa 修补容器镜像
Copa 使用 BuildKit 对容器镜像应用补丁。
启动 BuildKit 容器:以特权容器的方式启动 BuildKit:
$ sudo docker run --detach --rm --privileged \ -p 127.0.0.1:8888:8888/tcp \ --name buildkitd \ --entrypoint buildkitd \ moby/buildkit:v0.11.4 \ --addr tcp://0.0.0.0:8888-
验证 BuildKit 是否正在运行:确认容器已成功启动:
$ sudo docker ps 修补容器镜像:使用 Copa 应用安全补丁。
-t标志指定修补后镜像的标签:$ sudo copa patch \ -i docker.io/linuxconfig/instantprivacy \ -r instantprivacy.json \ -t patched \ -a tcp://0.0.0.0:8888Copa 会下载安全更新并创建一个应用了补丁的新镜像层。应用补丁的镜像将被标记为
linuxconfig/instantprivacy:patched。
步骤5:验证已修补的图像
扫描已修补的镜像:确认所有漏洞已被修复:
$ sudo trivy image --vuln-type os --ignore-unfixed linuxconfig/instantprivacy:patched测试修补后的镜像:验证修补后的镜像是否能正常运行:
$ sudo docker run --name=instantprivacy -d -p 8118:8118 linuxconfig/instantprivacy:patched $ export http_proxy="http://localhost:8118" $ curl api.ipify.org 45.84.107.174清理:完成后停止 BuildKit 容器:
$ sudo docker stop buildkitd
结论
您已成功使用 Trivy 扫描 Docker 容器镜像的安全漏洞,并使用 Copa 自动修复它们。这种方法比从头重新构建镜像更快,并且只增加一个补丁层,从而保留了原始镜像结构。对于生产环境,将这些工具集成到您的 CI/CD 流水线中,以在部署前自动扫描和修复容器镜像。有关更多信息,请参阅 Trivy 官方文档和 Copa 项目网站。
常见问题
- Copa 可以修补哪些类型的漏洞? Copa 仅修补操作系统级别的软件包漏洞(例如 Debian、Ubuntu、Alpine 或 RHEL 软件包)。它无法修补应用程序级别的依赖项,如 npm 包、Python pip 模块或 Go 模块。对于这些情况,您需要使用更新的依赖项重新构建应用程序。
- 为什么我需要 BuildKit 来运行 Copa? Copa 使用 BuildKit 的差异和合并功能来创建一个只包含已修补文件的新镜像层。BuildKit 作为一个特权容器运行,负责处理低级别的镜像操作。如果没有 BuildKit,Copa 无法将补丁应用到容器文件系统。
- 我可以对私有注册表中的镜像进行修补吗? 可以,Copa 支持私有注册表。你需要在运行修补命令之前使用
docker login进行身份验证。Copa 会使用你的 Docker 凭据来拉取基础镜像,并在需要时推送修补后的结果。 - 如果Copa无法修补所有漏洞,会发生什么? 有些漏洞可能尚未有可用的修复程序。Trivy中的
--ignore-unfixed标志会将这些漏洞从报告中排除。Copa会修补所有已有可用修复程序的漏洞。再次运行Trivy时,如果不使用--ignore-unfixed,则可以看到包括等待修补的漏洞在内的所有漏洞。 - 我如何将 Copa 更新到最新版本? 从 Copa 的 GitHub 发布页面下载最新版本,然后替换
/usr/local/bin/中的二进制文件。使用copa --version检查当前版本。





