Skip to main content

此版本的 GitHub Enterprise Server 将于以下日期停止服务 2025-08-27. 即使针对重大安全问题,也不会发布补丁。 为了获得更好的性能、更高的安全性和新功能,请升级到最新版本的 GitHub Enterprise。 如需升级帮助,请联系 GitHub Enterprise 支持

OpenID Connect

OpenID Connect 允许您的工作流程直接从云提供商交换短期令牌。

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 提供商如何与你的工作流和云提供商集成:

显示云提供商如何通过访问令牌和 JSON Web 令牌云角色 ID 与 GitHub Actions 集成的示意图。

  1. 你在云提供商中建立 OIDC 信任关系,允许特定的 GitHub 工作流代表定义的云角色请求云访问令牌。
  2. 每次作业运行时,GitHub 的 OIDC 提供商都会自动生成一个 OIDC 令牌。 此令牌包含多个声明,用于建立有关尝试进行身份验证的特定工作流程的经安全强化且可验证的身份。
  3. 工作流作业中的某个步骤或操作可以请求来自 GitHub 的 OIDC 提供商的令牌,然后将该令牌提交给云提供商以证明工作流的标识。
  4. 云提供商成功验证令牌中提供的声明后,将提供仅在作业期间可用的短期云访问令牌。

了解 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 的流程。 有关针对特定云提供商更新工作流的详细信息,请参阅 安全强化您的部署

后续步骤

有关配置 OIDC 的详细信息,请参阅 安全强化您的部署

有关 OIDC 的参考信息,请参阅 OpenID Connect 参考