betterleaks/betterleaks

GitHub: betterleaks/betterleaks

一个由 Gitleaks 原作者团队开发的高性能密钥泄露扫描工具,支持 CEL 规则过滤、Secret 实时验证和多种扫描源,帮助团队在开发和部署过程中及时发现敏感信息泄露。

Stars: 892 | Forks: 52

# Betterleaks ``` ○ ○ ● ○ ``` Betterleaks 是一个用于查找密码和 API 密钥等敏感信息的工具。如果您想了解更多关于检测引擎的工作原理,请查看此博客:[Regex is (almost) all you need](https://lookingatcomputer.substack.com/p/regex-is-almost-all-you-need)。 Betterleaks 由 Gitleaks 的创建者(包括原作者)团队负责维护。开发工作由 Aikido Security 提供支持。
Aikido Security ### 显著特性 | 特性 | 描述 | | :--- | :--- | | **基于 CEL 的过滤** | 编写上下文规则过滤器,评估片段(数据块)属性(如 git 作者、提交信息和文件路径)以及发现的数据,从而减少误报。如果您熟悉 Gitleaks,可以将此功能视为更具表现力的 `[[allowlist]]` 系统。 | | **Secrets 验证** | 直接在规则定义中使用 CEL 发送异步 HTTP 请求,验证检测到的 Secret 是否仍然有效。 | | **Token 效率过滤** | 使用 BPE 分词技术衡量字符串的“罕见程度”或非人工生成特征,过滤掉自然语言引起的误报。 | | **快速扫描** | 通过合理的默认并行化设置、ahocorasick 关键字过滤器和 re2 实现高性能的快速扫描。 | | **可移植性** | 可在任何现代操作系统/架构上运行。小巧的二进制文件可以轻松集成到任何系统中。 | ### 安装 ``` # 包管理器 brew install betterleaks brew install betterleaks/tap/betterleaks # Fedora Linux sudo dnf install betterleaks # 容器 docker pull ghcr.io/betterleaks/betterleaks:latest # 源代码 git clone https://github.com/betterleaks/betterleaks cd betterleaks make build ``` ### 使用方法 ``` # Scan Git betterleaks git /path/to/repo -v --git-workers=16 # Scan 本地文件系统 betterleaks dir /path/to/file/or/dir -v # Scan GitHub 组织 betterleaks github https://github.com/betterleaks # Scan GitHub 用户 betterleaks github https://github.com/cooluser123456789 --include issues,prs,actions,releases,gists # Scan 特定资源,例如 PR... 但排除描述(仅扫描评论) betterleaks github https://github.com/betterleaks/betterleaks/pull/113 # Scan stdin cat some_file.txt | betterleaks stdin -v ``` 有关更多高级扫描示例,请查看[扫描文档](docs/scanning.md)。 ### 配置 Betterleaks 的强大之处在于其富有表现力的配置。过滤和验证逻辑均通过 CEL 定义。在编写过滤器和验证器之前,建议您花 30 分钟时间熟悉一下 [CEL](https://cel.dev)。`prefilter` 在任何正则表达式匹配之前运行,只能访问 `attributes` 映射。`attributes` 用于描述如 git patch 这样的资源。使用 `prefilter` 可以在执行更耗资源的扫描之前快速跳过。另一方面,`filter` 在正则表达式匹配之后进行评估,可以访问 `attributes` 映射以及候选的 `finding` 数据(例如 `finding["secret"]` 或 `finding["match"]`)。 ``` # Global prefilter,它在执行消耗性能的 regex 调用之前运行 prefilter = ''' (matchesAny(attributes[?"path"].orValue(""), [ r"""(?i)\.(?:bmp|gif|jpe?g|png|svg|tiff|pdf|exe)$""", r"""(?:^|/)node_modules(?:/.*)?$""", r"""(?:^|/)vendor(?:/.*)?$""" ])) || attributes[?"git.author_name"].orValue("") == "renovate[bot]" ''' # Global filter,它针对_每个_候选 secret 运行。 filter = ''' containsAny(finding["secret"], [ "EXAMPLE", "CHANGEME", "YOUR_API_KEY_HERE", "0000000000000000" ]) ''' # 一个包含有关如何检测 secrets 数据的 tables 数组 [[rules]] id = "github-fine-grained-pat" description = "GitHub Fine-Grained Personal Access Token, risking unauthorized repo access." regex = '''github_pat_\w{82}''' keywords = ["github_pat_"] # Rule-level filter filter = ''' ( attributes[?"git.author_name"].orValue("") == "ci-runner" && attributes[?"path"].orValue("").startsWith("mocks/") && finding["secret"].contains("TESTING") ) || (entropy(finding["secret"]) <= 3.0) ''' # Post-match-and-filter 异步验证检查 validate = ''' cel.bind(r, http.get("https://api.github.com/user", { "Accept": "application/vnd.github+json", "Authorization": "token " + secret }), r.status == 200 && r.json.?login.orValue("") != "" ? { "result": "valid", "username": r.json.?login.orValue(""), "name": r.json.?name.orValue(""), "scopes": r.headers[?"x-oauth-scopes"].orValue("") } : r.status in [401, 403] ? { "result": "invalid", "reason": "Unauthorized" } : unknown(r) ) ''' ``` 有关示例,请参考默认的 [betterleaks 配置](https://github.com/betterleaks/betterleaks/blob/master/config/betterleaks.toml);有关 `betterleaks.toml` 配置的更多信息,请参阅[配置文档](docs/config.md)。 ### 退出代码 当遇到泄漏时,可以使用 --exit-code 标志设置退出代码。默认的退出代码如下: ``` 0 - no leaks present 1 - leaks or error encountered 126 - unknown flag ```
标签:Aho-Corasick算法, API Key扫描, BPE分词, CEL表达式, CI/CD安全, DevSecOps, Docker容器, EVTX分析, GitHub安全, Gitleaks替代, Go语言, Llama, RE2正则, SecOps, StruQ, 上游代理, 云安全架构, 代码安全, 信息泄露防范, 安全助手, 密码发现, 密钥泄露, 批量测试, 攻击面发现, 敏感信息提取, 日志审计, 机密检测, 源代码扫描, 漏洞枚举, 程序破解, 网络安全, 误报过滤, 请求拦截, 跨平台工具, 速度优化, 错误基检测, 隐私保护, 静态代码分析