1 个不稳定版本

0.1.8 2024年4月20日

#442 in 文本处理

MIT 许可证

42KB
704

ripsecrets

ripsecrets logo, a gravestone that says "R.I.P. Secrets ?-20XX Death by Exposure"

ripsecrets 是一个命令行工具,用于防止将密钥提交到源代码中。 ripsecrets 具有一些与其他密钥扫描工具区分开来的功能

ripsecrets 的独特之处

ripsecrets 具有一些与其他密钥扫描工具区分开来的功能

  1. 专注于预提交。防止密钥最初被提交比检测到已经提交到仓库中的密钥后处理其后果要便宜得多。

  2. 极快。使用密钥扫描器不应该减慢您的开发工作流程,因此 ripsecrets 比其他工具快 95 倍以上。 了解更多关于其性能设计的信息

  3. 始终本地操作。许多其他密钥扫描器试图验证密钥是否有效,这在实践中意味着自动将源代码中的字符串发送到第三方服务。该决策中存在安全性与便利性之间的权衡,但 ripsecrets 设计为最佳的“仅本地”工具,永远不会将数据从您的计算机发送出去。

  4. 误报率低。虽然仅本地工具的误报率总是比验证密钥的工具高,但 ripsecrets 使用基于概率理论的策略,以便比其他工具更准确地检测密钥。

  5. 单个可执行文件,无依赖。安装 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可以在代码中找到两种类型的秘密

  1. 具有已知模式的秘密可以被匹配。例如,来自Stripe和Slack等服务的外部密钥有预定义的前缀,可以非常可靠地通过正则表达式找到。您可以在此处查看ripsecrets匹配的已知秘密列表:此处

  2. 随机字符串被分配给秘密变量。一些秘密,如AWS的秘密访问密钥,没有可以明确匹配的已知模式。为了检测这些,ripsecrets寻找被“令牌”、“秘密”和“密码”等词汇分配的变量或属性,并检查是否将其分配了一个随机字符串。

为了确定一个字符串是否是随机的,ripsecrets会查看字符串的一些属性,例如它有多少个不同的字符,并计算它随机发生的可能性。如果随机发生的可能性小于1/10000,则将其判定为不是秘密。您可以在此处了解概率是如何计算的:此处

如果您发现了一个错误的否定(ripsecrets未找到的秘密)或一个错误的肯定(被标记为秘密的非秘密),请创建一个问题或拉取请求。

性能

秘密扫描中最慢的部分是在大量文件中查找潜在的机密。为了快速完成这项任务,ripsecrets做了一些事情

  1. 所有秘密模式都被编译成一个正则表达式,因此每个文件只需要处理一次。

  2. 此正则表达式被输入到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