GitHub 如何存储机密
GitHub 使用 Libsodium 密封盒来加密机密。 机密在到达 GitHub 之前会被加密,并保持加密状态,直到它被 Dependabot、GitHub Actions 或 Codespaces 使用。
Dependabot 机密
Dependabot 机密用于存储凭据和敏感信息,以便在 Dependabot 中使用。
存储库的 dependabot.yml 文件中会引用 Dependabot 机密。
Usage
Dependabot 机密通���由 Dependabot 用来向专用包注册表进行身份验证。 这让 Dependabot 可以创建拉取请求,以更新专用存储库中易受攻击或过时的依赖项。 存储库的 dependabot.yml 文件中会引用这些用于进行身份验证的 Dependabot 机密。
Dependabot 机密还可以包括 Dependabot 发起的工作流所需的机密。 例如,Dependabot 可在创建拉取请求以更新依赖项时或注释拉取请求时触发 GitHub Actions 工作流。 在这种情况下,只要由 Dependabot 事件触发了工作流,就可以从工作流文件 (.github/workflows/*.yml) 引用 Dependabot 机密。
Scope
可以在以下级别定义 Dependabot 机密:
- 存储库级别
- 组织级别
在组织级别设置时,可以在存储库之间共享 Dependabot 机密。 必须指定组织中的哪些存储库可以访问机密。
访问权限
向专用注册表进行身份验证以更新依赖项时,Dependabot 会访问 Dependabot 机密。
Dependabot 发起工作流的触发器事件时,GitHub Actions 工作流会访问 Dependabot 机密。 这是因为当 Dependabot 发起工作流时,只有 Dependabot 机密可用 - 无法访问 Actions 机密。 因此,这些工作流所需的任何机密都必须存储为 Dependabot 机密,而不是 Actions 机密。
pull_request_target 事件还有其他安全限制。 请查看限制和局限。
用户访问权限
存储库级机密:
- 对存储库具有“管理员访问权限”的用户可以创建和管理 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 机密。 可以使用访问策略来控制哪些存储库有权访问机密。
访问权限
Actions 机密仅可用于 GitHub Actions 工作流。 尽管在 Actions 上运行,但 Dependabot 无权访问 Actions 机密。
对于 Dependabot 发起的工作流,Actions 机密不可用。 这些工作流机密必须存储为 Dependabot 机密才可被工作流访问。
存储 Actions 机密的位置决定了其可访问性:
- 存储库机密:存储库中的所有工作流都可以访问该机密。
- 环境机密:只有引用该特定环境的作业才可访问该机密。
- 组织机密:存储库中由组织授予访问权限的所有工作流都可以访问组织机密。
用户访问权限
存储库级机密和环境机密:
- 对存储库具有“管理员访问权限”的用户可以创建和管理 Actions 机密****。
- 对存储库具有“协作者访问权限”的用户可以使用机密****。
组织级机密:
- 组织所有者可以创建和管理 Actions 机密。
- 对有权访问每个机密的存储库具有“协作者访问权限”的用户可以使用该机密****。
局限和限制
- Actions 机密不可用于 Dependabot 发起的工作流。
- Actions 机密不会传递给由分叉中的拉取请求触发的工作流。
- GitHub Actions 会自动删除打印到工作流日志的所有 GitHub 机密的内容。
- 最多可以存储 1,000 个组织机密、100 个存储库机密和 100 个环境机密。 密码大小限于 48 KB。 有关详细信息,请参阅机密的限制。
Codespaces 机密
Codespaces 机密存储凭据和敏感信息(如 API 令牌和 SSH 密钥),以便在 GitHub Codespaces 中使用,从而允许配置安全开发环境。
Usage
在 Codespaces 开发容器配置 (devcontainer.json) 中会引用 Codespaces 机密。
Scope
可以在以下级别定义 Codespaces 机密:
- 用户帐户级别
- 存储库级别
- 组织级别
对于用户帐户级机密,可以选择哪些存储库有权访问机密。 如果在组织级别设置,则可以跨存储库共享 Codespaces 机密。 可以使用访问策略来控制哪些存储库有权访问机密。
访问权限
只能在 Codespaces 中访问 Codespaces 机密。
GitHub Actions 无法访问 Codespaces 机密。
用户访问权限
用户帐户级机密:
- Codespaces 机密可用于使用有权访问该机密的存储库创建的任何代码空间。
存储库级机密:
- 对存储库具有“管理员访问权限”的用户可以创建和管理 Codespaces 机密****。
- 对存储库具有“协作者访问权限”的用户可以使用机密****。
组织级机密:
- 组织所有者可以创建和管理 Codespaces 机密。
- 对有权访问每个机密的存储库具有“协作者访问权限”的用户可以使用该机密****。
局限和限制
- 最多可以为 GitHub Codespaces 存储 100 个密码。
- 密码大小限于 48 KB。
- Codespaces 机密不会传递给分叉。