leakferrethq/leakferret-ruby

GitHub: leakferrethq/leakferret-ruby

Ruby gem 形式的密钥扫描器,帮助开发者在代码中检测、验证并自动重写硬编码的密钥与 API key。

Stars: 0 | Forks: 0

leakferret

# leakferret (Ruby gem) [![Gem Version](https://img.shields.io/gem/v/leakferret?logo=rubygems&logoColor=white)](https://rubygems.org/gems/leakferret) [![MIT](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/leakferrethq/leakferret/blob/master/LICENSE.txt) [![MCP Badge](https://lobehub.com/badge/mcp/leakferrethq-leakferret-ruby)](https://lobehub.com/mcp/leakferrethq-leakferret-ruby)

leakferret finds, verifies, and rewrites a leaked secret

原生 [`leakferret`](https://github.com/leakferrethq/leakferret) 二进制文件的 Ruby gem 封装。这个 gem 本身不包含任何扫描逻辑:它安装了一个轻量级的 Ruby shim 以及预构建的静态链接引擎(使用 Rust 编写)。所有的工作——扫描、分类、验证、重写——都在那个单一的二进制文件中完成。 你将得到一个**预编译的平台 gem**,其中包含了内置的二进制文件,就像 `nokogiri` 和 `sorbet-static` 发布其原生代码的方式一样,适用于 x86_64 Linux (glibc)、macOS (x86_64 和 arm64) 以及 x86_64 Windows。二进制文件随着 gem 一起通过 RubyGems 分发——**无需下载,无需网络访问,无需 Rust 工具链**——你可以使用 `gem unpack leakferret` 准确审查将要运行的内容。该 gem **完全不包含任何获取并运行的代码**。在任何其他平台上,源码 gem 会进行安装并提示你进行一键修复(从源码构建,或设置 `LEAKFERRET_BIN`);它绝不会下载二进制文件。 ## leakferret 的作用 leakferret 会在你的代码中查找硬编码的密钥和 API key,并分五个阶段帮助你移除它们: 1. **Scan** — 对文件进行 regex 预过滤;遵循 `.gitignore` 并且还会读取如 `.env` 的 dotfiles。 2. **Catalog** — 一个已知的公开示例凭证签名数据库(Stripe test key、`AKIAIOSFODNN7EXAMPLE`、jwt.io 样本),以便将文档示例标记为 `FIXTURE` 而不是产生误报。 3. **Classify** — 通过离线启发式算法或通过询问宿主编辑器/agent 语言模型(无需额外的 API key,无成本)得出 `REAL` / `FIXTURE` / `UNKNOWN` 判定结果。 4. **Verify** — 向 provider(AWS SigV4、GitHub、GitLab、Stripe、OpenAI、Anthropic、Slack、Twilio、SendGrid、Mailgun、Datadog、Heroku、npm、PyPI、DigitalOcean)发起真实但无害的 API 调用,以确认 key 是否有效,并带有 trufflehog 回退机制。 5. **Rewrite** — 将硬编码的字面量替换为环境变量查找(Ruby 中的 `ENV.fetch`,JS 中的 `process.env`,Python 中的 `os.environ`),添加一行 `.env.example`,并打印密钥管理器的种子命令。 **隐私不变性:** 完整的密钥值永远不会离开你的机器。只有经过脱敏处理的“前 4 位加后 4 位”预览(例如 `AKIA...4XYZ`)会被写入报告、日志、网络消息或模型 prompt 中。验证调用直接从你的机器发送到 provider——leakferret 没有服务器。 ## 安装 ``` gem install leakferret ``` RubyGems 和 Bundler 会自动为你的平台选择正确的预编译 gem,因此二进制文件在 `gem install` 后就已经存在了——无需首次运行下载。在信任它之前,请先进行检查: ``` gem unpack leakferret # the bundled binary is at lib/leakferret/bin/ ``` 已发布的 gem 带有 GitHub 构建来源(SLSA),因此你可以验证每个 gem 是否是由 CI 中标记的源码构建的。在没有预构建二进制文件的平台(例如 aarch64-linux 或 Alpine/musl)上,源码 gem 仍然可以安装——因此 `bundle install` 可以解析——并提示你从源码构建(`cargo install leakferret-cli`)或设置 `LEAKFERRET_BIN`。它绝不进行下载。 将其添加到 `Gemfile` 以供项目本地使用: ``` gem 'leakferret' ``` 需要 Ruby >= 3.1。 ## CLI 该 gem 安装了一个 `leakferret` 可执行文件,它只需对该二进制文件执行 `exec`,因此每个子命令和 flag 的工作方式与上游完全一致: ``` leakferret scan . leakferret verify . --only-verified leakferret rewrite . --apply --backend doppler leakferret baseline init leakferret catalog info leakferret mcp # MCP server on stdio ``` `leakferret scan --git` 会遍历提交历史记录。输出格式包括 `pretty`(彩色终端)、`json` 和 `sarif`(用于 GitHub Code Scanning)。 ## Ruby API ``` require 'leakferret' # 仅 Regex 预过滤。 findings = Leakferret.scan('.') # + provider 已验证(通过实时 HTTP 连接到 GitHub / Stripe / AWS / ...)。 findings = Leakferret.verify('.', mode: 'only-verified') # + 为 REAL findings 建议重写。 findings = Leakferret.rewrite('.', backend: 'doppler') # 原地应用重写。 Leakferret.rewrite('.', apply: true) ``` 每个 `Finding` 都是一个 hash,包含 `path`、`line`、`column`、`pattern`、`severity`(`critical`/`high`/`medium`/`low`)、`verdict`(`real`/`fixture`/`unknown`)、`match_redacted`、`confidence`、`verification` 和 `fingerprint`。 ## 重写泄漏 `rewrite` 将硬编码的密钥转换为环境变量查找,并帮助你将其移动到密钥管理器中: ``` leakferret rewrite . --dry-run-diff # preview the change, touch nothing leakferret rewrite . --apply # write `ENV.fetch("KEY")` in place + add to .env.example leakferret rewrite . --apply --backend doppler # also print seed commands for your manager ``` `--backend` 接受 `env`(默认)、`vault`、`doppler`、`aws-secrets-manager`、`infisical`。默认情况下,它只会重写被确认为 **REAL/live** 的发现结果;添加 `--include-unknown` 也可以修复未确认的候选项。 ## 在 CI 中使用 leakferret 是一个具有明确退出代码(`0` = 干净,`1` = 有发现结果)的二进制文件,因此它可以轻松融入任何 CI。推荐的模式:**建立一次 baseline**,然后在每次构建时执行 `verify`,这样你就只会在出现*新*密钥时失败。 ``` # 在可能已经有 findings 的 repo 上一次性执行: leakferret baseline init # fingerprints current findings (HMAC, never the raw secret) git add .leakferret-baseline.json # commit it — the per-repo salt is auto-gitignored ``` 此后,`verify` 将忽略 baseline 中的任何内容,并且仅在出现新的泄漏时失败。 **GitHub Actions** — 使用专用 action(将 SARIF 上传到 Code Scanning): ``` - uses: leakferrethq/leakferret-action@v1 with: { path: ., fail-on: any } ``` **CircleCI:** ``` jobs: secrets: docker: [{ image: cimg/ruby:3.3 }] steps: - checkout - run: gem install leakferret - run: leakferret verify . --format sarif > leakferret.sarif - store_artifacts: { path: leakferret.sarif } ``` **GitLab CI / Argo Workflows / Jenkins / 其他任何工具** — 相同的配方: ``` gem install leakferret leakferret verify . # exits 1 on any REAL finding -> fails the job ``` 有用的 flag:`--only-verified`(仅在 provider 确认的 live key 时失败)、`--verify-mode ever-verified`(带有 baseline,在*曾经*验证为 live 的任何内容上失败)、`--format sarif|json`。 ## 与 AI agent (MCP) 配合使用 leakferret 也是一个 MCP server,因此代码编写 agent(Cursor、Claude、Continue)可以在*提交之前*进行扫描、验证和重写。将其添加到你的编辑器的 MCP config 中: ``` { "mcpServers": { "leakferret": { "command": "leakferret", "args": ["mcp"] } } } ``` 在 **Cursor** 中:Settings → MCP → Add。在 **Claude Desktop** 中:`claude_desktop_config.json` 的 `mcpServers` 块。暴露的工具:`scan_repository`、`classify_candidates`、`verify_finding`、`propose_rewrite`、`baseline_diff`。 ## 使用本地二进制文件 每个 leakferret wrapper 都遵循 `LEAKFERRET_BIN` 环境变量。将其指向磁盘上的二进制文件,wrapper 就会运行该文件,而不是下载的副本: ``` export LEAKFERRET_BIN=/opt/leakferret/leakferret leakferret scan . ``` 对于气隙隔离或离线安装,设置 `LEAKFERRET_SKIP_DOWNLOAD=1` 可跳过 release 下载,并自行放置二进制文件。 ## 在本地拦截提交(pre-commit hook) 在密钥被提交之前将其捕获。在你的 repo 根目录下执行: ``` cat > .git/hooks/pre-commit <<'HOOK' #!/bin/sh # 离线 secret 扫描(无网络)。在任何 finding 上阻止 commit。 leakferret verify . --verify-mode none --fail-on any || { echo "leakferret blocked this commit. Bypass: git commit --no-verify" exit 1 } HOOK chmod +x .git/hooks/pre-commit ``` `--verify-mode none` 使其保持离线状态;`--fail-on any` 会在任何非 fixture 发现结果上以非零状态退出(像 `AKIAIOSFODNN7EXAMPLE` 这样的文档示例仍然会被忽略)。与 `leakferret baseline init` 配合使用可仅针对*新*密钥进行拦截,或者将该 hook 提交到 `.githooks/` 并运行 `git config core.hooksPath .githooks` 以便与团队共享。 ## 许可证 本 gem 和内置二进制文件的 MIT 许可证。Fixture 目录**数据**采用 CC-BY-SA-4.0 许可证——参见 [`leakferret-catalog`](https://github.com/leakferrethq/leakferret-catalog)。 [leakferret](https://github.com/leakferrethq/leakferret) 的一部分 · [leakferret.com](https://leakferret.com) · 由 Maria Khan <missusk@protonmail.com> 维护。
标签:LNA, Ruby, Rust, StruQ, 可视化界面, 知识库, 网络流量审计