密钥扫描

最常见的攻击途径之一是将秘密信息存储在明文文件中。秘密信息绝不应以未加密和未保护的形式存储。GitHub通过不断扫描你所有的公共仓库来帮助你检测这些秘密信息。你也可以在启用了GitHub高级安全的组织的私有仓库中启用此功能。目前,公共仓库中已经检测到近100个秘密信息,私有仓库中则有145个,包括Adobe、Alibaba、Amazon、Atlassian、Azure等。完整列表请见 [GitHub文档](https://docs.github.com/en/code-security/secret-scanning/about-secret-scanning)。

你可以在 Settings | Security & analysis | GitHub Advanced Security 中启用私有仓库的秘密扫描。在这里,你还可以通过点击 New pattern 来定义自定义模式(见图14.9):

image 2024 12 27 16 25 39 830
Figure 1. 图14.9 – 启用秘密扫描并添加自定义模式

自定义模式是一个正则表达式,用于匹配你希望检测的秘密信息。你需要提供一些测试字符串来检查你的模式是否有效。GitHub会将测试字符串中找到的秘密标记为黄色(见图14.10):

image 2024 12 27 16 25 55 444
Figure 2. 图14.10 – 添加自定义秘密模式

你还可以自定义秘密前后的模式,或者添加必须匹配或不匹配的模式。例如,你可以通过额外的模式 ([A-Z]) 来强制要求字符串至少包含一个大写字母(见图14.11):

image 2024 12 27 16 26 10 876
Figure 3. 图14.11 – 自定义模式的高级选项

自定义模式也可以在组织和企业级别定义,GitHub将扫描在启用GitHub高级安全的企业或组织中的所有仓库。

当检测到新秘密时,GitHub会根据用户的通知偏好通知所有有权限查看安全警报的用户。如果你正在关注仓库、已启用安全警报通知或所有活动通知、是包含秘密的提交的作者,并且没有忽略该仓库,你将收到警报。

你可以在 Security | Secret scanning alerts 中管理这些警报(见图14.12):

image 2024 12 27 16 26 26 609
Figure 4. 图14.12 – 管理秘密扫描警报

你应该将提交到GitHub的秘密视为已泄露——即使它仅仅存在于私有仓库中。务必旋转并撤销该秘密。一些服务提供商会为你撤销它。

你可以通过设置 RevokedFalse positiveUsed in testsWon’t fix 状态来关闭警报(见图14.13):

image 2024 12 27 16 26 43 445
Figure 5. 图14.13 – 管理秘密扫描警报的状态

你还可以通过在 .github 文件夹中添加一个 secret_scanning.yml 文件来排除源代码中的某些路径不进行秘密扫描。该文件支持使用通配符的多个路径模式:

paths-ignore:
  - "tests/data/**/*.secret"

但要小心!这不应该用于在源文件中存储真实的秘密信息,即使是用于测试——应将秘密信息存储为GitHub加密的秘密或在安全的密码库中。

秘密扫描非常简单——你基本上只需要开启它。但是,安全性的价值不容小觑。