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://github.com/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://token.actions.githubusercontent.com",
"nbf": 1632492967,
"exp": 1632493867,
"iat": 1632493567
}
与云提供商建立 OIDC 信任关系
要在工作流中使用 OIDC,需要在 GitHub 与你的云提供商之间建立信任关系。 这种信任关系可确保只有经过授权的工作流才能请求你的云资源的访问令牌。
在授予访问令牌之前,云提供商会检查用于在其信任设置中设置条件的 subject
和任何其他声明是否与请求的 JSON Web 令牌 (JWT) 中的声明匹配。 如果信任配置匹配,你的云提供商将向工作流颁发临时访问令牌。
有关为云提供商配置 OIDC 信任和设置条件的步骤及语法,请参阅 OpenID Connect 参考。
在 GHE.com
上配置 OIDC
如果你属于使用 具有数据驻留的 GitHub Enterprise Cloud 的企业,并且你要在 GHE.com 上设置 OIDC,那么在配置 OIDC 时需要替换一些值。****
有关详细信息,请参阅“OpenID Connect 参考”。
使用 OIDC 对自定义操作进行身份验证
自定义操作通过 Actions 工具包中的 getIDToken()
方法或 curl
命令使用 OIDC 进行身份验证。
有关详细信息,请参阅“OpenID Connect 参考”。
更新 OIDC 的工作流程
GitHub Actions 工作流可以使用 OIDC 令牌而非机密来向云提供商进行身份验证。 许多主流云提供商都提供官方登录操作,可简化在工作流中使用 OIDC 的流程。 有关针对特定云提供商更新工作流的详细信息,请参阅 安全强化您的部署。
后续步骤
有关配置 OIDC 的详细信息,请参阅 安全强化您的部署。
有关 OIDC 的参考信息,请参阅 OpenID Connect 参考。