介绍
如果 API 密钥、令牌和凭据等机密在代码库中无意中暴露或存储不当,则可能会给团队和组织带来重大的安全风险。
任何泄露的机密都应该被认为会立即受到侵害,并且必须采取适当的修正措施,例如撤销机密。 只是从代码库中移除机密、推送新的提交或删除并重新创建存储库并不能阻止机密被利用。
如果你不小心将机密提交到存储库,或者收到了存储库中机密泄露的警报,则本操作指南将指导你如何处理。
先决条件
- 你至少具有存储库写权限。
- 可选:为存储库启用 Secret scanning。
注意
Secret scanning 对公共存储库免费。 它作为 GitHub Secret Protection 的一部分提供,适用于 GitHub Team 和 GitHub Enterprise Cloud 计划中的专用存储库。
步骤 1. 标识机密并收集上下文
收集尽可能多的关于泄露机密的信息。 这将有助于评估风险并确定最佳修正操作过程。
- 确定机密类型及其提供程序。
- 例如,机密是 GitHub personal access token (PAT)、OpenAI API 密钥还是 SSH 私钥?
- 查找包含泄露机密的存储库、文件和行。
- 标识机密所有者。 这是创建机密或对机密负责的个人或团队。
- 检查存储库的
CODEOWNERS文件以确定负责的团队。 - 使用
git log -S来帮助搜索存储库的提交历史记录,以标识提交机密的人员。
- 检查存储库的
提示
如果为存储库启用了 secret scanning,则 secret scanning 警报可以为你提供其中大部分详细信息。
步骤 2. 评估风险
如何进行修正将取决于与机密泄漏关联的风险因素。
Secret scanning 可以帮助你评估与警报关联的风险,但如果你尚未启用 secret scanning,则仍然可以根据可用的信息执行风险评估。
选项 1. Secret scanning 已启用
查看与泄漏关联的 secret scanning 警报,并检查警报标签和任何可用的元数据:
- 检查机密的有效性状态以确定机密是否仍然处于活动状态。 警报将包含一个状态,此状态描述机密是处于活动状态还是非活动状态,或者其有效性是否未知。
注意
- 有效性检查仅适用于某些机密类型。 要检查是否支持你的机密类型,请参阅 支持的机密扫描模式。
- 机密提供者始终是用于确定机密有效性的最可靠事实源。
- 检查
public exposure标签以确定机密是否已在公共存储库中泄露。 - 检查
multiple leaks标签以确定机密是否已在多个位置公开。 - 如果机密是 GitHub PAT,请检查警报元数据,以获取有关机密上次使用时间及其访问范围的任何信息。
- 评估哪些服务或应用程序依赖于此机密,并考虑如果立即撤销该机密,是否可能导致停机或中断。
选项 2. Secret scanning 未启用
如果你尚未为存储库启用 secret scanning,请根据以下内容执行风险评估:
- 检查存储库的可见性。 该存储库是否为公共存储库?
- 查找最近使用过机密的迹象。 是否有任何近期提交或拉取请求引用了机密? 是否有任何日志或审核线索显示正在使用的机密?
- 评估包含机密的文件和周围上下文。 此机密是用于生产部署脚本(风险较高)还是测试文件(风险较低)? 此机密是与数据库凭据还是管理密钥关联(风险较高)?
- 评估哪些服务或应用程序依赖于此机密,并考虑如果立即撤销该机密,是否可能导致停机或中断。
提示
采用 GitHub Team 和 GitHub Enterprise 计划的组织可以执行免费机密风险评估(按需、时间点扫描),以评估其机密泄露风险。 请参阅“关于 GitHub 的机密安全性”。
步骤 3. 制定修正策略
下一步取决于你在上一步中执行的风险评估。
针对高风险机密快速采取行动
自动扫描程序可在数分钟内找到公开的机密。 它们可能会在数小时内被恶意行动者利用。 活动机密的公开时间越长,发生严重泄露的可能性就越大。
如果机密为高风险(即机密仍处于活动状态、已在公共存储库中公开或者是生产凭据),那么我们建议:
-
立即优先撤销机密。 请参阅步骤 4。
注意
如果你担心服务停机,则可能需要先生成具有相同权限的新机密,让应用程序开始使用新令牌,_然后_再撤销旧机密。
-
在撤销期间或撤销之后,与机密所有者(在步骤 1 中标识)、存储库管理员和安全负责人沟通。
针对中低风险机密制定计划
如果机密为中低风险(即机密不再处于活动状态、已在专用存储库中公开,或者是测试或开发凭据),则可以相应地规划修正策略:
- 使用步骤 1 中收集的信息,找到对机密负责的团队并提醒他们注意机密泄露。
- 说明泄露的内容和泄露时间。 说明你需要撤销机密、生成新机密,并且受影响的服务将需要更新。
- 通知存储库管理员和安全负责人有关泄漏的情况,并解释需要或已经采取的任何修正操作。
- 与相应团队一起规划撤销和轮换的时间以协调平稳过渡。
即使是中低风险的机密,也必须修正,因为如果公开了机密,那么它们仍然会对安全性和合规性构成风险。
步骤 4. 撤销机密
仅仅从代码库中移除机密是不够的。 最重要的修正步骤是使用机密提供程序撤销机密。 通过撤销机密,可以大大降低机密被利用的可能性。
-
使用步骤 1 中收集的信息,找到机密提供者的网站或文档。
-
按照提供程序的说明撤销机密。 这通常涉及登录提供程序的门户并导航到管理机密的部分。
如果无法访问提供程序门户,请联系机密所有者或相关存储库管理员以获取有关撤销机密的帮助。
-
如有必要,生成一个新机密来替换撤销的机密。 这通常需要还原依赖于原始机密的服务功能。
注意
GitHub 会自动撤销公共存储库中泄露的 GitHub personal access tokens (PAT)。
对于专用存储库中泄露的 GitHub PAT,你可以通过单击报告泄露,直接从 secret scanning 警报中向 GitHub 报告泄露。
对于其他机密类型,如果与 GitHub 支持的合作伙伴模式之一匹配的机密在公共存储库中泄露,则 GitHub 会自动向机密提供者报告泄漏,后者可能会立即撤销该机密。
步骤 5:标识并更新受影响的服务
接下来,你需要协调更新所有使用泄露的机密的受影响服务,并使用新的机密对其进行更新。
Identify
- 使用 GitHub 的代码搜索来检查机密的所有代码、议题和拉取请求。
- 使用
org:YOUR-ORG "SECRET-STRING"在整个组织内进行搜索。 - 使用
repo:YOUR-REPO "SECRET-STRING"搜索存储库。
- 使用
- 检查存储库存储的部署密钥、机密和变量。
- 单击“设置”,然后在“安全性”下面,单击机密和变量或部署密钥。
- 检查任何已安装的 GitHub Apps 和可能使用机密的集成。
Coordinate
- 指示 Copilot 为更新受影响的服务所涉及的每个任务创建议题(和子议题)。
- 如果涉及多个利益干系人,请为议题创建项目板以跟踪进度并促进沟通。
更新和验证
- 使用新机密更新应用程序,确保应用程序正确使用新凭据。
提示
向应用程序提供敏感凭据的一种安全方法是通过保管库。 例如,你可以通过存储库设置页下的“机密和变量”存储向 GitHub 操作和工作流提供敏感凭据。
- 测试受影响的服务以确保其能够使用新机密正常运行。
步骤 6. 检查未经授权的访问
服务恢复正常运行后,请务必检查机密公开时可能发生的任何未经授权的访问。
-
查看 GitHub 的审核日志,看是否有与机密及其使用相关的事件。
对于组织和企业级审核日志,你可以专门搜索与访问令牌相关的事件。 请参阅 标识由访问令牌执行的审核日志事件(组织)和 标识由访问令牌执行的审核日志事件(企业)。
对 GitHub 审核日志的访问权限取决于你的角色,因此,如果你没有所需的权限,则可能需要联系组织所有者或企业管理员。
-
查看机密提供者的审核日志。
- 例如,对于 Amazon Web Services (AWS) 机密,你可以检查 CloudTrail 日志,查找使用泄露的机密进行的任何未经授权的访问尝试。 请参阅 AWS CloudTrail 文档中的什么是 AWS CloudTrail?。
步骤 7. 清理存储库
尽管你现在已经撤销并更新了代码库中的机密,但此机密可能仍然存在于存储库的提交历史记录中。 理想情况下,你应该在存储库中搜索并移除机密的所有实例。
但是,清理 Git 历史记录的过程可能会造成破坏和中断,因为它可能涉及强制将更改推送到存储库。
与存储库的安全负责人一起,仔细考虑清理存储库历史记录对合规性或安全义务的影响。 请参阅“从存储库中删除敏感数据”。
步骤 8。 解决警报
- 通过选择解决形式并将警报标记为“已撤销”,来关闭存储库中的 secret scanning 警报。
- 在团队的知识库或事件管理系统中记录事件,包括为修正泄漏所采取的步骤和任何经验教训。
步骤 9. 防止进一步泄漏
处理机密泄露通常会造成中断,过程复杂且耗时。 机密处理的重点应始终放在不惜一切代价防止泄露上:
- 如果还没有为存储库启用推送保护(GitHub Secret Protection 的一部分),请确保进行启用。 了解如何实施严格的绕过控制,以便只有受信任的用户才能绕过推送保护。 请参阅“关于推送保护”。
- 确保已对个人帐户启用“用户的推送保护”,这可防止意外将受支持的机密推送到_任何_公存储库。
- 在团队或组织内倡导或实施机密管理最佳做法:
- 使用环境变量存储机密,而不是在代码库中对其进行硬编码。
- 使用机密管理工具(例如存储库设置页下 GitHub 的“Secrets and variables”存储)安全地存储和管理机密。
- 定期轮换机密以尽量减少任何潜在泄漏的影响。
- 记录事件和修正步骤,以帮助团队从过去的错误中吸取教训并改进未来的做法。
- 提倡并开展定期学习和安全培训。 例如,请参阅 Microsoft Learn 中的 GitHub 高级安全性课程。
延伸阅读
-
[AUTOTITLE](/code-security/secret-scanning/introduction/about-secret-scanning) -
[AUTOTITLE](/code-security/secret-scanning/introduction/about-push-protection) -
[AUTOTITLE](/code-security/secret-scanning/introduction/supported-secret-scanning-patterns) -
[AUTOTITLE](/get-started/learning-about-github/about-github-advanced-security)