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 提供支持。
### 显著特性
| 特性 | 描述 |
| :--- | :--- |
| **基于 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, 上游代理, 云安全架构, 代码安全, 信息泄露防范, 安全助手, 密码发现, 密钥泄露, 批量测试, 攻击面发现, 敏感信息提取, 日志审计, 机密检测, 源代码扫描, 漏洞枚举, 程序破解, 网络安全, 误报过滤, 请求拦截, 跨平台工具, 速度优化, 错误基检测, 隐私保护, 静态代码分析