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

The Most Comprehensive Docker Security Scanner

Branch2Tags5
FilesLast commitLast update
1 month ago
9 years ago
1 month ago
20 hours ago
1 month ago
1 month ago
1 month ago
7 months ago
9 months ago
1 month ago
9 months ago
9 months ago
9 months ago
1 month ago
9 months ago
2 months ago
2 months ago
1 month ago
DockerScan Logo

DockerScan

The Most Comprehensive Docker Security Scanner

License Go Version Version CI/CD Test Coverage Go Report Card Downloads

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

功能特性安装指南快速入门文档说明使用场景更新内容贡献指南

目录

Warning

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

概述

DockerScan v2 是新一代 Docker 容器与镜像安全扫描工具,采用 Go 语言完全重写。它融合了多种安全扫描技术,这些技术基于 2024-2025 年的最新研究成果、行业标准(CIS 基准、NIST SP 800-190)以及在生产环境中发现的真实攻击模式。

为何选择 DockerScan v2?

  • 全面覆盖:集成 5 种以上安全扫描技术于一体
  • 前沿研究:基于 2024-2025 年供应链攻击与 CVE 漏洞
  • 生产可用:提供 SARIF 输出用于 CI/CD,支持退出码实现自动化
  • 极速性能:采用 Go 语言编写,支持并发扫描
  • 高度可扩展:插件架构支持自定义扫描器
  • 源码开放:供内部、教育、研究及非竞争商业用途免费使用(详见许可协议

功能特性

安全扫描模块

1. CIS Docker 基准 v1.7.0

全面的合规性检查,包含 80 多项自动化控制:

  • 主机配置安全(13 项检查)
  • Docker 守护进程强化(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 令牌
  • AI/ML API:OpenAI、Anthropic、Hugging Face 密钥
  • 支付服务:Stripe、PayPal、Square 密钥
  • 通信服务:Slack、SendGrid、Twilio、Mailchimp
  • 身份验证:JWT 令牌、OAuth 令牌
  • 加密货币:私钥(RSA、SSH、PGP、EC、DSA)、证书
  • 数据库:PostgreSQL、MySQL、MongoDB 连接字符串
  • Docker:仓库身份验证令牌
  • 熵值分析:通过香农熵计算检测未知密钥(阈值 >4.5)

4. CVE 与漏洞扫描

关键 2024-2025 年 CVE 漏洞检测:

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

5. 运行时安全分析

容器运行时强化检查:

  • Linux 能力审计 - 检测危险能力(CAP_SYS_ADMIN、CAP_NET_ADMIN 等)
  • Seccomp 配置文件验证 - 确保系统调用过滤已启用
  • AppArmor/SELinux 检查 - 强制访问控制验证
  • 特权容器检测 - 识别具有主机完全访问权限的容器
  • 命名空间隔离 - PID、IPC、网络、用户命名空间检查
  • 容器逃逸指标 - 检测常见逃逸技术

报告与集成

  • JSON - 适用于自动化的机器可读输出
  • SARIF - 原生集成于:
    • GitHub 安全选项卡
    • Azure DevOps
    • VS Code 扩展
    • GitLab 安全仪表板
  • 美观的命令行界面 - 带有表情符号的彩色编码严重级别
  • 退出代码 - 适合 CI/CD(0=无问题,1=警告,2=严重)

性能

  • 比 Python 替代方案快 10 倍
  • 借助 Go 协程实现并发扫描
  • 低内存占用(约 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_basisdistro_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. 性能 - Go 语言借助 goroutine 实现 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(英特尔)

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 Garcia (cr0hn)                                                   ║
║   Website:    https://cr0hn.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 登录过的 registry。

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

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

使用 Docker Desktop 的 macOS 上,无需额外配置即可直接使用:

{
  "credsStore": "osxkeychain"
}

DockerScan 会自动调用 docker-credential-osxkeychain 来获取令牌,因此您无需显式传递凭据。

方法 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 弹性容器注册表 (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

谷歌容器镜像仓库(GCR)/制品仓库

# 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 容器注册表 (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. “需要身份验证”错误

# 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 的速率限制

  • 进行身份验证以提高速率限制(免费账户为 200 次拉取/6 小时)
  • 考虑使用 Docker Hub Pro 账户以获得更高的限制

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

  • 将 CA 证书添加到系统信任存储中
  • 或配置 Docker 信任该 registry(请参阅 Docker 文档)

安全扫描器

CIS Docker Benchmark

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

dockerscan --scanners cis nginx:latest

检查内容包括:

  • 容器用户非 root
  • 未安装不必要的软件包
  • 存在 HEALTHCHECK 指令
  • 使用特定版本标签(非 :latest
  • 最小化暴露端口
  • 非特权容器
  • Linux capabilities 已受限
  • 已应用 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 仓库认证信息
  • 高熵字符串(潜在的未知密钥)

漏洞扫描

检测已知 CVE:

dockerscan --scanners vulnerabilities node:16

检查内容:

  • 严重 Docker CVE(2024-2025)
  • 容器逃逸漏洞
  • BuildKit 远程代码执行漏洞
  • 生命周期结束的基础镜像
  • 易受攻击的软件包

运行时安全

审计运行时配置:

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 持续集成:

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 基准 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 数据库与 nvd2sqlite-cvelistV5 工具

DockerScan 使用本地 SQLite 数据库进行 CVE 查询。该数据库通过 GitHub Actions 每日自动更新 并托管在代码仓库中,因此您始终能获取最新的 CVE 数据。

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

数据库特性

  • 预构建数据库 - 即开即用,无需手动配置
  • 每日更新 - GitHub Action 每天 UTC 时间 06:47 从 MITRE cvelistV5 午夜快照重建完整数据库
  • 30 个月时间窗口 - 约 125,000 条 CVE 和 432,000 条受影响产品记录(schema_version 2)
  • 快速查询 - 具有优化索引的 SQLite
  • 托管于 GitHub - 通过 update-db 命令自动下载

更新数据库

# 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 核心一个工作进程,几分钟内处理约 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 流水线 和安全工作流中使用
  • 修改、分叉并向社区贡献代码
  • 将其用于教育和研究目的
  • 作为专业服务(咨询、安全审计、渗透测试)中的工具使用
  • 将其集成到其他产品中作为辅助组件

您不可以(未经明确书面许可或商业授权):

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

为何选择此许可协议?

本许可协议通过以下方式保障项目的可持续性:

  • 赋予自由:允许将本软件用于合法目的
  • 防止恶意搭便车:避免企业将其作为服务提供以牟利却不回馈贡献
  • 确保可持续性:通过商业许可协议规范竞争性使用,保障项目存续
  • 保持源代码开放:为透明化和社区贡献提供可能

本软件并非开源软件——它是源代码可获取的,但对商业竞争性使用设有限制。

商业许可

适用场景

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

商业许可咨询方式

邮箱:cr0hn [at] cr0hn.com 网站:https://cr0hn.com 为企业和初创公司提供灵活的许可条款

完整法律条款详见 LICENSE 文件。

作者

Daniel Garcia (cr0hn)

Website GitHub LinkedIn Twitter

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

致谢

特别感谢:

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

支持


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

让 Docker 安全触手可及

返回顶部

Introduction

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

Customize your domain
581.72 K248Visit GitHub