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