网站搜索

Docker:使用 Trivy 和 Copa 修补镜像漏洞


Docker 容器镜像通常包含继承自其基础操作系统包的安全漏洞。与其从头重建镜像,不如使用 Trivy 扫描漏洞,并使用 Copa 直接修复它们。本教程演示了如何在 Ubuntu、Debian、RHEL、CentOS 和 Fedora 系统上使用这两个强大的开源工具识别并修复容器漏洞。

在本教程中,您将学习:

  • 如何在 Ubuntu/Debian 上安装 Trivy 漏洞扫描器
  • 如何安装Copa容器修补工具
  • 如何扫描 Docker 镜像中的操作系统漏洞
  • 如何自动修补容器漏洞
  • 如何验证补丁后的镜像没有漏洞

文章摘要: 使用 Trivy 扫描 Docker 镜像中的漏洞,并使用 Copa 自动修复它们。

步骤命令/操作
1. 扫描图像
sudo trivy image --vuln-type os --ignore-unfixed IMAGE_NAME
2. 导出 JSON 报告
trivy image --vuln-type os --ignore-unfixed -f json -o report.json IMAGE_NAME
3. 启动 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
4. 补丁图像
sudo copa patch -i IMAGE_NAME -r report.json -t patched -a tcp://0.0.0.0:8888

步骤 1:安装 Trivy 漏洞扫描器

Trivy 是由 Aqua 安全公司开发的开源漏洞扫描器。它可以检测操作系统软件包、应用程序依赖项和容器镜像中的漏洞。

Ubuntu/Debian

  1. 安装依赖项:首先安装添加仓库所需的 wget 和 gnupg 软件包:

    $ sudo apt-get install wget gnupg -y
  2. 添加 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
  3. 添加 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
  4. 安装 Trivy:更新软件包列表并安装 Trivy:

    $ sudo apt-get update
    $ sudo apt-get install trivy -y

RHEL/CentOS/Fedora

  1. 添加 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
  2. 安装 Trivy:使用 dnf 或 yum 安装:

    # sudo dnf install trivy -y

通过检查版本来验证安装:

$ trivy --version

步骤 2:安装 Copa 修补工具

Copa(Copacetic)是一个 CNCF 沙箱项目,可以直接修补容器镜像,而无需完全重建。它使用来自 Trivy 等扫描器的漏洞报告来应用安全更新。Copa 以单个二进制文件的形式分发,可在所有 Linux 发行版上运行。

  1. 下载 Copa 二进制文件:从官方 Copa GitHub 发布页面获取预编译的二进制文件:

    $ wget https://github.com/project-copacetic/copacetic/releases/download/v0.9.0/copa_0.9.0_linux_amd64.tar.gz
  2. 解压档案:解压下载的 tar 包:

    $ tar -xzf copa_0.9.0_linux_amd64.tar.gz
  3. 安装 Copa:将可执行文件移动到系统路径中:

    $ sudo mv copa /usr/local/bin/
  4. 验证安装:确认 Copa 已正确安装:

    $ copa --version

步骤3:扫描容器镜像的漏洞

在打补丁之前,你需要识别容器镜像中的漏洞。以下步骤以 linuxconfig/instantprivacy 为例——请用你自己的镜像名称替换它。

  1. 拉取容器镜像:下载你想要扫描的镜像:

    $ sudo docker pull linuxconfig/instantprivacy
  2. 扫描漏洞:运行 Trivy 扫描操作系统层面的漏洞。--ignore-unfixed 标志会排除没有可用修复的漏洞:

    $ sudo trivy image --vuln-type os --ignore-unfixed linuxconfig/instantprivacy
  3. 导出 JSON 报告:Copa 需要以 JSON 格式提供扫描结果:

    $ trivy image --vuln-type os --ignore-unfixed -f json -o instantprivacy.json linuxconfig/instantprivacy

步骤 4:使用 Copa 修补容器镜像

Copa 使用 BuildKit 对容器镜像应用补丁。

  1. 启动 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
  2. 验证 BuildKit 是否正在运行:确认容器已成功启动:

    $ sudo docker ps

  3. 修补容器镜像:使用 Copa 应用安全补丁。-t 标志指定修补后镜像的标签:

    $ sudo copa patch \
      -i docker.io/linuxconfig/instantprivacy \
      -r instantprivacy.json \
      -t patched \
      -a tcp://0.0.0.0:8888

    Copa 会下载安全更新并创建一个应用了补丁的新镜像层。应用补丁的镜像将被标记为 linuxconfig/instantprivacy:patched。

步骤5:验证已修补的图像

  1. 扫描已修补的镜像:确认所有漏洞已被修复:

    $ sudo trivy image --vuln-type os --ignore-unfixed linuxconfig/instantprivacy:patched
  2. 测试修补后的镜像:验证修补后的镜像是否能正常运行:

    $ 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
  3. 清理:完成后停止 BuildKit 容器:

    $ sudo docker stop buildkitd

结论

您已成功使用 Trivy 扫描 Docker 容器镜像的安全漏洞,并使用 Copa 自动修复它们。这种方法比从头重新构建镜像更快,并且只增加一个补丁层,从而保留了原始镜像结构。对于生产环境,将这些工具集成到您的 CI/CD 流水线中,以在部署前自动扫描和修复容器镜像。有关更多信息,请参阅 Trivy 官方文档和 Copa 项目网站。

常见问题

  1. Copa 可以修补哪些类型的漏洞? Copa 仅修补操作系统级别的软件包漏洞(例如 Debian、Ubuntu、Alpine 或 RHEL 软件包)。它无法修补应用程序级别的依赖项,如 npm 包、Python pip 模块或 Go 模块。对于这些情况,您需要使用更新的依赖项重新构建应用程序。
  2. 为什么我需要 BuildKit 来运行 Copa? Copa 使用 BuildKit 的差异和合并功能来创建一个只包含已修补文件的新镜像层。BuildKit 作为一个特权容器运行,负责处理低级别的镜像操作。如果没有 BuildKit,Copa 无法将补丁应用到容器文件系统。
  3. 我可以对私有注册表中的镜像进行修补吗? 可以,Copa 支持私有注册表。你需要在运行修补命令之前使用 docker login 进行身份验证。Copa 会使用你的 Docker 凭据来拉取基础镜像,并在需要时推送修补后的结果。
  4. 如果Copa无法修补所有漏洞,会发生什么? 有些漏洞可能尚未有可用的修复程序。Trivy中的--ignore-unfixed标志会将这些漏洞从报告中排除。Copa会修补所有已有可用修复程序的漏洞。再次运行Trivy时,如果不使用--ignore-unfixed,则可以看到包括等待修补的漏洞在内的所有漏洞。
  5. 我如何将 Copa 更新到最新版本? 从 Copa 的 GitHub 发布页面下载最新版本,然后替换 /usr/local/bin/ 中的二进制文件。使用 copa --version 检查当前版本。