如何轻松检查 Docker 容器安全
最近,安全研究人员在 Docker Hub 上发现了超过四百万个空的占位符容器和数十万个隐藏着加密货币矿工程序的镜像。我们已经习惯了用一条 docker pull 命令拉取基础镜像或第三方依赖,却很少考虑层内可能隐藏着什么——不仅仅是存在漏洞的包,还可能是嵌入的访问令牌(用于访问他人基础设施)或沙箱逃逸脚本。
在镜像扫描方面,人们通常会使用 Trivy、Grype 或 Clair。这些工具在检测系统包中的已知 CVE 方面表现出色,但往往会遗漏一些细微的问题,比如运行时配置不当、API 密钥泄露,以及针对供应链的新攻击向量。
西班牙安全研究员 Daniel Garcia(cr0hn)开发的 dockerscan 项目通过全面审计解决了这一问题。该工具的第一个版本于 2017 年用 Python 编写,运行速度较慢,但在第二个版本中,作者完全用 Go 重写了引擎,速度提高了十倍,并将漏洞扫描、密钥检测和配置审计整合到单个二进制文件中。
新版 DockerScan 的核心功能
dockerscan 无需按顺序运行三个不同的工具来检查镜像,而是同时对多个领域进行全面诊断。
该工具结合了五个分析模块:
- CIS Docker Benchmark v1.7.0。检查超过 80 项安全参数,包括以 root 身份运行、不必要的开放端口、缺失 HEALTHCHECK 指令以及正确的系统文件权限。
- 供应链攻击检测器。查找近年来流行攻击活动的痕迹:隐藏的挖矿程序(如 xmrig)、系统库中的后门(继 xz-utils 事件之后)、钓鱼文本,以及没有真实层的容器。
- 嵌入式密钥检测。识别超过 40 种密钥和令牌格式(AWS、GCP、OpenAI、Stripe、私有 SSH 密钥、数据库连接字符串)。未知令牌通过香农熵计算捕获,阈值高于 4.5。
- CVE 漏洞数据库。追踪危险的容器逃逸漏洞(runc 中的 CVE-2024-21626)、BuildKit 问题以及过时的基础镜像。数据库来自官方 MITRE cvelistV5 快照,因此该工具不会触及 NVD API 限制。
- 运行时安全审计。检查危险的 Linux 能力(例如 CAP_SYS_ADMIN)、Seccomp 和 AppArmor 配置文件,以及命名空间隔离标志。
在 2.1.0 版本中,作者修复了之前 v2.0.x 版本中的一个重要 bug,该 bug 导致包漏洞扫描静默返回零结果。现在包版本匹配遵循 dpkg 规则,并考虑发行版后向移植。
快速入门和运行检查
该工具以 Linux、macOS 和 Windows 的即用型二进制文件形式分发。无需拉取任何依赖。
在 Linux amd64 上安装只需三行命令:
curl -sSfL https://raw.githubusercontent.com/cr0hn/dockerscan/master/install.sh | sh -s -- -b /usr/local/bin
首次运行前,下载本地 CVE 数据库:
dockerscan db download
该数据库通过 GitHub Actions 每日更新,压缩后约 30 MB。之后,你可以将扫描器指向任何本地或远程镜像:
dockerscan image scan ubuntu:latest
如果你只对特定检查感兴趣,例如密钥检测和 CIS Benchmark 合规性,你可以使用 -m 标志限制模块:
dockerscan image scan -m secret, cis myapp:latest
对于自动化脚本,静默模式 -q 和严重性过滤非常有用:
dockerscan image scan -q --severity high,critical ubuntu:latest
使用私有镜像仓库
许多扫描器的一个常见问题是与私有仓库的身份验证不便。Dockerscan 支持所有常见场景:Docker Hub、GHCR、AWS ECR、Google Artifact Registry、Azure ACR 和 GitLab。
如果你已经通过 docker login 进行了身份验证,该工具会自动从 ~/.docker/config.json 拉取令牌。它还支持系统凭据助手(macOS 上的 osxkeychain、Windows 上的 wincred 以及 Linux 上的 pass)。
对于 CI/CD 流水线,通过环境变量传递凭据更方便:
DOCKER_USERNAME=user DOCKER_PASSWORD=pass dockerscan image scan private-repo:tag
该工具返回清晰的退出码:0 表示报告干净,1 表示发现高级别问题,2 表示检测到严重漏洞。这允许在发现危险漏洞时立即停止流水线构建。
集成到 CI/CD 和报告
Dockerscan 结果以 JSON 和 SARIF 格式保存。SARIF 格式被 GitHub Security、GitLab 和 Azure DevOps 原生支持,因此发现的问题会立即显示在拉取请求界面中。
GitHub Actions 示例步骤:
- name: Scan image
uses: cr0hn/dockerscan-action@main
with:
image: ${{ env.IMAGE_TAG }}
format: sarif
output: results.sarif
- name: Upload results
uses: github/codeql-action/upload-sarif@v2
with:
sarif_file: results.sarif
许可证和限制
该项目的许可证值得特别关注。作者选择了源码可用模式。源代码完全开放,该工具可免费用于公司内部需求、嵌入个人 CI/CD 流水线以及用于审计和渗透测试。只有一件事是被禁止的:未经作者许可,将 dockerscan 打包成商业 SaaS 并作为付费云扫描服务出售。
是否值得迁移到 DockerScan
如果你需要快速的镜像静态分析,同时结合容器权限检查和泄露令牌检测,dockerscan 用一条命令就能覆盖所有这些任务。该工具消耗约 50-100 MB 内存,运行速度明显快于旧的 Python 解决方案。
该工具非常适合 DevOps 工程师和安全专家进行定期的生产镜像审计,以及在部署流水线中添加严格检查。最佳入门方式是针对几个你自己的工作容器运行它,看看隐藏的 CIS Benchmark 警告的真实数量。
相关项目