w1ck3ds0d4/SecureCheck
GitHub: w1ck3ds0d4/SecureCheck
一款可重用的 GitHub Actions 安全质量扫描流水线,集成多种扫描器与 linter,通过 Discord 统一推送按严重程度着色的摘要报告。
Stars: 0 | Forks: 0
# SecureCheck
可重用的 GitHub Actions 工作流,在每次 push 和 pull request 时运行多扫描器安全流水线,并向 Discord 发送单一的、按严重程度着色的摘要。
## 功能
- **集中式扫描器堆栈** - 扫描器和规则位于同一个仓库中;每个使用者仓库只需包含一个轻量级的调用器,因此无需修改每个项目即可传播更新
- **Gitleaks** - 在每次 push 和 PR 时,检查工作区和提交历史中的硬编码 secrets
- **Semgrep** - 使用精选的 `auto` 规则集进行基于模式的 SAST
- **Trivy** - 依赖项 CVE、IaC / 配置错误,**外加许可证发现**(漏洞 / 配置错误 / 许可证计数分开显示)
- **按语言划分的质量 linter(自动检测)** - ESLint (JS/TS,当存在 eslint 配置时)、ruff lint + format check (Python)、`cargo fmt --check` + `cargo clippy -D warnings` (Rust)、`dotnet format --verify-no-changes` (.NET)。当不存在该语言时静默跳过
- **复杂度热点** - `lizard` 标记圈复杂度 >= 15 的函数
- **重复检测** - `jscpd` 报告整个仓库中重复的代码块
- **性能指标** - 每个扫描器阶段都会计时;嵌入消息会显示总扫描时间以及最慢的 3 个阶段
- **可选的 Claude 审查** - Claude Sonnet 会审查 PR diff,以发现扫描器遗漏的逻辑问题;受 `ANTHROPIC_API_KEY` 控制,当未设置该 secret 时静默跳过
- **每次运行生成单个 Discord 嵌入消息** - 按严重程度着色,包含按扫描器 + 按 linter + 指标 + 性能划分的部分,以及指向工作流运行和 pull request 的直接链接
- **Pull-request 心跳** - 每次 PR 运行(包括干净的运行)都会发布一条嵌入消息,以便审查者确认机器人已执行
- **干净的推送时静默** - 绿色的 `main` 提交不会产生 Discord 噪音
- **归档的原始报告** - 每次运行都会将各扫描器的 JSON(安全 + 质量 + 指标)作为工作流 artifact 上传,保留期为 14 天
## 安装说明
### 前置条件
- 一个你想要扫描的 GitHub 仓库,并且已启用 Actions
- 一个带有 **incoming webhook** 的 Discord 频道(频道设置 -> Integrations -> Webhooks -> New Webhook -> Copy Webhook URL)
- *可选:* 如果你想让 Claude 审查步骤在 pull request 上运行,需要提供一个 Anthropic API key
### 添加调用工作流
在使用者仓库中创建 `.github/workflows/security.yml`:
```
name: Security Scan
on:
push:
branches: [main]
pull_request:
permissions:
contents: read
jobs:
scan:
uses: w1ck3ds0d4/SecureCheck/.github/workflows/scan.yml@v1
secrets:
DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }}
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} # optional
```
固定 `@v1` 以使用稳定版本(或固定 `@main` 以获取最新版本)。工作流会在**你固定的同一个 ref** 下检出其自身的脚本,因此固定的调用器是完全可复现的。显式映射这两个 secret(而不是使用 `secrets: inherit`)遵循了最小权限原则——只会传递这两个 secret;两者都是可选的。
### 输入与 secrets
| 输入 | 默认值 | 含义 |
| --- | --- | --- |
| `node_version` | `20` | 用于 ESLint / jscpd 的 Node 版本 |
| `python_version` | `3.11` | 用于 ruff 的 Python 版本 |
| `dotnet_version` | `10.0.x` | 用于 `dotnet format` 的 .NET SDK |
| `style_check` | `false` | 启用内部风格门控(引入破折号时会失败);默认关闭 |
| Secret | 是否必需 | 用于 |
| --- | --- | --- |
| `DISCORD_WEBHOOK_URL` | 否 | 发送运行摘要的嵌入消息;省略以跳过 Discord 发送 |
| `ANTHROPIC_API_KEY` | 否 | 可选的 Claude PR 审查;省略以跳过该步骤 |
### 配置 secrets
在使用者仓库上设置 webhook secret:
```
gh secret set DISCORD_WEBHOOK_URL --repo /
```
### 启用可选的 Claude 审查
将 Anthropic key 添加到使用者仓库的 secrets 中。工作流会在运行时检测该 secret,如果不存在则跳过此步骤,因此无需更改其他任何内容。
```
gh secret set ANTHROPIC_API_KEY --repo /
```
## 使用说明
### 推送到 `main`
扫描运行,统计发现的结果,除非至少有一个扫描器报告了问题,否则 Discord 通知器会保持静默。如果有任何告警,将发布一条包含各扫描器计数和工作流运行链接的嵌入消息。
### Pull request
相同的扫描流水线运行,并且总是会发布嵌入消息(干净时为绿色,否则按严重程度着色),以便审查者在批准前有明确的信号。可选的 Claude 审查仅在 pull request 上运行;推送时会跳过它以节省 API 调用。
### 严重程度颜色
| 状态 | 颜色 |
|---|---|
| 所有扫描器均干净 | 绿色 |
| 有发现,但没有命中 gitleaks | 黄色 |
| 大量发现(总数 >10) | 橙色 |
| 命中 gitleaks | 红色 |
### Claude 审查发现
当可选的 Claude 步骤运行并报告了严重或高危问题时,前五项将直接内嵌在 Discord 嵌入消息中,包含文件、行号以及关于漏洞利用路径的一句话解释。较低严重程度的发现只会出现在运行 artifact 中。
### 原始报告
每次运行都会上传一个 `security-reports` artifact,其中包含来自每个扫描器(gitleaks、semgrep、trivy、claude)的原始 JSON,保留期为 14 天。当嵌入消息计数不为零并且你想在不重新本地运行的情况下了解全貌时,这非常有用。
### 覆盖默认值
可重用工作流接受三个可选输入:
```
jobs:
scan:
uses: w1ck3ds0d4/SecureCheck/.github/workflows/scan.yml@v1
secrets:
DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }}
with:
node_version: '22'
python_version: '3.12'
dotnet_version: '10.0.x'
```
## 项目结构
```
SecureCheck/
.github/
workflows/
scan.yml Reusable workflow; checkout, scanners, notify, upload
scripts/
embed.mjs Pure embed-building logic (counts, colour, fields) - unit-tested
embed.test.mjs node --test suite for embed.mjs
notify.mjs Thin entry point: reads env + Claude file, builds via embed.mjs, POSTs
claude-review.mjs Sends the PR diff to Claude and emits structured findings
package.json @anthropic-ai/sdk dependency for the optional Claude step
LICENSE AGPL v3
COMMERCIAL.md Commercial license terms
```
## 测试
构建嵌入消息的逻辑(`scripts/embed.mjs`)是纯粹的并经过了单元测试——无需网络,无需实际的工作流运行:
```
npm test # node --test over scripts/**/*.test.mjs
```
CI 会在每次 push 和 pull request 时运行相同的套件(`.github/workflows/ci.yml`)。
## 许可证
本项目采用双重许可:
- [AGPL v3](LICENSE) - 免费用于开源。衍生作品和 SaaS 部署必须在 AGPL 下发布其源代码。
- [商业许可证](COMMERCIAL.md) - 用于专有 / 闭源用途,或不想遵守 AGPL 源代码披露要求的托管服务。联系以获取条款。
标签:DevSecOps, GitHub Actions, MITM代理, 上游代理, 开源框架, 弱口令爆破, 持续集成, 自动笔记, 自定义脚本, 逆向工具, 错误基检测, 静态代码分析