OpenID Connect (OIDC) 概述
GitHub Actions 工作流通常设计为访问云提供商(如 AWS、Azure、GCP、HashiCorp Vault 等),以部署软件或使用云服务。 在工作流程可以访问这些资源之前,它将向云提供商提供凭据(如密码或令牌)。 这些凭据通常作为机密存储在 GitHub 中,工作流程在每次运行时都会将此机密呈现给云提供商。
但是,使用硬编码的机密需要在云提供商中创建凭据,然后在 GitHub 中将其复制为机密。
与支持 OIDC 的云提供商建立信任连接后,可以将工作流配置为直接从云提供商请求短期访问令牌。
使用 OIDC 的好处
通过更新工作流程以使用 OIDC 令牌,您可以采用以下良好的安全实践:
-
**无云机密:** 无需将云凭据复制为长期有效的 GitHub 机密。 相反,您可以在云提供商上配置 OIDC 信任,然后更新您的工作流程,通过 OIDC 向云提供商请求短期访问令牌。 -
**身份验证和授权管理:** 可以更精细地控制工作流使用凭据的方式,使用云提供商的身份验证 (authN) 和授权 (authZ) 工具来控制对云资源的访问。 -
**轮换凭据:** 借助 OIDC,云提供商会颁发一个仅对单个作业有效的短期访问令牌,然后自动过期。
OIDC 如何与 GitHub Actions 集成
下图概述了 GitHub 的 OIDC 提供商如何与你的工作流和云提供商集成:

- 你在云提供商中建立 OIDC 信任关系,允许特定的 GitHub 工作流代表定义的云角色请求云访问令牌。
- 每次作业运行时,GitHub 的 OIDC 提供商都会自动生成一个 OIDC 令牌。 此令牌包含多个声明,用于建立有关尝试进行身份验证的特定工作流程的经安全强化且可验证的身份。
- 工作流作业中的某个步骤或操作可以请求来自 GitHub 的 OIDC 提供商的令牌,然后将该令牌提交给云提供商以证明工作流的标识。
- 云提供商成功验证令牌中提供的声明后,将提供仅在作业期间可用的短期云访问令牌。
了解 OIDC 令牌
每个作业都从 GitHub 的 OIDC 提供商请求一个 OIDC 令牌,提供商使用自动生成的 JSON Web 令牌 (JWT) 进行响应,该令牌对于生成它的每个工作流程作业都是唯一的。 当作业运行时,OIDC 令牌将呈现给云提供商。 要验证令牌,云提供商会检查 OIDC 令牌的主题和其他声明是否与云角色的 OIDC 信任定义上预配置的条件匹配。
以下示例 OIDC 令牌使用主题 (sub),该主题引用 octo-org/octo-repo 存储库中名为 prod 的作业环境。
{
"typ": "JWT",
"alg": "RS256",
"x5t": "example-thumbprint",
"kid": "example-key-id"
}
{
"jti": "example-id",
"sub": "repo:octo-org/octo-repo:environment:prod",
"environment": "prod",
"aud": "https://HOSTNAME/octo-org",
"ref": "refs/heads/main",
"sha": "example-sha",
"repository": "octo-org/octo-repo",
"repository_owner": "octo-org",
"actor_id": "12",
"repository_visibility": "private",
"repository_id": "74",
"repository_owner_id": "65",
"run_id": "example-run-id",
"run_number": "10",
"run_attempt": "2",
"runner_environment": "github-hosted",
"actor": "octocat",
"workflow": "example-workflow",
"head_ref": "",
"base_ref": "",
"event_name": "workflow_dispatch",
"enterprise": "avocado-corp",
"enterprise_id": "2",
"ref_type": "branch",
"job_workflow_ref": "octo-org/octo-automation/.github/workflows/oidc.yml@refs/heads/main",
"iss": "https://HOSTNAME/_services/token",
"nbf": 1632492967,
"exp": 1632493867,
"iat": 1632493567
}
使用 OIDC 对自定义操作进行身份验证
自定义操作通过 Actions 工具包中的 getIDToken() 方法或 curl 命令使用 OIDC 进行身份验证。
有关详细信息,请参阅“OpenID Connect 参考”。
更新 OIDC 的工作流程
GitHub Actions 工作流可以使用 OIDC 令牌而非机密来向云提供商进行身份验证。 许多主流云提供商都提供官方登录操作,可简化在工作流中使用 OIDC 的流程。 有关针对特定云提供商更新工作流的详细信息,请参阅 安全强化您的部署。
对 Dependabot 的 OIDC 支持
Dependabot 可以使用 OIDC 对私有注册表进行身份验证,从而无需将长效凭据存储为库秘密。 通过基于 OIDC 的身份验证,Dependabot 更新作业可以从你的云标识提供者那里动态获取短期凭证。
当注册表托管在 AWS CodeArtifact、Azure DevOps Artifacts 或 JFrog Artifactory 上时,Dependabot 支持对任何使用 username 和 password 身份验证的注册表类型进行 OIDC 身份验证。
Dependabot 的 OIDC 认证的优点包括:
-
**增强的安全性:** 消除存储库中的静态长期凭据。 -
**更简单的管理:** 启用对专用注册表的安全、符合策略的访问。 -
**避免速率限制:** 动态凭据有助于避免达到与静态令牌关联的速率限制。
有关详细信息,请参阅“为 Dependabot 配置对专用注册表的访问权限”。
后续步骤
有关配置 OIDC 的详细信息,请参阅 安全强化您的部署。
有关 OIDC 的参考信息,请参阅 OpenID Connect 参考。