扫描 Docker 强化镜像
Docker 强化镜像 (DHI) 默认情况下是安全的,但与任何容器镜像一样,定期扫描它们作为漏洞管理过程的一部分非常重要。
您可以使用与扫描标准镜像相同的工具(例如 Docker Scout、Grype 和 Trivy)来扫描 DHI。DHI 遵循相同的格式和标准,以确保您的安全工具的兼容性。在扫描镜像之前,必须将镜像镜像到您在 Docker Hub 上的组织中。
注意Docker Scout 已为 Docker Hub 上所有镜像的 Docker 强化镜像仓库自动启用,无需额外费用。您可以在 Docker Hub UI 中您组织的仓库下直接查看扫描结果。
Docker Scout
Docker Scout 已集成到 Docker Desktop 和 Docker CLI 中。它提供漏洞洞察、CVE 摘要和指向修复指南的直接链接。
使用 Docker Scout 扫描 DHI
要使用 Docker Scout 扫描 Docker 强化镜像,请运行以下命令
$ docker scout cves <your-namespace>/dhi-<image>:<tag> --platform <platform>
示例输出
v SBOM obtained from attestation, 101 packages found
v Provenance obtained from attestation
v VEX statements obtained from attestation
v No vulnerable package detected
...有关更详细的过滤和 JSON 输出,请参阅Docker Scout CLI 参考。
使用 Docker Scout 在 CI/CD 中自动化 DHI 扫描
将 Docker Scout 集成到您的 CI/CD 管道中,可以自动验证从 Docker 强化镜像构建的镜像在构建过程中是否仍然没有已知漏洞。这种主动方法可确保您的镜像在整个开发生命周期中持续保持安全完整性。
GitHub Actions 工作流程示例
以下是使用 Docker Scout 构建和扫描镜像的 GitHub Actions 工作流程示例
name: DHI Vulnerability Scan
on:
push:
branches: [ main ]
pull_request:
branches: [ "**" ]
env:
REGISTRY: docker.io
IMAGE_NAME: ${{ github.repository }}
SHA: ${{ github.event.pull_request.head.sha || github.event.after }}
jobs:
scan:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
pull-requests: write
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Log in to Docker Hub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Build Docker image
run: |
docker build -t ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ env.SHA }} .
- name: Run Docker Scout CVE scan
uses: docker/scout-action@v1
with:
command: cves
image: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ env.SHA }}
only-severities: critical,high
exit-code: trueexit-code: true 参数确保如果检测到任何关键或高严重性漏洞,工作流程将失败,从而防止部署不安全的镜像。
有关在 CI 中使用 Docker Scout 的更多详细信息,请参阅将 Docker Scout 与其他系统集成。
Grype
Grype 是一个开源扫描器,用于根据 NVD 和发行版咨询等漏洞数据库检查容器镜像。
使用 Grype 扫描 DHI
安装 Grype 后,您可以通过拉取镜像并运行扫描命令来扫描 Docker 强化镜像
$ docker pull <your-namespace>/dhi-<image>:<tag>
$ grype <your-namespace>/dhi-<image>:<tag>
示例输出
NAME INSTALLED FIXED-IN TYPE VULNERABILITY SEVERITY EPSS% RISK
libperl5.36 5.36.0-7+deb12u2 (won't fix) deb CVE-2023-31484 High 79.45 1.1
perl 5.36.0-7+deb12u2 (won't fix) deb CVE-2023-31484 High 79.45 1.1
perl-base 5.36.0-7+deb12u2 (won't fix) deb CVE-2023-31484 High 79.45 1.1
...您应该包含 --vex 标志以在扫描期间应用 VEX 声明,这将过滤掉已知不可利用的 CVE。有关更多信息,请参阅VEX 部分。
Trivy
Trivy 是一个用于容器和其他工件的开源漏洞扫描器。它检测操作系统包和应用程序依赖项中的漏洞。
使用 Trivy 扫描 DHI
安装 Trivy 后,您可以通过拉取镜像并运行扫描命令来扫描 Docker 强化镜像
$ docker pull <your-namespace>/dhi-<image>:<tag>
$ trivy image <your-namespace>/dhi-<image>:<tag>
示例输出
Report Summary
┌──────────────────────────────────────────────────────────────────────────────┬────────────┬─────────────────┬─────────┐
│ Target │ Type │ Vulnerabilities │ Secrets │
├──────────────────────────────────────────────────────────────────────────────┼────────────┼─────────────────┼─────────┤
│ <namespace>/dhi-<image>:<tag> (debian 12.11) │ debian │ 66 │ - │
├──────────────────────────────────────────────────────────────────────────────┼────────────┼─────────────────┼─────────┤
│ opt/python-3.13.4/lib/python3.13/site-packages/pip-25.1.1.dist-info/METADATA │ python-pkg │ 0 │ - │
└──────────────────────────────────────────────────────────────────────────────┴────────────┴─────────────────┴─────────┘您应该包含 --vex 标志以在扫描期间应用 VEX 声明,这将过滤掉已知不可利用的 CVE。有关更多信息,请参阅VEX 部分。
使用 VEX 过滤已知不可利用的 CVE
Docker 强化镜像包含签名的 VEX(漏洞可利用性交换)声明,用于识别与镜像运行时行为不相关的漏洞。
使用 Docker Scout 时,这些 VEX 声明会自动应用,无需手动配置。
要为支持 VEX 的工具手动创建 JSON 文件 VEX 声明
$ docker scout attest get \
--predicate-type https://openvex.dev/ns/v0.2.0 \
--predicate \
<your-namespace>/dhi-<image>:<tag> --platform <platform> > vex.json
例如:
$ docker scout attest get \
--predicate-type https://openvex.dev/ns/v0.2.0 \
--predicate \
docs/dhi-python:3.13 --platform linux/amd64 > vex.json
这将创建一个包含指定镜像的 VEX 声明的 vex.json 文件。然后,您可以将此文件与支持 VEX 的工具一起使用,以过滤掉已知不可利用的 CVE。
例如,对于 Grype 和 Trivy,您可以使用 --vex 标志在扫描期间应用 VEX 声明
$ grype <your-namespace>/dhi-<image>:<tag> --vex vex.json