1 个不稳定版本
0.1.8 | 2024年4月20日 |
---|
#442 in 文本处理
42KB
704 行
ripsecrets
ripsecrets
是一个命令行工具,用于防止将密钥提交到源代码中。 ripsecrets
具有一些与其他密钥扫描工具区分开来的功能
ripsecrets 的独特之处
ripsecrets
具有一些与其他密钥扫描工具区分开来的功能
-
专注于预提交。防止密钥最初被提交比检测到已经提交到仓库中的密钥后处理其后果要便宜得多。
-
极快。使用密钥扫描器不应该减慢您的开发工作流程,因此
ripsecrets
比其他工具快 95 倍以上。 了解更多关于其性能设计的信息。 -
始终本地操作。许多其他密钥扫描器试图验证密钥是否有效,这在实践中意味着自动将源代码中的字符串发送到第三方服务。该决策中存在安全性与便利性之间的权衡,但
ripsecrets
设计为最佳的“仅本地”工具,永远不会将数据从您的计算机发送出去。 -
误报率低。虽然仅本地工具的误报率总是比验证密钥的工具高,但
ripsecrets
使用基于概率理论的策略,以便比其他工具更准确地检测密钥。 -
单个可执行文件,无依赖。安装
ripsecrets
就像将可执行文件复制到您的bin
目录一样简单。
用法
默认情况下,运行 ripsecrets
将递归地搜索当前目录中的源代码文件以查找密钥。
$ ripsecrets
对于每个找到的密钥,它将打印出文件、行号和找到的密钥。如果找到任何密钥,它将以非零状态码退出。
您可以选择作为参数传递要搜索的文件和目录的列表。
$ ripsecrets file1 file2 dir1
这通常用于搜索即将提交到源控制中的文件,以避免意外包含的秘密。
将 ripsecrets 安装为 pre-commit 钩子
您可以使用以下命令在当前 git 仓库中自动安装 ripsecrets
作为 pre-commit 钩子:
$ ripsecrets --install-pre-commit
如果您想手动安装 ripsecrets
,可以将以下命令添加到您的 pre-commit
脚本中:
ripsecrets --strict-ignore `git diff --cached --name-only --diff-filter=ACM`
传递 --strict-ignore
确保在运行 secrets 作为 pre-commit 时尊重您的 .secretsignore
文件。
安装
Homebrew
ripsecrets
可在 macOS 和 Linux 的 Homebrew 中使用。
$ brew install ripsecrets
预构建
您可以从 发行版页面 下载最新版本的预构建二进制文件。
Cargo
如果您已安装 Rust 和 Cargo,您可以运行:
$ cargo install --git https://github.com/sirwart/ripsecrets --branch main
Nix Flake
假设您已启用 Nix 配置中的 Flakes,您可以通过运行以下命令来构建 ripsecrets
二进制文件并将其添加到默认 Nix 配置文件中:
$ nix profile install github:sirwart/ripsecrets
使用 pre-commit
将以下内容添加到您的 .pre-commit-config.yaml
文件中,以便 ripsecrets
作为 pre-commit 框架 的钩子工作:
repos:
- repo: https://github.com/sirwart/ripsecrets
rev: v0.1.8 # Use latest tag on GitHub
hooks:
- id: ripsecrets
# uncomment to check additional patterns
# args:
# - --additional-pattern 'mytoken*'
# - --additional-pattern 'mykey*'
有两个可用的钩子:
-
ripsecrets
(推荐)pre-commit 将从头开始设置 Rust 环境,以编译和运行 ripsecrets。有关更多信息,请参阅 pre-commit rust 插件文档。
-
ripsecrets-system
pre-commit 将在您的
PATH
中查找ripsecrets
。此钩子要求您单独安装 ripsecrets,例如使用包管理器或 预构建的二进制发行版。只有当您愿意让所有仓库用户手动安装ripsecrets
时才推荐使用此钩子。
忽略秘密
ripsecrets
默认会尊重您的 .gitignore 文件,但您可能仍希望排除某些文件不被扫描秘密。为此,您可以创建一个 .secretsignore 文件,它支持与 .gitignore 文件类似的语法来忽略文件。除了排除文件外,它还支持一个 [secrets]
部分,允许忽略个别秘密。
test/*
dummy
[secrets]
pAznMW3DsrnVJ5TDWwBVCA
除了 .secretsignore 文件外,ripsecrets
还兼容与 detect-secrets
风格的允许列表注释在同一行上检测到的秘密。
test_secret = "pAznMW3DsrnVJ5TDWwBVCA" # pragma: allowlist secret
查找自定义秘密
在某些情况下,您可能有 ripsecrets
无法识别的自定义秘密。要检测这些秘密,请使用 --additional-pattern
参数调用 ripsecrets
。
ripsecrets --additional-pattern my-secret-\*
正则表达式中的任何匹配组在报告为秘密之前都将进行随机性测试。如果您不希望这种行为,请在正则表达式中使用非匹配组。例如,而不是使用 (foo|bar)
,请使用 (?:foo|bar)
。
如果您试图检测的秘密模式是公开记录的秘密模式,请创建一个问题。
工作原理
ripsecrets
可以在代码中找到两种类型的秘密
-
具有已知模式的秘密可以被匹配。例如,来自Stripe和Slack等服务的外部密钥有预定义的前缀,可以非常可靠地通过正则表达式找到。您可以在此处查看
ripsecrets
匹配的已知秘密列表:此处。 -
随机字符串被分配给秘密变量。一些秘密,如AWS的秘密访问密钥,没有可以明确匹配的已知模式。为了检测这些,
ripsecrets
寻找被“令牌”、“秘密”和“密码”等词汇分配的变量或属性,并检查是否将其分配了一个随机字符串。
为了确定一个字符串是否是随机的,ripsecrets
会查看字符串的一些属性,例如它有多少个不同的字符,并计算它随机发生的可能性。如果随机发生的可能性小于1/10000,则将其判定为不是秘密。您可以在此处了解概率是如何计算的:此处。
如果您发现了一个错误的否定(ripsecrets
未找到的秘密)或一个错误的肯定(被标记为秘密的非秘密),请创建一个问题或拉取请求。
性能
秘密扫描中最慢的部分是在大量文件中查找潜在的机密。为了快速完成这项任务,ripsecrets
做了一些事情
-
所有秘密模式都被编译成一个正则表达式,因此每个文件只需要处理一次。
-
此正则表达式被输入到ripgrep,这是一个专门针对快速运行正则表达式对大量文件进行优化的工具。
此外,ripsecrets
是用Rust编写的,这意味着没有解释器启动时间。为了比较实际性能,以下是一些不同的扫描工具在M1 air笔记本电脑上搜索Sentry存储库中秘密的运行时间
工具 | 平均运行时间 | 与基线相比 |
---|---|---|
ripsecrets | 0.32秒 | 1倍 |
trufflehog | 31.2秒 | 95倍 |
detect-secrets | 73.5秒 | 226倍 |
通常,您的预提交将运行在少量文件上,所以上面的运行时间并不典型,但在处理涉及大量文件的大型提交时,运行时间可能会变得明显。
运行基准测试
$ cargo bench
结果可以在target/criterion/report/index.html
中查看。
其他工具
即使ripsecrets
不是您所需要的工具,如果您正在处理涉及用户数据的业务服务,您应该强烈考虑使用秘密扫描器。以下是一些值得考虑的替代工具
依赖关系
~12–22MB
~385K SLoC