sbom-tool/gh-guard

GitHub: sbom-tool/gh-guard

专为 Rust 项目设计的 Claude Code 供应链安全加固插件,提供从审计到落地的交互式 CI/CD 硬化能力。

Stars: 3 | Forks: 2

# GH-Guard

GH-Guard: Without vs With — from manual YAML and unpinned actions to production-tested templates, SHA-pinned actions, Trusted Publishing, SLSA L3 provenance, and layered dependency defense

用于 Rust 项目的 [Claude Code](https://claude.com/claude-code) CI/CD 供应链加固插件。 GH-Guard 将经过生产环境验证的 CI/CD 安全配置打包为可复用的模板和引导式工作流。它帮助 Rust OSS 维护者获得高 [OpenSSF Scorecard](https://scorecard.dev) 评分,设置 [Trusted Publishing](https://blog.rust-lang.org/2023/11/09/crates-io-trusted-publishing.html),生成 [SLSA L3](https://slsa.dev) 来源证明,并配置全面的依赖审计。 ## 安装 添加到您的 Claude Code 设置 (`~/.claude/settings.json`): ``` { "plugins": [ "~/path/to/gh-guard" ] } ``` ## 快速开始 ``` # 审计项目的供应链安全态势 /audit # 交互式加固您的项目 /harden # 生成特定配置文件 /generate ci-workflow /generate publish-workflow /generate deny-toml # 检查过期的 SHA pins /check-updates # 验证生成的配置 /verify ``` ## 命令 ### `/audit` — 差距分析 扫描您的仓库并生成结构化的差距分析: - 检查预期文件(工作流、deny.toml、SECURITY.md 等) - 根据 OpenSSF Scorecard 检查项进行评分 - 对您当前的加固水平进行分级(Minimal / Standard / Hardened) - 识别 SHA 固定缺口、缺失的权限、Cargo.lock 问题 - 检测 workspace 项目并验证发布顺序 - 输出带有模板引用的优先建议 ### `/harden` — 交互式向导 引导您完成三个级别的加固: | 级别 | 组件 | |-------|-----------| | **Minimal** | CI workflow + cargo-deny + Dependabot + SECURITY.md | | **Standard** | + Trusted Publishing + CodeQL + Scorecard + release script | | **Hardened** | + SLSA L3 provenance + fuzz testing + osv-scanner | 检测您当前的加固水平并提供升级模式 —— 仅生成达到下一级别所需的增量文件。支持 workspace 项目,提供针对每个 crate 的 Trusted Publishing 指导。 ### `/check-updates` — SHA 固定检查器 检查已部署的工作流中是否有过时的 action SHA 和 CLI 工具版本: - 通过 GitHub API 将固定的 SHA 与最新标签进行比较 - 检测过时的 CLI 工具版本(cargo-audit、cargo-fuzz) - 通过当前版本与最新版本的对比显示过时内容 - 提供自动应用更新的选项 - 遵守 SLSA generator 例外情况(必须使用 `@tag`,而不是 SHA) ### `/verify` — 生成后验证 验证生成的配置在语法上是否正确、内部是否一致,以及是否可以部署: - YAML/TOML 语法验证 - SHA 固定完整性和版本注释存在性 - 跨文件一致性(MSRV、gate job、fuzz targets) - `cargo-deny check` dry run(如果已安装) - `release.sh --dry-run` 验证 ### `/generate ` — 文件生成器 使用自动检测到的项目值生成单个文件。在覆盖现有文件之前显示 unified diff。 | 目标 | 输出路径 | |--------|------------| | `ci-workflow` | `.github/workflows/ci.yml` | | `publish-workflow` | `.github/workflows/publish.yml` | | `codeql` | `.github/workflows/codeql.yml` | | `scorecard` | `.github/workflows/scorecard.yml` | | `fuzz` | `.github/workflows/fuzz.yml` | | `deny-toml` | `deny.toml` | | `rust-toolchain` | `rust-toolchain.toml` | | `dependabot` | `.github/dependabot.yml` | | `security-md` | `SECURITY.md` | | `release-script` | `scripts/release.sh` | | `osv-scanner` | `osv-scanner.toml` | ## 模板 使用 `{{PLACEHOLDER}}` 语法参数化的、经过生产环境验证的配置文件。值从 `Cargo.toml`、git remote 和 `cargo metadata` 自动检测: | 占位符 | 来源 | 示例 | |-------------|--------|---------| | `{{CRATE_NAME}}` | `Cargo.toml` name 字段 | `my-tool` | | `{{MSRV}}` | `rust-version` 或 `rust-toolchain.toml` | `1.82` | | `{{REPO_OWNER}}` | Git remote URL | `my-org` | | `{{REPO_NAME}}` | Git remote URL | `my-tool` | | `{{CONTACT_EMAIL}}` | `Cargo.toml` authors 字段 | `me@example.com` | | `{{FUZZ_TARGETS}}` | `fuzz/Cargo.toml` bin 条目 | `fuzz_parse,fuzz_decode` | | `{{WORKSPACE_CRATES}}` | `cargo metadata --no-deps` (可发布, 依赖顺序) | `core,parser,cli` | ### 模板中的安全加固 所有工作流模板都遵循以下安全实践: - **SHA 固定的 actions** 带有版本注释(例如,`# v4.2.2`) - **工作流级别的 `permissions: read-all`**,每个 job 作用域限定 - 所有 checkout 步骤上的 **`persist-credentials: false`** - **脚本注入预防** —— 用户控制的值通过环境变量传递,而不是内联的 `${{ }}` - **并发组** —— 防止同一 branch/PR 上的并行运行 - **固定的 CLI 工具版本** —— `cargo-audit` 固定到特定版本并使用 `--locked` - **`workflow_dispatch` 重新触发** —— publish workflow 支持针对失败发布的手动重新触发 ## 技能 技能是在相关时自动加载的深度知识文档。它们编码了来自生产环境 Rust CI/CD 的宝贵经验: | 技能 | 覆盖内容 | |-------|---------------| | **scorecard-checks** | 所有 18 项 OpenSSF Scorecard 检查,包含 Rust 特定的实施指导和评分策略 | | **trusted-publishing** | OIDC 威胁模型、前置条件、crates.io 分步设置、故障排除 | | **slsa-provenance** | 三 job publish/provenance/release 流水线、hash 生成、验证、常见陷阱 | | **ci-pipeline** | Gate 模式、多 job 设计、缓存、SHA 固定、权限模型 | | **release-automation** | 基于 PR 的发布流程、签名标签、CI 轮询竞态条件、分支保护兼容性 | | **dependency-policy** | cargo-deny 配置、Dependabot 设置、osv-scanner 分层防御 | | **fuzz-testing** | cargo-fuzz 设置、`Arbitrary` vs raw bytes、corpus 管理、CI 集成、覆盖率分析 | | **migration-guide** | 级别检测算法、升级路径(Minimal 到 Standard 到 Hardened)、回滚程序 | | **workspace-publishing** | Multi-crate 发布顺序、per-crate Trusted Publishing、版本同步 | | **hardening-detection** | `/audit`、`/harden` 和 migration-guide 使用的共享级别检测算法 | | **cargo-vet** | 供应链审计 —— 对第三方 crate 的人工审查证明 | | **security-findings** | CodeQL、Scorecard、cargo-deny 和 Dependabot 发现的 SARIF 分类工作流 | | **binary-releases** | 通过 cargo-dist、cross 或手动 CI 矩阵进行跨平台二进制分发 | | **changelog** | 使用 git-cliff 和 conventional commits 自动生成 changelog | ## 加固目标 基于获得 OpenSSF Scorecard 7.5/10 的真实世界经验: - 所有 GitHub Actions SHA 固定并带有版本注释 - 工作流级别的 `permissions: read-all`,每个 job 作用域限定 - Trusted Publishing (OIDC) —— 无长期有效的 API token - SLSA L3 provenance 附加到 GitHub Releases - cargo-deny 用于 license、ban、advisory 和 source 检查 - Dependabot 用于 cargo + github-actions 更新 - CodeQL 与 Rust 原生分析 - 使用 cargo-fuzz 进行 Fuzz testing - 签名的 git tags (SSH ed25519 或 GPG) - SECURITY.md 包含协调披露策略 ## 架构 ``` gh-guard/ commands/ # User-invocable slash commands audit.md # /audit — gap analysis harden.md # /harden — interactive wizard generate.md # /generate — single file generator check-updates.md # /check-updates — SHA staleness checker verify.md # /verify — post-generation validation skills/ # Contextual knowledge (auto-loaded) binary-releases/ cargo-vet/ changelog/ ci-pipeline/ dependency-policy/ fuzz-testing/ hardening-detection/ migration-guide/ release-automation/ scorecard-checks/ security-findings/ slsa-provenance/ trusted-publishing/ workspace-publishing/ templates/ # Parameterized config files workflows/ ci.yml codeql.yml fuzz.yml publish.yml scorecard.yml deny.toml dependabot.yml osv-scanner.toml release.sh rust-toolchain.toml SECURITY.md VERSIONS.md # Pinned action version manifest (human-readable) versions.json # Pinned action version manifest (machine-readable) tests/ # Validation infrastructure validate-templates.sh fixtures/ examples/ # Sample output audit-output.md .gitignore CLAUDE.md # Plugin instructions LICENSE # MIT README.md SECURITY.md # Plugin security policy ``` ## 关键注意事项 来自生产环境使用的宝贵经验: 1. **SLSA generator 必须使用 `@tag` 而不是 SHA** —— 可复用工作流需要标签引用才能进行证明签名 2. **不可变发布** —— provenance 必须在 GitHub Release *之前*生成(之后无法上传资产) 3. **标签保护** —— 错误的标签 = 新版本号(标签无法删除或更新) 4. **`gh pr checks --watch` 竞态** —— 如果检查尚未开始则立即返回;先轮询检查是否存在 5. **需要 `fetch-depth: 0`** —— 验证标签祖先的 publish workflow 在浅克隆下会出错 6. **Trusted Publishing 在 crates.io 配置** —— 不在仓库中;访问 crates.io/crates/NAME/settings 7. **osv-scanner.toml 不会传播** —— 子目录需要它们自己的副本 8. **CodeQL 默认设置冲突** —— 在使用自定义 workflow 之前,在仓库 Settings > Code Security 中禁用 9. **cargo-audit 需要 `--locked`** —— 防止传递依赖升级导致的 MSRV 问题 10. **cargo-deny v0.19 破坏性更改** —— 移除了 `vulnerability` 键;对 unmaintained/unsound 使用 `"all"` 或 `"workspace"` 11. **Workspace 发布顺序** —— 相互依赖的 crate 必须按依赖顺序发布,并留有约 60s 的索传播延迟 12. **`workflow_dispatch` 重新触发** —— 使用 `gh workflow run publish.yml -f tag=vX.Y.Z` 而不是 `gh run rerun`(后者使用原始 workflow 文件) ## 许可证 MIT
标签:cargo-deny, CI/CD 安全, Claude Code, DevSecOps, GitHub Actions, OpenSSF Scorecard, Python安全, Rust, SHA Pinning, SLSA, Trusted Publishing, 上游代理, 代码加固, 依赖审计, 可视化界面, 安全基线, 工作流模板, 插件, 教学环境, 数据投毒防御, 文档安全, 结构化查询, 网络流量审计, 自动化安全, 自动笔记, 软件供应链, 软件开发工具包