# 机密泄漏风险

未经授权的用户可以利用提交到存储库的 API 密钥、密码和令牌等机密，从而为组织创建安全、合规性和财务风险。

## 什么是机密？

机密是授予对敏感系统和数据的访问权限的凭据。 常见示例包括：

* 用于通过外部服务进行身份验证的 API 密钥和令牌
* 数据库密码和连接字符串
* 云提供商凭据和服务帐户令牌
* 证书和加密密钥

将机密提交到存储库时，它们将成为直接嵌入在源代码或配置文件中的 **硬编码凭据** 。 这些硬编码的机密将成为 Git 历史记录的一部分，即使在从最新提交中删除后仍可访问这些机密。 这意味着解决凭据泄漏需要比删除文件更多;还必须撤销并替换凭据，以防止未经授权的访问。

## 如何公开机密

当凭据在存储库、团队和系统之间激增而无法集中管理和监控时，发生**机密蔓延**。 这使得很难跟踪存在哪些机密、所使用的机密以及它们是否已公开。 机密通常通过多种常见模式进入存储库。

### 开发工作流

* 在本地测试期间添加并无意中提交的硬编码凭据
* 配置文件中的机密，如 `.env` 文件或基础结构即代码模板
* 文档、wiki 或自述文件中包含真实 API 密钥或令牌的示例凭据

### 存储库管理

* 包含被遗忘但仍处于活动状态的凭据的旧存储库
* 在 GitHub 发布、拉取请求评论、讨论或 gist 中共享的秘密
* 外部参与者或承包商引入的凭据

### 版本控制传播

* 即使从当前代码中删除，机密也会保留在 Git 历史记录中。
* 凭据传播到分叉存储库、备份系统和 CI/CD 日志。
* 具有公开机密的公共存储库由搜索引擎和专用扫描服务编制索引。

## 安全风险

公开的机密可能导致多种类型的安全事件。

### 未经授权的访问

凭据泄漏会让未经授权的用户直接访问你的系统。 公开后，可以利用硬编码的机密来：

* 使用泄露的云提供商凭据在帐户上预配基础结构或服务
* 通过泄露的数据库凭据访问敏感客户或组织数据
* 通过公开的服务帐户令牌进入生产系统

### 数据泄露

凭据泄漏使未经授权的用户能够直接访问系统，从而导致数据泄露。 攻击者使用公开的凭据获取访问权限后，可以泄露敏感数据、修改或删除关键信息，并损害客户信任。 数据泄露需要立即事件响应，包括凭据吊销、系统修正和对违规范围和影响的评估。

### 供应链攻击

公开的包注册表令牌可用于发布软件的恶意版本，从而影响依赖于包的下游用户和组织。

## 财务影响

泄露的机密可能导致组织在多方面的经济损失。

* **意外的云账单**：泄露的 API 密钥可让攻击者使用云资源。 他们可以在帐户上运行计算实例、存储数据或挖掘加密货币，从而生成大型账单。
* **事件响应**：调查违规、轮换凭据和审核系统需要大量的工程时间和资源。
* **法律成本**：数据泄露可能会导致罚款、法律费用和通知费用。
* **长期损害**：客户丢失，保险成本较高，安全事件公开后错过了商机。

## GitHub 的秘密安全性

GitHub 提供了有助于防止、检测和修正机密泄漏的工具：

### 1. 阻止提交新机密

启用 **推送保护**以在`git push`操作期间扫描代码，并在检测到机密时阻止提交，以防止它们进入存储库。 这可以防止硬编码凭据添加到代码库，并在风险点向开发人员提供实时反馈，涵盖已知服务和泛型模式（如私钥和通用 API 密钥）的提供程序模式。 请注意，并非所有机密类型默认都受推送保护，并且必须由组织根据风险与噪音的容忍度进行配置。

鼓励各个开发人员为其个人帐户启用推送保护，以保护其在 GitHub 上的所有推送，无论组织策略如何。 这有助于防止机密信息蔓延，因为能够在凭据到达存储库之前检测到泄露的凭据。

### 2.检测现有机密

使用 **secret scanning** 持续监视存储库中的硬编码机密，并在检测到凭据时生成警报，以便快速撤销和更换泄露的凭据。 除了默认检测提供程序模式之外，还可以将扫描扩展到泛型模式，并为组织特定的机密定义自定义模式。 这有助于了解整个组织中的机密蔓延情况。