isaaaac-2/site-security-pipeline
GitHub: isaaaac-2/site-security-pipeline
将 Semgrep、Snyk 和 OWASP ZAP 三层安全扫描集成到 GitHub Actions 中,为小型网站提供从代码到部署的自动化安全门禁与漏洞追踪。
Stars: 1 | Forks: 0
# 站点安全 Pipeline
一个分层安全扫描 Pipeline,可在代码、依赖项和实时部署到达生产环境之前,捕获其中的漏洞。它不仅仅是一个扫描器,还是一个 CI/CD 门禁,可以阻止不安全的推送,并将发现的问题转化为可跟踪的修复任务。
## 我在解决什么问题?
大多数作品集网站和小型项目在发布时没有任何自动化安全检查。漏洞在代码、依赖项和部署配置中悄无声息地积累,直到有人手动审计它们(如果有的话)。
## 为什么这很重要?
只有将安全扫描集成到开发人员已经在使用的工作流中,它才能发挥作用。独立的扫描器会被忽视;而一个能够阻止错误推送并自动创建 issue 的 Pipeline 门禁则会得到执行。
## 扫描内容
- 每次推送时使用 Semgrep 进行静态代码分析(p/security-audit 规则集)
- 使用 OWASP ZAP 对实时 Vercel 部署进行动态测试
- 使用 Snyk 进行依赖项漏洞扫描,以检测已知的 CVE
- 安全标头验证(CSP、X-Frame-Options、X-Content-Type-Options、Permissions-Policy)
- 集中式的手动扫描器(workflow_dispatch),用于跨仓库健康检查
## 技术栈
- Semgrep (SAST)
- OWASP ZAP (DAST)
- Snyk (SCA)
- GitHub Actions(CI/CD 编排)
- Vercel(部署目标)
## 工作原理
1. 推送到 main 分支会触发 Semgrep 静态分析和 Snyk 依赖项扫描
2. 自门禁工作流在检测到高危发现时会阻止推送
3. ZAP 针对实时的 Vercel 部署运行基线 DAST 扫描
4. ZAP 的发现会自动创建 GitHub issue,以便进行可跟踪的修复
5. 集中式扫描器(workflow_dispatch)可手动触发,以进行跨仓库检查
6. 验证 vercel.json 中的安全标头,并根据 ZAP 的发现进行更新
## 架构
```
Push to main
│
▼
┌─────────────────────────────┐
│ GitHub Actions │
├─────────────────────────────┤
│ • Semgrep (SAST) │
│ • Snyk (SCA) │
│ Self-gating security scan │
└──────────────┬──────────────┘
│
Pass Security Checks
│
▼
┌─────────────────────────────┐
│ Deploy to Vercel │
└──────────────┬──────────────┘
│
▼
┌─────────────────────────────┐
│ OWASP ZAP (DAST) │
│ Baseline scan vs live site │
└──────────────┬──────────────┘
│
Findings Detected
│
▼
┌─────────────────────────────┐
│ Auto-create GitHub Issues │
│ Trackable remediation │
└─────────────────────────────┘
```
## 已知的权衡
- CSP unsafe-inline:Vite 开发服务器和生产构建中的内联样式需要此项。通过严格的 frame-ancestors 和 script-src 指令进行缓解。完整的基于 nonce 的 CSP 将需要构建时注入。
- ZAP 误报:Sec-Fetch 标头和某些 cookie 标志会触发不适用于静态站点的警告。我们对此进行了记录并予以接受,而不是全局抑制它们。
- Snyk token 管理:CI/CD 使用 GitHub Secrets。本地开发需要手动导出 token。目前还没有自动的密钥轮换。
- DAST 范围:ZAP 基线扫描仅覆盖面向公众的页面。经过身份验证的路由和 API endpoint 需要单独的 spider 配置。
标签:DevSecOps, 上游代理, 动态应用安全测试, 安全扫描, 时序注入, 错误基检测, 静态代码分析