dockerscan:基于 Go 的 Docker 容器安全扫描项目

The Most Comprehensive Docker Security Scanner

分支4Tags5
DockerScan 标志

DockerScan

最全面的 Docker 安全扫描器

许可证 Go 版本 版本 CI/CD 测试覆盖率 Go Report Card 下载量

作者:Daniel Alfocea (cr0hn) | GitHub | 网站

功能 • 安装 • 快速开始 • 文档 • 用例 • 更新内容 • 贡献指南

目录

Warning

2.0.6 及更早版本会静默地报告软件包 CVE 数量为零。 一个查询缺陷导致软件包漏洞检查在每次扫描时失败并丢弃错误,因此旧版二进制文件无论镜像或数据库如何,始终显示 0 个软件包 CVE 结果。强烈建议升级到 v2.1.0 或更高版本 —— 这是软件包 CVE 检测真正可用的第一个版本。

概述

DockerScan v2 是面向 Docker 容器和镜像的下一代安全扫描器,使用 Go 完全重写。它基于 2024—2025 年最新研究、行业标准(CIS Benchmark、NIST SP 800-190)以及生产环境中发现的真实攻击模式,融合了多种安全扫描技术。

为什么选择 DockerScan v2?

  • 覆盖全面:将 5 种以上安全扫描技术整合到一个工具中
  • 最新研究:基于 2024—2025 年供应链攻击和 CVE
  • 生产可用:提供 SARIF 输出用于 CI/CD,并提供退出码以支持自动化
  • 速度极快:使用 Go 编写,并支持并发扫描
  • 易于扩展:采用插件架构,支持自定义扫描器
  • 源码可获取:免费用于内部使用、教学、研究以及非竞争性商业用途(参见 License)

功能

安全扫描模块

1. CIS Docker Benchmark v1.7.0

提供完整的合规检查,包含 80 多项自动化控制项:

  • 主机配置安全(13 项检查)
  • Docker daemon 加固(18 项检查)
  • 文件与目录权限(9 项检查)
  • 容器镜像最佳实践(13 项检查)
  • 运行时安全验证(31 项以上检查)
  • 安全运维合规

2. 供应链攻击检测

基于 2024 年真实攻击活动:

  • 无镜像容器检测 - 识别没有实际镜像层的恶意容器(在 Docker Hub 发现 400 万多个)
  • 加密货币挖矿检测 - 检测挖矿恶意软件(已检测 12 万多次恶意镜像拉取)
  • 后门依赖库检测 - 发现被入侵的依赖项(xz-utils、liblzma 事件)
  • 镜像签名验证 - 使用 Notary/Cosign 验证签名
  • 钓鱼内容检测 - 扫描文档中的社会工程内容
  • 恶意网络目的地 - 识别 C2 服务器、矿池和 Tor 节点

3. 高级敏感信息检测

包含 40 多种敏感信息模式,覆盖现代 API(2024 年更新):

  • 云服务提供商:AWS、GCP、Azure 凭证
  • 版本控制:GitHub、GitLab、Bitbucket token
  • AI/ML API:OpenAI、Anthropic、Hugging Face 密钥
  • 支付:Stripe、PayPal、Square 密钥
  • 通信服务:Slack、SendGrid、Twilio、Mailchimp
  • 身份认证:JWT token、OAuth token
  • 加密:私钥(RSA、SSH、PGP、EC、DSA)、证书
  • 数据库:PostgreSQL、MySQL、MongoDB 连接字符串
  • Docker:Registry 认证 token
  • 熵分析:对未知敏感信息进行 Shannon 熵计算(阈值 >4.5)

4. CVE 与漏洞扫描

检测 2024—2025 年关键 CVE:

  • CVE-2024-21626 - runc 容器逃逸(CVSS 8.6)
  • CVE-2024-23651 - BuildKit 缓存投毒 RCE(CVSS 9.1)
  • CVE-2024-23652 - BuildKit 竞态条件(CVSS 7.5)
  • CVE-2024-23653 - BuildKit 权限提升
  • CVE-2024-8695/8696 - Docker Desktop RCE(CVSS 8.8)
  • CVE-2025-9074 - Docker Desktop 本地访问漏洞
  • 生命周期结束的基础镜像检测
  • 已知存在漏洞的软件包扫描

5. 运行时安全分析

容器运行时加固检查:

  • Linux Capabilities 审计 - 检测危险 capability(CAP_SYS_ADMIN、CAP_NET_ADMIN 等)
  • Seccomp Profile 验证 - 确保已启用系统调用过滤
  • AppArmor/SELinux 检查 - 验证强制访问控制
  • 特权容器检测 - 识别拥有完整主机访问权限的容器
  • 命名空间隔离 - 检查 PID、IPC、网络和用户命名空间
  • 容器逃逸迹象 - 检测常见容器逃逸技术

报告与集成

  • JSON - 面向自动化流程的机器可读输出
  • SARIF - 原生集成:
    • GitHub 安全页签
    • Azure DevOps
    • VS Code 扩展
    • GitLab 安全仪表盘
  • 精美的 CLI - 带表情符号的彩色严重级别
  • 退出码 - 兼容 CI/CD(0=无问题,1=警告,2=严重)

性能

  • 速度提升 10 倍,相比 Python 替代方案
  • 并发扫描,使用 Go goroutine
  • 低内存占用(约 50-100MB)
  • 单一二进制文件 - 无依赖

v2.1.0 更新内容

版本 2.1.0(发布于 2026-07-13)全面重构了 CVE 数据管道与软件包漏洞匹配:

  • 基于 MITRE cvelistV5 构建的 CVE 数据库 - 数据库现在基于官方 MITRE cvelistV5 每日快照生成,而不再依赖 NVD API。无 NVD API 依赖、无 API 密钥,且无速率限制。
  • 软件包 CVE 检测全链路修复 - 软件包到 CVE 的匹配逻辑已围绕 dpkg 风格版本比较器(Debian Policy 5.6.12)重写,并使用按(供应商、产品)划分的版本范围实现精准匹配。
  • 供应商验证的别名匹配 - 匹配结果现在携带 vendor_verified 检测元数据。仅凭名称的匹配会被明确标记,并包含修复注意事项,以便区分供应商验证匹配和启发式匹配。
  • 派生修复信息 - FixedVersion 根据匹配到的版本范围推导得出,并包含回移披露元数据(match_basis、distro_revision),确保发行版回移修复不会被误报为存在漏洞。
  • 可选的 NVD CVSS 增强 - 一个尽力而为的增强步骤可通过 --enrich-from-nvd、--enrich-only 和 --enrich-timeout 从 NVD API 拉取 CVSS 评分。该步骤为非阻塞,且在 CI 中可安全跳过(不会导致构建失败)。

v2.0 有哪些新变化?

DockerScan v2.0 是一次从头开始的完整重写。与 v1.x 相比,变化如下:

主要变化

功能 v1.x(Python) v2.0(Go)
语言 Python 3.5+ Go 1.21+
性能 约 500 个镜像/小时 约 5000 个镜像/小时
内存使用量 200-500 MB 50-100 MB
分发方式 pip 安装 + 依赖 单一二进制文件
安全扫描器 2 个模块 5 个模块
CIS 基准 部分支持 完整 v1.7.0(80+ 项检查)
供应链 不可用 基于 2024 年研究
密钥模式 10 种模式 40+ 种模式
CVE 检测 基础 2024-2025 年 CVE
运行时安全 不可用 完整能力审计
SARIF 输出 不可用 完整支持
CI/CD 集成 手动 原生(退出码、SARIF)

v1.x 中保留的内容

  • 攻击工具 - 镜像木马化能力(v2.1 即将推出)
  • 镜像仓库操作 - 推送、拉取和删除操作(v2.1 即将推出)
  • 网络扫描 - Docker 镜像仓库发现(v2.1 即将推出)

v2.0.5 新增内容

  • 私有镜像仓库认证 - 完整支持扫描来自私有镜像仓库的镜像(修复 #24)
  • 多镜像仓库支持 - Docker Hub、GHCR、ECR、GCR、ACR、GitLab 以及自建镜像仓库
  • 多种认证方式 - 环境变量(CI/CD)、CLI 参数(测试)、Docker 配置文件(无缝)
  • 智能认证优先级 - CLI 参数 > 环境变量 > Docker 配置(自动选择)
  • 增强错误提示 - 针对特定镜像仓库的提示(ECR 令牌过期、速率限制、证书)
  • 全面测试 - 64 个测试用例,91.2% 覆盖率,并针对真实私有镜像仓库进行测试
  • 完整文档 - 提供所有主流云镜像仓库和认证方式的示例

v2.0.4 新增内容

  • CVE 数据库集成 - 包含 NVD 数据的本地 SQLite 数据库(覆盖 2.5 年的 CVE)
  • 每日自动更新 - GitHub Action 每日更新 CVE 数据库
  • CVE 并行下载 - 4 个并发进程,加快数据库构建(nvd2sqlite)
  • 带退避的重试 - 对受速率限制的 NVD API 请求自动重试
  • --from-file 参数 - 从本地文件安装 CVE 数据库(离线/物理隔离)
  • 安静模式(-q) - 在 CI/CD 流水线中隐藏启动横幅
  • 减少误报 - 通过熵值过滤提升敏感信息检测能力

为什么重写?

  1. 性能 - 借助 goroutines,Go 可提供 10 倍更快的扫描速度
  2. 现代威胁 - 纳入 2024-2025 年的攻击模式
  3. 企业级就绪 - SARIF 输出、退出码、单二进制文件分发
  4. 可扩展性 - 清晰的插件架构,便于自定义扫描器
  5. 可维护性 - 类型安全、更完善的错误处理、更便于贡献

安装

选项 1:下载预构建二进制文件(推荐)

预编译二进制文件会通过 GitHub Actions 针对每个版本标签自动构建并发布。

支持的平台:

  • Linux:amd64、arm64、386
  • macOS:amd64(Intel)、arm64(Apple Silicon)
  • Windows:amd64、arm64、386
  • FreeBSD:amd64

Linux(amd64)

curl -L https://github.com/cr0hn/dockerscan/releases/latest/download/dockerscan-linux-amd64 -o dockerscan
chmod +x dockerscan
sudo mv dockerscan /usr/local/bin/

Linux (arm64)

curl -L https://github.com/cr0hn/dockerscan/releases/latest/download/dockerscan-linux-arm64 -o dockerscan
chmod +x dockerscan
sudo mv dockerscan /usr/local/bin/

macOS (Intel)

curl -L https://github.com/cr0hn/dockerscan/releases/latest/download/dockerscan-darwin-amd64 -o dockerscan
chmod +x dockerscan
sudo mv dockerscan /usr/local/bin/

macOS(Apple Silicon)

curl -L https://github.com/cr0hn/dockerscan/releases/latest/download/dockerscan-darwin-arm64 -o dockerscan
chmod +x dockerscan
sudo mv dockerscan /usr/local/bin/

Windows (PowerShell)

Invoke-WebRequest -Uri "https://github.com/cr0hn/dockerscan/releases/latest/download/dockerscan-windows-amd64.exe" -OutFile "dockerscan.exe"

验证下载(可选,但推荐)

# Download checksums
curl -L https://github.com/cr0hn/dockerscan/releases/latest/download/checksums.txt -o checksums.txt

# Verify (Linux/macOS)
sha256sum -c checksums.txt --ignore-missing

选项 2:从源码构建

# Clone repository
git clone https://github.com/cr0hn/dockerscan
cd dockerscan/dockerscan-v2

# Build
make build

# Install
sudo make install

# Or build manually
go build -o bin/dockerscan ./cmd/dockerscan

选项 3:Go 安装

go install github.com/cr0hn/dockerscan/v2/cmd/dockerscan@latest

快速开始

首次配置

扫描前,请下载 CVE 数据库(每日更新,压缩包约 30MB):

# Download latest CVE database from GitHub
dockerscan update-db

提示:该数据库每天通过 GitHub Actions 更新。请定期运行 update-db,以获取最新的 CVE 数据。

基础扫描

# Scan a Docker image
dockerscan nginx:latest

# Scan with specific scanners
dockerscan --scanners cis,secrets ubuntu:22.04

# Scan and save reports
dockerscan alpine:latest --output /tmp/reports

# Quiet mode (suppress banner)
dockerscan -q nginx:latest

示例输出

╔══════════════════════════════════════════════════════════════════════════╗
║   ██████╗  ██████╗  ██████╗██╗  ██╗███████╗██████╗ ███████╗ ██████╗ █████╗ ███╗   ██╗
║   ██╔══██╗██╔═══██╗██╔════╝██║ ██╔╝██╔════╝██╔══██╗██╔════╝██╔════╝██╔══██╗████╗  ██║
║   ██║  ██║██║   ██║██║     █████╔╝ █████╗  ██████╔╝███████╗██║     ███████║██╔██╗ ██║
║   ██║  ██║██║   ██║██║     ██╔═██╗ ██╔══╝  ██╔══██╗╚════██║██║     ██╔══██║██║╚██╗██║
║   ██████╔╝╚██████╔╝╚██████╗██║  ██╗███████╗██║  ██║███████║╚██████╗██║  ██║██║ ╚████║
║                                                                                        ║
║                Advanced Docker Security Scanner v2.0.0                                ║
║                                                                                        ║
║   Author:     Daniel Alfocea (cr0hn)                                                  ║
║   Website:    https://danielalfocea.com                                               ║
╚══════════════════════════════════════════════════════════════════════════════════════╝

🔍 Scanning image: nginx:latest

═══════════════════════════════════════════════════════════════════
                         SCAN RESULTS
═══════════════════════════════════════════════════════════════════

📊 Summary:
   Total Findings: 47
   Duration: 2.3s

🔴 By Severity:
   Critical: 8
   High:     15
   Medium:   18
   Low:      6

📁 By Category:
   CIS-Benchmark:      12
   Secrets:            8
   Supply-Chain:       5
   Vulnerability:      10
   Runtime-Security:   12

📄 JSON report saved to: dockerscan-report.json
📄 SARIF report saved to: dockerscan-report.sarif

使用方法

命令行选项

dockerscan [COMMAND] [OPTIONS] <IMAGE>

Commands:
  scan        Scan a Docker image (default)
  update-db   Download or update the CVE database
              Options: --from-file <path>  Install from local SQLite file
  version     Show version information
  help        Show help message

Options:
  -h, --help              Show help message
  -v, --version           Show version
  -q, --quiet             Suppress banner output (quiet mode)
  --scanners SCANNERS     Comma-separated list of scanners to run
                          (default: all)
                          Options: cis,secrets,supplychain,vulnerabilities,runtime
  --output DIR            Output directory for reports (default: .)
  --only-critical         Show only critical/high severity findings
  --verbose, -v           Show scan progress (scanner names, findings count, image pull status). Output to stderr.
  --debug                 Show verbose output plus internal errors and technical details. Output to stderr.

Authentication (for private registries):
  --registry-user <username>       Registry username
  --registry-password <password>   Registry password (not recommended, use env vars)
  --registry <url>                 Registry URL (optional, auto-detected from image)
  --docker-config <path>           Path to Docker config file (default: ~/.docker/config.json)

  Environment variables (recommended for CI/CD):
    DOCKER_USERNAME or REGISTRY_USERNAME     Registry username
    DOCKER_PASSWORD or REGISTRY_PASSWORD     Registry password or token
    DOCKER_REGISTRY or REGISTRY             Registry URL (optional)

Exit Codes:
  0   No issues found
  1   HIGH severity issues found
  2   CRITICAL severity found

示例

# Scan with all scanners (default)
dockerscan myapp:latest

# Only run specific scanners
dockerscan --scanners secrets,supplychain redis:7

# Save reports to specific directory
dockerscan --output /var/reports postgres:14

# Only show critical issues
dockerscan --only-critical production-app:v1.0

# Ver progreso del scan (scanner names, findings count, image pull status)
dockerscan --verbose ubuntu:22.04

# Debug detallado (errores internos, detalles técnicos)
dockerscan --debug ubuntu:22.04

# Scan private registry images (see Authentication section below)
dockerscan ghcr.io/myorg/private-app:v1.0

私有镜像仓库身份验证

DockerScan 支持通过三种方式对私有镜像仓库进行身份验证:

方法 1:Docker 配置文件(推荐本地使用)

最便捷的方式——使用您现有的 Docker 凭据:

# First, authenticate with your registry using Docker
docker login ghcr.io
# Username: your-username
# Password: ghp_your-token-here

# Now DockerScan can use these credentials automatically
dockerscan ghcr.io/myorg/private-app:latest

DockerScan 会自动从 ~/.docker/config.json 读取凭据。所有您已通过 docker login 登录的镜像仓库均适用。

完全支持 Credential helpers。 DockerScan 通过以下方式原生解析凭据:

  • credsStore — 全局凭据助手(例如 macOS 上 Docker Desktop 使用 osxkeychain,Windows 使用 wincred,Linux 使用 pass)
  • credHelpers — 按镜像仓库配置的凭据助手(优先级高于 credsStore)
  • 自动回退 — 如果指定的助手二进制文件未安装,DockerScan 将回退到 config.json 中的明文 auths 块

在 macOS 上的 Docker Desktop 中,此功能无需额外配置即可开箱即用:

{
  "credsStore": "osxkeychain"
}

DockerScan 会透明调用 docker-credential-osxkeychain 来获取 tokens,因此你无需显式传递 credentials。

方法 2:环境变量(推荐用于 CI/CD)

最适用于自动化环境和 CI/CD 流水线:

# Set environment variables
export DOCKER_USERNAME=myusername
export DOCKER_PASSWORD=mytoken

# Scan private image
dockerscan ghcr.io/myorg/private-app:latest

# Or use alternative variable names
export REGISTRY_USERNAME=myusername
export REGISTRY_PASSWORD=mytoken
dockerscan myregistry.example.com/app:v1.0

CI/CD 示例(GitHub Actions):

- name: Scan private image
  env:
    DOCKER_USERNAME: ${{ secrets.REGISTRY_USERNAME }}
    DOCKER_PASSWORD: ${{ secrets.REGISTRY_TOKEN }}
  run: dockerscan ghcr.io/${{ github.repository }}:${{ github.sha }}

方法 3:命令行参数(不推荐)

仅用于快速测试(凭据在进程列表中可见):

dockerscan --registry-user myuser --registry-password mytoken ghcr.io/myorg/app:v1

安全警告: 该方法会在 shell 历史记录和进程列表中暴露凭据。请改用环境变量或 Docker 配置。

针对特定镜像仓库的示例

Docker Hub(私有仓库)

# Using Docker config
docker login docker.io
dockerscan myusername/private-repo:latest

# Using environment variables
export DOCKER_USERNAME=myusername
export DOCKER_PASSWORD=dckr_pat_XXXXXXXXXXXXX
dockerscan myusername/private-repo:latest

GitHub 容器注册表 (GHCR)

# Using Docker config
echo $GITHUB_TOKEN | docker login ghcr.io -u USERNAME --password-stdin
dockerscan ghcr.io/myorg/myapp:v1.0

# Using environment variables
export DOCKER_USERNAME=myusername
export DOCKER_PASSWORD=ghp_XXXXXXXXXXXXXXXXXXXX
dockerscan ghcr.io/myorg/myapp:v1.0

AWS Elastic Container Registry (ECR)

# Get login credentials from AWS
aws ecr get-login-password --region us-east-1 | \
  docker login --username AWS --password-stdin \
  123456789012.dkr.ecr.us-east-1.amazonaws.com

# Scan ECR image
dockerscan 123456789012.dkr.ecr.us-east-1.amazonaws.com/myapp:latest

# Or use environment variables with ECR credentials
export DOCKER_USERNAME=AWS
export DOCKER_PASSWORD=$(aws ecr get-login-password --region us-east-1)
dockerscan 123456789012.dkr.ecr.us-east-1.amazonaws.com/myapp:latest

Google Container Registry (GCR) / Artifact Registry

# Authenticate with gcloud
gcloud auth configure-docker gcr.io

# Scan GCR image
dockerscan gcr.io/my-project/myapp:latest

# For Artifact Registry
gcloud auth configure-docker us-docker.pkg.dev
dockerscan us-docker.pkg.dev/my-project/my-repo/myapp:latest

# Or use service account JSON key
export DOCKER_USERNAME=_json_key
export DOCKER_PASSWORD="$(cat service-account-key.json)"
dockerscan gcr.io/my-project/myapp:latest

Azure Container Registry (ACR)

# Login with Azure CLI
az acr login --name myregistry

# Scan ACR image
dockerscan myregistry.azurecr.io/myapp:v1.0

# Or use service principal credentials
export DOCKER_USERNAME=<service-principal-id>
export DOCKER_PASSWORD=<service-principal-password>
dockerscan myregistry.azurecr.io/myapp:v1.0

GitLab 容器镜像仓库

# Using Docker config
docker login registry.gitlab.com
dockerscan registry.gitlab.com/mygroup/myproject/myapp:latest

# Using environment variables with deploy token
export DOCKER_USERNAME=gitlab+deploy-token-1
export DOCKER_PASSWORD=DEPLOY_TOKEN_HERE
dockerscan registry.gitlab.com/mygroup/myproject/myapp:latest

自托管/私有镜像仓库

# Standard authentication
docker login myregistry.example.com:5000
dockerscan myregistry.example.com:5000/myapp:latest

# With environment variables
export DOCKER_USERNAME=admin
export DOCKER_PASSWORD=secret
dockerscan myregistry.example.com:5000/myapp:latest

# Insecure registries (not recommended for production)
# Add to Docker daemon config: /etc/docker/daemon.json
# {
#   "insecure-registries": ["myregistry.example.com:5000"]
# }

认证故障排查

常见问题

1. “authentication required” 错误

# Make sure you're logged in
docker login <registry>

# Or set environment variables
export DOCKER_USERNAME=your-username
export DOCKER_PASSWORD=your-token

2. "unauthorized: authentication failed" 错误

  • 确认凭据正确
  • 检查令牌是否已过期(尤其是云服务商)
  • 确保您的账户具有拉取该镜像的权限

3. AWS ECR "authorization token has expired"

# ECR tokens expire after 12 hours - refresh them
aws ecr get-login-password --region us-east-1 | \
  docker login --username AWS --password-stdin \
  123456789012.dkr.ecr.us-east-1.amazonaws.com

4. Docker Hub 限流

  • 完成身份认证以提升限流阈值(免费账户为每 6 小时 200 次拉取)
  • 如需更高限制,可考虑使用 Docker Hub Pro 账户

5. 自签名证书导致的证书错误

  • 将 CA 证书添加到系统信任库
  • 或配置 Docker 信任该镜像仓库(参见 Docker 文档)

安全扫描器

CIS Docker Benchmark

针对 CIS Docker Benchmark v1.7.0 的自动化合规检查:

dockerscan --scanners cis nginx:latest

检查项包括:

  • 容器用户不是 root
  • 未安装不必要的软件包
  • 存在 HEALTHCHECK 指令
  • 使用特定版本标签(非 :latest)
  • 最小化暴露端口
  • 无特权容器
  • 限制 Linux 能力
  • 应用 Seccomp/AppArmor 配置
  • 根文件系统为只读
  • 还有 70 多项检查……

供应链安全

检测真实场景中的供应链攻击:

dockerscan --scanners supplychain suspicious-image:1.0

检测项目:

  • 无镜像容器(纯文档型攻击)
  • 加密货币挖矿程序(xmrig、claymore 等)
  • 含后门的库(xz-utils 事件)
  • 未签名/未验证镜像
  • 文档中的钓鱼尝试
  • 与挖矿池、C2 服务器的连接

密钥检测

查找硬编码的密钥:

dockerscan --scanners secrets webapp:prod

可检测项:

  • 云凭据(AWS、GCP、Azure)
  • API 密钥(40 多项服务)
  • 私钥与证书
  • 数据库凭据
  • Docker registry 认证信息
  • 高熵字符串(可能存在的未知机密)

漏洞扫描

检测已知 CVE:

dockerscan --scanners vulnerabilities node:16

检查项:

  • 严重 Docker CVE(2024-2025)
  • 容器逃逸漏洞
  • BuildKit RCE 漏洞
  • 停止维护的基础镜像
  • 存在漏洞的软件包

运行时安全

审计运行时配置:

dockerscan --scanners runtime running-container

分析内容:

  • Linux 能力(CAP_SYS_ADMIN 等)
  • Seccomp 配置文件
  • AppArmor/SELinux 策略
  • 命名空间隔离
  • 特权模式使用情况

输出格式

JSON 输出

{
  "target": {
    "image_name": "nginx:latest"
  },
  "start_time": "2024-11-22T10:30:00Z",
  "findings": [
    {
      "id": "CIS-4.1",
      "title": "Container should not run as root",
      "severity": "HIGH",
      "category": "CIS-Benchmark",
      "description": "Running containers as root increases attack surface...",
      "remediation": "Use USER instruction in Dockerfile..."
    }
  ],
  "summary": {
    "total_findings": 47,
    "by_severity": {
      "CRITICAL": 8,
      "HIGH": 15
    }
  }
}

SARIF 输出

兼容 GitHub Security、Azure DevOps 和 VS Code:

{
  "$schema": "https://raw.githubusercontent.com/oasis-tcs/sarif-spec/master/Schemata/sarif-schema-2.1.0.json",
  "version": "2.1.0",
  "runs": [
    {
      "tool": {
        "driver": {
          "name": "DockerScan",
          "version": "2.0.0"
        }
      },
      "results": [...]
    }
  ]
}

使用场景

1. CI/CD 流水线集成

GitHub Actions:

name: Docker Security Scan

on: [push]

jobs:
  security-scan:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3

      - name: Build Docker image
        run: docker build -t myapp:${{ github.sha }} .

      - name: Install DockerScan
        run: |
          curl -L https://github.com/cr0hn/dockerscan/releases/latest/download/dockerscan-linux-amd64 -o dockerscan
          chmod +x dockerscan

      - name: Update CVE Database
        run: ./dockerscan update-db

      - name: Run Security Scan
        run: ./dockerscan -q myapp:${{ github.sha }}

      - name: Upload SARIF results
        uses: github/codeql-action/upload-sarif@v2
        with:
          sarif_file: dockerscan-report.sarif

GitLab CI:

docker-security-scan:
  stage: test
  script:
    - docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA .
    - wget https://github.com/cr0hn/dockerscan/releases/latest/download/dockerscan-linux-amd64 -O dockerscan
    - chmod +x dockerscan
    - ./dockerscan update-db
    - ./dockerscan -q $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
  artifacts:
    reports:
      sast: dockerscan-report.sarif

2. 安全审计

# Comprehensive audit of production images
for image in $(docker images --format "{{.Repository}}:{{.Tag}}"); do
  echo "Scanning $image..."
  dockerscan $image --output /audit-reports/
done

# Generate summary report
cat /audit-reports/*.json | jq -s '
  {
    total_images: length,
    total_findings: map(.summary.total_findings) | add,
    critical_findings: map(.summary.by_severity.CRITICAL // 0) | add
  }
'

3. 部署前验证

# Fail deployment if critical issues found
dockerscan production-app:v2.0
exit_code=$?

if [ $exit_code -eq 2 ]; then
  echo "❌ Critical vulnerabilities found. Deployment blocked."
  exit 1
elif [ $exit_code -eq 1 ]; then
  echo "⚠️  High severity issues found. Manual review required."
  # Send notification...
else
  echo "✅ No critical issues. Proceeding with deployment."
fi

4. 合规报告

# Generate CIS compliance report
dockerscan --scanners cis --only-critical all-production-images:* > cis-compliance-report.txt

# Weekly security scan for compliance
0 0 * * 0 /usr/local/bin/dockerscan --scanners cis,vulnerabilities production-images:latest --output /compliance/weekly/

5. 开发者工作流

# Pre-commit hook
#!/bin/bash
# .git/hooks/pre-commit

docker build -t local-test:latest .
dockerscan --only-critical local-test:latest

if [ $? -ne 0 ]; then
  echo "❌ Docker security scan failed. Fix issues before committing."
  exit 1
fi

与其他工具对比

功能 DockerScan v2.0 Trivy Clair Snyk Grype
CIS Benchmark v1.7 完整(80+ 项检查) 不支持 不支持 部分支持 不支持
供应链检测(2024) 支持 不支持 不支持 不支持 不支持
敏感信息扫描 40+ 种模式 基础 不支持 支持 不支持
CVE 数据库 2024-2025 年 CVE 支持 支持 支持 支持
运行时安全 完整支持 不支持 不支持 不支持 不支持
SARIF 输出 支持 支持 不支持 支持 支持
速度(Go) 极速 极速 较慢 快速 极速
可扩展性 插件系统 有限 有限 不支持 有限
退出码 适用于 CI/CD 支持 部分支持 支持 支持
成本 免费 免费 免费 付费版本 免费
离线模式 支持 支持 不支持 不支持 支持
许可证 专有源码可见 Apache-2.0 Apache-2.0 专有 Apache-2.0

为什么选择 DockerScan?

  • 最全面:唯一集 CIS + 供应链 + 敏感信息 + CVE + 运行时于一体的工具
  • 最新研究成果:基于 2024-2025 年真实攻击案例
  • 零配置:开箱即用
  • 开发者友好:美观的 CLI 输出,并给出可操作的修复建议
  • 企业级就绪:SARIF + 退出码 + JSON 输出

架构

项目结构

dockerscan/
├── logo.png                 # Project logo
├── cmd/
│   ├── dockerscan/          # Main CLI application
│   │   └── main.go
│   └── nvd2sqlite/          # CVE database builder tool
│       └── main.go
├── data/                    # CVE database (auto-updated daily)
│   ├── latest.db.gz         # Compressed SQLite database
│   └── metadata.json        # Database version info
├── internal/
│   ├── scanner/             # Extensible scanner framework
│   │   ├── scanner.go       # Scanner interface & registry
│   │   ├── cis/             # CIS Benchmark implementation
│   │   ├── secrets/         # Secrets detection
│   │   ├── supplychain/     # Supply chain attacks
│   │   ├── vulnerabilities/ # CVE scanning
│   │   └── runtime/         # Runtime security
│   ├── report/              # Report generators
│   │   ├── json.go          # JSON reporter
│   │   └── sarif.go         # SARIF reporter
│   ├── models/              # Data models
│   │   └── models.go        # Findings, scan results, etc.
│   └── config/              # Configuration
│       └── config.go        # App config & banner
└── pkg/docker/              # Docker client wrapper
    └── client.go

CVE Database & nvd2sqlite-cvelistV5 Tool

DockerScan 使用本地 SQLite 数据库进行 CVE 查询。该数据库通过 GitHub Actions 每日自动更新,并托管在仓库中,因此你始终可以访问最新的 CVE 数据。

该数据库基于 MITRE cvelistV5 数据集 构建(官方 CVE 列表,以每日快照形式发布在 GitHub 上)。与 NVD API 不同,该数据源没有速率限制,无需 API 密钥,也没有可用性问题:完整快照是一个约 525 MB 的 zip 文件,由 GitHub CDN 提供。

Database Features

  • Pre-built database - 开箱即用,无需手动配置
  • Daily updates - GitHub Action 每天于 06:47 UTC 基于 MITRE cvelistV5 午夜快照重建完整数据库
  • 30-month window - 约 125,000 个 CVE 和约 432,000 条受影响产品记录(schema_version 2)
  • Fast lookups - 使用经过优化的索引的 SQLite
  • Hosted on GitHub - 通过 update-db 命令自动下载

Updating the Database

# Download latest database from GitHub (recommended)
dockerscan update-db

# Install from local file (for air-gapped/offline environments)
dockerscan update-db --from-file /path/to/cve-db.sqlite

说明:首次运行 dockerscan 时,程序会提示下载数据库。之后,你可以使用 update-db 定期更新数据库。

手动构建数据库(nvd2sqlite-cvelistV5)

对于高级用户,可以直接从 MITRE 的 cvelistV5 快照构建 CVE 数据库:

# Build the tool
go build -o bin/nvd2sqlite-cvelistV5 ./cmd/nvd2sqlite-cvelistV5

# Download the latest snapshot and build the database (last 30 months by default)
./bin/nvd2sqlite-cvelistV5 --output data/cve-db.sqlite --verbose

# Optionally enrich CVSS scores from the NVD API (best-effort, non-blocking)
./bin/nvd2sqlite-cvelistV5 --output data/cve-db.sqlite --enrich-from-nvd

# Custom date range
./bin/nvd2sqlite-cvelistV5 --output data/cve-db.sqlite \
  --start-date 2023-01-01 \
  --end-date 2024-12-31

# From an already-downloaded snapshot zip (offline / air-gapped)
./bin/nvd2sqlite-cvelistV5 --output data/cve-db.sqlite \
  --input 2026-07-13_all_CVEs_at_midnight.zip.zip

nvd2sqlite-cvelistV5 功能特性:

  • 无需 API 密钥,无速率限制 - 从 GitHub 的 CDN 下载单个 zip 包
  • 并行解析 - 每个 CPU 核心一个 worker,几分钟内处理约 30 万条 CVE 记录
  • 版本范围规范化 - 将 CNA 的自由文本范围(>=1.0, <2.0、逗号分隔列表、v 前缀)转换为规范范围
  • 可选 CVSS 数据富集 - 通过 --enrich-from-nvd / --enrich-only / --enrich-timeout 进行尽力而为的 NVD 查询
  • SQLite 输出 - 带索引的表,便于快速查询

已弃用:先前的 cmd/nvd2sqlite 工具(NVD API 2.0 数据源)仅保留供参考,不再使用或维护。NVD API 的速率限制以及频繁的 503 错误/超时使每日自动化构建不可靠。

可扩展性

新增扫描器很简单:

package myscan

import (
    "context"
    "github.com/cr0hn/dockerscan/v2/internal/models"
    "github.com/cr0hn/dockerscan/v2/internal/scanner"
)

type MyScanner struct {
    scanner.BaseScanner
}

func NewMyScanner() *MyScanner {
    return &MyScanner{
        BaseScanner: scanner.NewBaseScanner(
            "my-scanner",
            "Description of my scanner",
            true, // enabled
        ),
    }
}

func (s *MyScanner) Scan(ctx context.Context, target models.ScanTarget) ([]models.Finding, error) {
    var findings []models.Finding

    // Your scanning logic here...

    return findings, nil
}

// Register in main.go:
// registry.Register(myscan.NewMyScanner())

参与贡献

欢迎贡献!DockerScan 采用可扩展设计。

如何参与贡献

  1. Fork 仓库
  2. 创建功能分支(git checkout -b feature/amazing-scanner)
  3. 添加你的扫描器至 internal/scanner/
  4. 编写测试(我们保持 90% 以上的代码覆盖率)
  5. 提交你的更改(git commit -am 'Add amazing scanner')
  6. 推送到该分支(git push origin feature/amazing-scanner)
  7. 发起 Pull Request

开发

# Clone and setup
git clone https://github.com/cr0hn/dockerscan
cd dockerscan/dockerscan-v2

# Install dependencies
make deps

# Run tests
make test

# Run with coverage
make coverage

# Build
make build

# Format code
make fmt

# Lint
make lint

添加新的扫描器

我们特别欢迎:

  • 与漏洞数据库集成(NVD、GitHub Security Advisories)
  • Kubernetes 安全扫描
  • 容器镜像仓库安全
  • Docker Compose 安全分析
  • IaC 扫描(Dockerfiles)

参考资料

标准与基准

研究与 CVE

工具与项目


许可证

本项目采用 DockerScan 专有源码可用许可证。

具体含义

您可以(免费):

  • 免费将 DockerScan 用于内部安全扫描
  • 在您的 CI/CD 流水线 和安全工作流中使用它
  • 修改、fork 并回馈社区
  • 将其用于教育和研究目的
  • 将其作为专业服务中的工具(咨询、安全审计、渗透测试)使用
  • 将其集成到其他产品中,作为辅助组件

您不可(除非获得明确书面许可或商业许可):

  • 将Docker 扫描作为商业 SaaS提供服务
  • 出售 DockerScan 的托管实例
  • 构建主要基于 DockerScan 的商业平台
  • 创建以 DockerScan 为主要产品的付费托管服务

为什么采用此许可证?

此许可证通过以下方式保护项目的可持续性:

  • 授予自由,以便为合法目的使用本软件
  • 防止有害的搭便车行为,即企业将其作为服务对外提供并从中获利,却不回馈项目
  • 通过对竞争性用途实施商业许可,确保项目保持可持续发展
  • 保持源代码可获取,以保障透明度并支持社区贡献

这并非开源——它是源码可见,并对商业竞争性使用设有限制。

商业许可

以下情形需要商业许可:

  • SaaS 或托管服务
  • 以 DockerScan 作为主要功能的商业平台
  • 作为商业产品进行转售或再分发
  • 以 DockerScan 为核心服务的托管服务

商业许可联系方式:

邮箱:daniel [at] danielalfocea.com 网站:https://danielalfocea.com 企业和初创公司均可获得灵活的许可条款

完整法律条款请参见 LICENSE 文件。

作者

Daniel Alfocea (cr0hn)

网站 GitHub LinkedIn Twitter

安全研究员 | 开源开发者 | Docker 安全专家

致谢

特别感谢:

  • Docker 安全社区
  • CIS 的 Docker Benchmark
  • NIST 的 SP 800-190
  • 发现 2024 年供应链攻击的安全研究人员
  • DockerScan 的所有贡献者和用户

支持


如果您觉得 DockerScan 有用,请为仓库添加星标!

让 Docker 安全触手可及

返回顶部

项目介绍

Docker 安全分析及黑客工具探究【此简介由AI生成】

定制我的领域
581.72 K246访问 GitHub