Janhouse/dtrack-docker-scanner
GitHub: Janhouse/dtrack-docker-scanner
自动扫描 Docker 运行中容器生成 SBOM 并上传至 Dependency-Track 进行漏洞分析的扫描工具。
Stars: 1 | Forks: 0
# 用于 Dependency-Track 的 Docker SBOM 扫描器
一个 Docker 容器扫描器,可自动为运行中的容器生成软件物料清单 (SBOMs),并将其上传至 [OWASP Dependency-Track](https://dependencytrack.org/) 以进行漏洞分析。
## 功能特性
- 启动时扫描所有正在运行的 Docker 容器
- 监听 Docker 事件,自动扫描新容器
- 使用 [Trivy](https://trivy.dev/) 生成 CycloneDX SBOMs
- 将带有适当标签的 SBOMs 上传至 Dependency-Track
- 按主机名将项目归类到父项目下
- 当容器版本变更时,克隆漏洞分析决策
- 当容器被移除时,自动清理过期的项目
- 当容器长时间停止时,将项目标记为非活跃状态
- 缓存最近扫描的镜像列表以避免重复扫描
- 通过 cron 表达式配置扫描计划
## 快速开始
### 使用 Docker Compose
1. 复制示例环境文件:
cp .env.example .env
2. 编辑 `.env` 并填入你的 Dependency-Track 凭证:
DTRACK_URL=https://dependency-track.example.com
DTRACK_API_KEY=your-api-key-here
3. 启动扫描器:
docker compose up -d
要使用自定义镜像,请设置 `SCANNER_IMAGE`:
SCANNER_IMAGE=my-registry/dtrack-docker-scanner:v1.0.0 docker compose up -d
### 使用 Docker Run
```
docker run -d \
--name dtrack-docker-scanner \
-v /var/run/docker.sock:/var/run/docker.sock:ro \
-e DTRACK_URL=https://dependency-track.example.com \
-e DTRACK_API_KEY=your-api-key \
ghcr.io/janhouse/dtrack-docker-scanner:latest
```
## 配置
所有配置均通过环境变量完成:
### 必需配置
| 变量 | 描述 |
|----------|-------------|
| `DTRACK_URL` | Dependency-Track API URL (例如 `https://dtrack.example.com`) |
| `DTRACK_API_KEY` | 具有创建/更新项目和上传 BOMs 权限的 API key |
### 可选配置
| 变量 | 默认值 | 描述 |
|----------|---------|-------------|
| `SCAN_INTERVAL` | `0 */6 * * *` | 用于计划扫描的 cron 表达式 |
| `SCAN_ON_START` | `true` | 在容器启动时运行全面扫描 |
| `EXCLUDE_IMAGES` | `` | 要跳过的镜像名称模式的逗号分隔列表 |
| `DTRACK_PARENT_PROJECT` | `` | 用于将所有已扫描容器归类其下的父项目名称 |
| `SCANNER_HOSTNAME` | `` | 用于标记项目的主机名 |
| `CLEANUP_STALE` | `true` | 移除不再运行的容器的项目 |
| `SCAN_CONCURRENCY` | `2` | 并发 SBOM 上传的数量 |
| `WATCH_DOCKER` | `true` | 监听 Docker 事件以获取新容器 |
| `CACHE_TTL_MINUTES` | `60` | 缓存已扫描镜像哈希值的时长(分钟) |
| `INACTIVE_AFTER_MINUTES` | `60` | 容器停止多长时间后将项目标记为非活跃(分钟) |
| `INITIAL_CLEANUP_DELAY_MINUTES` | `3` | 初始扫描后延迟清理的时间,以便其他容器启动(分钟) |
| `TZ` | `UTC` | 用于 cron 计划的时区 |
## 工作原理
### 容器扫描
1. 启动时,扫描器会列出所有正在运行的 Docker 容器
2. 对于每个容器,它会使用 Trivy 生成 CycloneDX SBOM
3. SBOM 会被上传至 Dependency-Track,并附带以下标签:
- 镜像基础名称
- `host:` - 标识容器运行所在的主机
- `docker-scanner` - 将其标记为由扫描器管理
- `compose:` - compose 项目名称(如果适用)
- `imageid:` - 用于去重的 Docker 镜像哈希值
### Docker 事件监听
当 `WATCH_DOCKER=true` 时,扫描器会监听 Docker 事件:
- **容器启动**:立即扫描新容器(如果最近未扫描过)
- **容器停止/死亡**:跟踪已停止的容器,并在配置的超时时间后将它们标记为非活跃状态
### 项目生命周期
- 新容器会在 Dependency-Track 中创建新项目
- 当容器镜像更新时,分析决策将从旧版本克隆
- 成功克隆后,旧版本将被删除
- 在配置的超时时间后,已停止的容器会被标记为非活跃状态(而非删除)
- 重新启动的容器会自动恢复为活跃状态
### 去重
扫描器通过以下方式避免冗余扫描:
1. 检查最近扫描的镜像哈希值的本地缓存
2. 查询 Dependency-Track 中具有匹配 `imageid:` 标签的现有项目
3. 仅扫描在任一缓存中都不存在的镜像
## 开发
### 前置条件
- [Bun](https://bun.sh/)
- Docker
### 设置
```
# 安装 dependencies
bun install
# 在开发模式下运行
bun run dev
# Type 检查
bun run typecheck
# Linting
bun run lint
bun run lint:fix
```
### 构建
```
# 构建 Docker image
docker build -t dtrack-docker-scanner .
# 或者使用 compose
docker compose build
```
## CI/CD 工作流
本项目包含用于自动构建和 SBOM 生成的 Gitea Actions 工作流。
### 构建器工作流 (`.gitea/workflows/build.yml`)
构建 Docker 镜像并将其推送到容器镜像仓库。
**输入参数:**
- `custom_tags` - 逗号分隔的版本标签(例如 `v1.0.0,v1.0`)
- `push_to_github` - 同时推送到 GitHub Container Registry
**必需的仓库变量:**
- `REGISTRY_URL` - 主容器镜像仓库 URL
- `REPOSITORY_IMAGE` - 完整的镜像引用地址(例如 `registry.example.com/org/image:latest`)
- `GHCR_IMAGE` - GitHub Container Registry 镜像(例如 `ghcr.io/org/image:latest`)
**必需的 Secrets:**
- `REGISTRY_USERNAME` - 主镜像仓库用户名
- `REGISTRY_ACCESS_TOKEN` - 主镜像仓库密码/token
- `GHCR_USERNAME` - GitHub 用户名
- `GHCR_TOKEN` - 具有 `write:packages` 权限范围的 GitHub personal access token
### SBOM 工作流 (`.gitea/workflows/sbom.yml`)
为已构建的容器生成 SBOM 并上传到 Dependency-Track。在成功构建后自动运行。
**输入参数:**
- `include_github` - 同时为 `github-latest` 版本上传 SBOM
- `custom_tags` - 逗号分隔的用于上传 SBOMs 的版本标签
**必需的 Secrets:**
- `ACTIONS_GITEA_TOKEN` - 用于在工作流之间下载 artifacts 的 token
- `DEPENDENCY_TRACK_URL` - Dependency-Track API URL
- `DEPENDENCY_TRACK_API_KEY` - Dependency-Track API key
- `DEPENDENCY_TRACK_PROJECT_NAME` - Dependency-Track 中的项目名称
### 检查工作流 (`.gitea/workflows/checks.yml`)
在 pull request 和 push 时运行 linting 和类型检查。
## Dependency-Track API 权限
API key 需要以下权限:
- `BOM_UPLOAD` - 上传 SBOMs
- `PROJECT_CREATION_UPLOAD` - 自动创建项目
- `VIEW_PORTFOLIO` - 列出和搜索项目
- `PORTFOLIO_MANAGEMENT` - 更新项目属性,删除项目
## 许可证
AGPL-3.0
标签:DevSecOps, Docker, GPT, SBOM, 上游代理, 安全合规, 安全防御评估, 漏洞管理, 版权保护, 硬件无关, 网络代理, 自动化攻击, 请求拦截