## 新增功能 ### 1. 屏幕阅读器兼容性增强(a11y) - 无障碍工具库:src/shared/lib/a11y.ts - aria-live Hook:src/shared/hooks/use-aria-live.ts - a11y 组件:skip-link/visually-hidden/focus-trap/aria-status - 增强 UI:table.tsx 系统性 ARIA role,dialog.tsx aria-modal - 审计文档:docs/accessibility/a11y-audit.md(WCAG 2.1 AA 清单) ### 2. 视觉回归测试 - 测试套件:tests/visual/(homepage + 3 个 dashboard) - 3 视口(desktop/tablet/mobile)× 2 主题(light/dark) - 动态元素遮罩,避免误报 - playwright.config.ts 新增 visual-chromium 项目 - 文档:docs/testing/visual-regression.md ### 3. 短信/微信推送渠道集成 - 新模块:src/modules/notifications/ - 4 个渠道:SMS(阿里云/腾讯云)、WeChat(公众号)、Email(SMTP)、In-App - 分发器按用户偏好并行多渠道发送 - 外部 SDK 动态 import,Mock 模式开发可用 - 文档:docs/notifications/channels.md ### 4. 漏洞扫描 CI 集成 - CI security-scan job:npm audit + Snyk + Trivy FS + OWASP ZAP - 独立工作流 security.yml:每周一深度扫描 + 容器镜像扫描 - 配置:suppressions.json + .trivyignore - 本地脚本:security-scan.sh/ps1 - 文档:docs/security/scanning.md(SLA 分级) ### 5. 灾备方案 - 脚本:backup-verify/backup-offsite-sync/dr-drill/failover/health-check - CI 增强:备份后校验+异地同步,每周灾备演练 - 独立工作流 dr-drill.yml:每周一凌晨 4 点自动演练 - 文档:docs/dr/dr-plan.md(RTO 4h/RPO 24h)+ dr-runbook.md(6 故障场景) ## 验证 - npx tsc --noEmit:0 错误 - npm run lint:0 错误 0 警告
6.2 KiB
6.2 KiB
安全扫描指南
本项目集成了多层安全扫描,覆盖依赖审计、深度依赖分析、静态分析、容器镜像扫描与动态应用安全测试(DAST)。
一、CI 中的安全扫描流程
1.1 主 CI 流水线(.gitea/workflows/ci.yml)
主流水线在 push/pull_request 到 main 时触发,包含三个 Job:
| Job | 触发条件 | 说明 |
|---|---|---|
build-deploy |
push/PR to main | 构建、测试、部署到 Docker |
security-scan |
push/PR to main(依赖 build-deploy) | 完整安全扫描,失败不阻塞构建 |
scheduled-backup |
schedule cron 0 2 * * * |
每天凌晨 2 点数据库备份 |
security-scan Job 依次执行以下扫描,所有步骤均设置 continue-on-error: true,扫描失败不阻塞构建,但会生成报告并上传为 artifact(security-reports):
- npm audit — 依赖漏洞审计(moderate 级别),生成
audit-report.json - Snyk 扫描 — 深度依赖分析(
--severity-threshold=high),生成snyk.sarif,需配置SNYK_TOKENsecret - Trivy 文件系统扫描 — 扫描项目代码与依赖,生成
trivy-fs-report.json与表格视图 - OWASP ZAP 基线扫描 — 对部署后的应用执行 DAST,目标为
NEXTAUTH_URLsecret 或http://localhost:8015
1.2 独立安全工作流(.gitea/workflows/security.yml)
独立工作流执行深度安全扫描,触发方式:
- 定时:每周一凌晨 3 点(
cron: "0 3 * * 1") - 手动:
workflow_dispatch,可指定target_url(DAST 目标)与skip_dast选项
执行内容:
| 步骤 | 工具 | 类型 | 输出 |
|---|---|---|---|
| 依赖扫描 | npm audit | 依赖 | audit-report.json |
| 深度依赖 + 静态分析 | Snyk(--severity-threshold=medium) |
依赖 + 代码 | snyk.sarif |
| 文件系统扫描 | Trivy fs | 代码 + 依赖 | trivy-fs-report.json |
| 容器镜像扫描 | Trivy image | 容器 | trivy-image-report.json |
| DAST | OWASP ZAP baseline | 动态 | 控制台报告 |
| 汇总报告 | shell + jq | 汇总 | security-summary.md |
所有报告上传为 artifact security-reports-full。
二、各扫描工具的作用
| 工具 | 作用 | 覆盖范围 |
|---|---|---|
| npm audit | Node.js 依赖漏洞审计,基于 npm advisory 数据库 | 直接与间接 npm 依赖 |
| Snyk | 深度依赖分析 + 代码静态分析,漏洞库更广,含许可证检查 | npm 依赖 + 源码 |
| Trivy(fs) | 文件系统扫描,检测依赖锁文件、IaC 配置、密钥泄露 | 项目代码、配置、密钥 |
| Trivy(image) | 容器镜像扫描,检测镜像层漏洞与配置问题 | 构建出的 Docker 镜像 |
| OWASP ZAP | 动态应用安全测试(DAST),模拟攻击发现运行时漏洞 | 运行中的 Web 应用 |
三、如何处理扫描发现的漏洞
3.1 处理流程
- 查看报告:从 CI artifact 下载
security-reports/security-reports-full - 分级评估:按漏洞等级确定处理优先级(见分级标准)
- 修复或缓解:
- 升级受影响依赖到修复版本
- 若无法立即升级,评估是否可接受并记录抑制项
- 对运行时漏洞,通过 WAF/配置/代码修复
- 验证:本地运行
npm run security:scan验证修复效果 - 记录:更新抑制配置文件,记录处理决策
3.2 抑制配置文件
对于经评估确认可接受的漏洞,通过以下文件抑制:
.gitea/suppressions.json— Snyk 漏洞抑制,每条需填写id、package、severity、reason、expires(到期时间)、owner.trivyignore— Trivy 忽略的 CVE 列表,每行一个 CVE ID,带注释说明原因
抑制项到期后必须重新评估。
suppressions.json中policy.reviewCadenceDays: 30要求每 30 天复审一次。
3.3 必需的 Secrets
| Secret | 用途 | 必需性 |
|---|---|---|
SNYK_TOKEN |
Snyk API 令牌 | 推荐(无则 Snyk 步骤跳过) |
NEXTAUTH_URL |
ZAP DAST 扫描目标 URL | 可选(默认 localhost:8015) |
四、本地扫描方法
4.1 npm 脚本
# 仅依赖审计
npm run security:audit
# 完整本地扫描(npm audit + Trivy fs)
npm run security:scan
4.2 直接运行脚本
Linux/macOS:
chmod +x scripts/security-scan.sh
./scripts/security-scan.sh
Windows PowerShell:
.\scripts\security-scan.ps1
4.3 退出码
| 退出码 | 含义 |
|---|---|
0 |
无高危(critical/high)漏洞 |
1 |
存在高危漏洞,需尽快处理 |
4.4 前置依赖
- Node.js + npm — 必需
- Trivy — 可选(未安装则跳过文件系统扫描),安装指南
- jq(仅 bash 脚本)— 可选(未安装则显示原始报告)
五、漏洞分级标准
| 等级 | 说明 | 示例 |
|---|---|---|
| Critical | 可被远程利用,导致 RCE、认证绕过、数据完全泄露 | 远程代码执行、SQL 注入 |
| High | 可导致权限提升、敏感数据泄露、服务中断 | XSS、认证缺陷、SSRF |
| Medium | 需特定条件触发,影响有限 | 信息泄露、CSRF |
| Low | 影响极小,通常为信息收集类 | 版本号泄露、低危 ReDoS |
六、修复 SLA(服务等级协议)
| 漏洞等级 | 修复时限 | 处理要求 |
|---|---|---|
| Critical | 24 小时 | 立即修复或下线受影响服务,发布紧急补丁 |
| High | 7 天 | 优先排期修复,升级依赖或应用补丁 |
| Medium | 30 天 | 纳入迭代计划修复 |
| Low | 90 天 | 评估后决定修复或抑制 |
超过 SLA 未处理的漏洞需升级至安全负责人,并在
suppressions.json中记录延期原因。
七、相关文件清单
| 文件 | 用途 |
|---|---|
.gitea/workflows/ci.yml |
主 CI 流水线(含 security-scan job) |
.gitea/workflows/security.yml |
独立深度安全扫描工作流 |
.gitea/suppressions.json |
Snyk 漏洞抑制配置 |
.trivyignore |
Trivy CVE 忽略列表 |
scripts/security-scan.sh |
本地扫描脚本(Linux/macOS) |
scripts/security-scan.ps1 |
本地扫描脚本(Windows) |
scripts/audit.sh |
依赖审计脚本(Linux/macOS) |
scripts/audit.ps1 |
依赖审计脚本(Windows) |