# 了解 GitHub 机密类型

了解 GitHub 机密的使用、范围和访问权限。

## 如何 GitHub 存储机密

GitHub 使用 [Libsodium 密封框](https://libsodium.gitbook.io/doc/public-key_cryptography/sealed_boxes) 加密机密。 机密在到达 GitHub 之前进行加密，并且会保持加密状态，直到它被 Dependabot使用， GitHub Actions或者 Codespaces。

## Dependabot 秘密

Dependabot 机密用于存储要在 Dependabot 中使用的凭据和敏感信息。

Dependabot 机密在存储库的 `dependabot.yml` 文件中被引用。

### Usage

Dependabot 密钥通常用于 Dependabot 进行身份验证以访问专用包注册表。 这允许 Dependabot 打开拉取请求以更新专用存储库中易受攻击或过时的依赖项。 用于身份验证，这些 Dependabot 机密在存储库 `dependabot.yml` 的文件中引用。

Dependabot 机密还可能包括由 Dependabot 启动的工作流所需的机密。 例如， Dependabot 在创建拉取请求以更新依赖项时，可以触发 GitHub Actions 工作流，或对拉取请求的注释。 在这种情况下，如果工作流是由Dependabot事件触发的，就可以从工作流文件（`.github/workflows/*.yml`）中引用机密。

### Scope

可以在以下位置定义 Dependabot 机密：

* 存储库级别
* 组织级别

Dependabot 在组织级别设置时，可以在存储库之间共享机密。 必须指定组织中的哪些存储库可以访问机密。

### 访问权限

Dependabot 机密可供 Dependabot 访问，以便向专用注册表进行身份验证，从而更新依赖项。

在 Dependabot 启动工作流的触发器事件时，GitHub Actions 机密可供 Dependabot 工作流访问。 这是因为，当工作流启动 Dependabot时，只有 Dependabot 机密可用 - 操作机密不可访问。 因此，这些工作流所需的任何机密都必须存储为 Dependabot 机密，而不是 Actions 机密。
`pull_request_target` 事件还有其他安全限制。 请查看[限制和局限](#limitations-and-restrictions)。

#### 用户访问权限

存储库级机密：

* 具有存储库 **管理员访问权限** 的用户可以创建和管理 Dependabot 机密。
* 对存储库具有 **协作者访问权限** 的用户可以使用机密 Dependabot。

组织级机密：

* **组织所有者** 可以创建和管理 Dependabot 机密。
* 若用户具有存储库的**协作者访问权限**并可访问每个机密，则可以将机密用于 Dependabot。

### 局限和限制

对于由其 Dependabot启动的工作流，事件 `pull_request_target` 处理方式与其他事件不同。 对于此事件，如果拉取请求的基本引用由 Dependabot (`github.event.pull_request.user.login == 'dependabot[bot]'`) 创建：

* 该工作流接收只读 `GITHUB_TOKEN`。
* 机密不适用于该工作流\*\*\*\*。

此额外限制有助于防止 Dependabot 启动的请求可能引发潜在安全风险。

Dependabot 机密不会被传递给分叉。

## 操作机密

Actions 机密用于在工作流中存储敏感信息（例如 API 密钥、身份验证令牌和其他凭据）。

### Usage

工作流文件 (`.github/workflows/*.yml`) 中会引用 Actions 机密。

### Scope

可以在以下级别定义 Actions 机密：

* 存储库级别
* 环境级别
* 组织级别

环境级机密特定于某个特定环境，例如生产环境或过渡环境。
如果在组织级别设置，则可以跨存储库共享 Actions 机密。 可以使用访问策略来控制哪些存储库有权访问机密。

### 访问权限

操作机密仅在 GitHub Actions 工作流中可用。 尽管在 Actions 上运行， Dependabot 但无权访问 Actions 机密。

对于由Dependabot启动的工作流，Actions 机密信息不可用。 这些工作流机密必须存储为 Dependabot 机密，才能访问工作流。

存储 Actions 机密的位置决定了其可访问性：

* 存储库机密：存储库中的所有工作流都可以访问该机密。
* 环境机密：只有引用该特定环境的作业才可访问该机密。
* 组织机密：存储库中由组织授予访问权限的所有工作流都可以访问组织机密。

#### 用户访问权限

存储库级机密和环境机密：

* 对存储库具有“管理员访问权限”的用户可以创建和管理 Actions 机密\*\*\*\*。
* 对存储库具有“协作者访问权限”的用户可以使用机密\*\*\*\*。

组织级机密：

* **组织所有者**可以创建和管理 Actions 机密。
* 对有权访问每个机密的存储库具有“协作者访问权限”的用户可以使用该机密\*\*\*\*。

### 局限和限制

* Actions 密钥不适用于由Dependabot启动的工作流。
* Actions 机密不会传递给由分叉中的拉取请求触发的工作流。
* GitHub Actions 会自动修订打印到工作流日志的所有 GitHub 机密的内容。
* 最多可以存储 1,000 个组织机密、100 个存储库机密和 100 个环境机密。 密码大小限于 48 KB。 有关详细信息，请参阅[机密的限制](/zh/actions/reference/security/secrets#limits-for-secrets)。

## Codespaces 秘密

Codespaces 机密将存储要在 GitHub Codespaces 中使用的 API 令牌和 SSH 密钥等凭据和敏感信息，从而可配置安全的开发环境。

### Usage

Codespaces机密可在 Codespaces 开发容器配置 (`devcontainer.json`) 中引用。

### Scope

可以在以下位置定义 Codespaces 机密：

* 用户帐户级别
* 存储库级别
* 组织级别

对于用户帐户级机密，可以选择哪些存储库有权访问机密。

Codespaces 如果在组织级别设置，则可以跨存储库共享机密。 可以使用访问策略来控制哪些存储库有权访问机密。

### 访问权限

Codespaces 机密只能在 Codespaces 中被访问。

GitHub Actions无法访问Codespaces的机密。

#### 用户访问权限

用户帐户级机密：

* Codespaces 机密可用于使用可访问该机密的存储库创建的任何代码空间。

存储库级机密：

* 具有存储库 **管理员访问权限** 的用户可以创建和管理 Codespaces 机密。
* 对存储库具有“协作者访问权限”的用户可以使用机密\*\*\*\*。

组织级机密：

* **组织所有者** 可以创建和管理 Codespaces 机密。
* 对有权访问每个机密的存储库具有“协作者访问权限”的用户可以使用该机密\*\*\*\*。

### 局限和限制

* 最多可以存储 100 个 GitHub Codespaces机密。
* 密码大小限于 48 KB。
* Codespaces 机密不会被传递给分叉。

## 延伸阅读

* [为 Dependabot 配置对专用注册表的访问权限](/zh/code-security/how-tos/secure-your-supply-chain/manage-your-dependency-security/configure-access-to-private-registries#storing-credentials-for-dependabot-to-use)
* [机密参考](/zh/actions/reference/security/secrets#limits-for-secrets)
* [管理存储库或组织的开发环境机密](/zh/codespaces/managing-codespaces-for-your-organization/managing-development-environment-secrets-for-your-repository-or-organization)
* [管理 GitHub Codespaces 的账户专属的机密](/zh/codespaces/managing-your-codespaces/managing-your-account-specific-secrets-for-github-codespaces)