安全看板指南
CAST 可以从 SARIF 扫描结果生成静态 HTML 合规看板,并将其发布到 GitHub Pages——无需外部服务,无需 SaaS 账号。
看板展示内容
每个 SARIF 文件在看板中对应一行:
| 列 | 说明 |
|---|---|
| 项目 / 工具 | SARIF 文件名 + 生成该文件的工具 |
| 状态 | 🟢 通过 / 🔴 失败 / 🟡 警告 |
| 严重 | SARIF error 级别发现数量 |
| 高危 | SARIF warning 级别发现数量 |
| 中危 | SARIF note 级别发现数量 |
| 详情 | 可展开的单条发现列表 |
页头显示总计数量以及上次扫描运行的提交 SHA。
配置步骤
第一步 — 启用 GitHub Pages
在您的仓库中:Settings → Pages → Source: GitHub Actions
第二步 — 添加发布工作流
mkdir -p .github/workflows
curl -o .github/workflows/publish-dashboard.yml \
https://raw.githubusercontent.com/castops/cast/main/templates/github/publish-dashboard.yml
或从 CAST 仓库复制:
templates/github/publish-dashboard.yml → .github/workflows/publish-dashboard.yml
第三步 — 复制看板脚本
mkdir -p dashboard
curl -o dashboard/generate.py \
https://raw.githubusercontent.com/castops/cast/main/dashboard/generate.py
curl -o dashboard/template.html \
https://raw.githubusercontent.com/castops/cast/main/dashboard/template.html
第四步 — 提交并推送
git add .github/workflows/publish-dashboard.yml dashboard/
git commit -m "ci: add CAST security dashboard"
git push
看板将在每次 CAST DevSecOps 流水线运行完成后自动发布。
工作原理
CAST DevSecOps pipeline
├── sast job → uploads cast-sarif-sast artifact (semgrep.sarif)
└── container job → uploads cast-sarif-container artifact (trivy.sarif)
publish-dashboard workflow (triggered on workflow_run: completed)
├── downloads all cast-sarif-* artifacts
├── runs python dashboard/generate.py
└── deploys _site/index.html to GitHub Pages
workflow_run 触发器确保看板仅在完整流水线运行结束后发布,而非在每次推送时发布。
在本地生成看板
# Place your SARIF files in sarif-results/
mkdir -p sarif-results
cp path/to/semgrep.sarif sarif-results/
cp path/to/trivy.sarif sarif-results/
# Generate
python dashboard/generate.py
# Open
open dashboard/index.html
选项:
python dashboard/generate.py --help
--sarif-dir DIR Directory containing .sarif files (default: sarif-results)
--output FILE Output HTML path (default: dashboard/index.html)
--commit SHA Commit SHA to display in header
自定义看板
模板文件位于 dashboard/template.html,使用纯 HTML 和内联 CSS——无需构建步骤,无需 npm,无需 webpack。
若要自定义颜色,编辑 :root 中的 CSS 变量:
:root {
--green: #3fb950; /* PASS badge color */
--red: #f85149; /* FAIL badge color */
--yellow: #d29922; /* WARN badge color */
}
若要添加列(如扫描器版本),请扩展 generate.py 并在模板中添加对应的 <th>/<td>。
多仓库看板
若要将多个仓库的发现结果汇总到一个看板:
- 让每个仓库使用唯一前缀上传 SARIF 制品:
- uses: actions/upload-artifact@v4 with: name: cast-sarif-myrepo-sast path: semgrep.sarif - 在一个中心
dashboard仓库中,使用gh run download或 GitHub API 从所有仓库下载制品,然后运行generate.py。
此方式需要一个具有对每个仓库 actions:read 权限的 GitHub 令牌。