Help us learn about your current experience with the documentation. Take the survey.

连接云服务

  • 层级:免费版、高级版、旗舰版
  • 提供方案:GitLab.com、GitLab 自托管、GitLab 专属版

CI_JOB_JWTCI_JOB_JWT_V2GitLab 15.9 中已弃用,并计划在 GitLab 17.0 中移除。请改用 ID tokens

GitLab CI/CD 支持 OpenID Connect (OIDC),以便为您的构建和部署作业提供访问云凭据和服务的权限。 过去,团队通常将密钥存储在项目中,或在 GitLab Runner 实例上应用权限来进行构建和部署。支持 OIDC 的 ID tokens 可在 CI/CD 作业中进行配置,使您能够采用可扩展的、最小权限的安全策略。

在 GitLab 15.6 及更早版本中,您必须使用 CI_JOB_JWT_V2 而不是 ID token,但它不可自定义。

前置条件

  • 拥有 GitLab 账户。
  • 能够访问支持 OIDC 的云服务提供商,以配置授权和创建角色。

ID tokens 支持以下支持 OIDC 的云服务提供商:

  • AWS
  • Azure
  • GCP
  • HashiCorp Vault

配置 OIDC 后,所有流水线都可以使用 JWT token 访问目标环境。 当您为流水线配置 OIDC 时,您应该完成该流水线的软件供应链安全审查,重点关注新增的访问权限。有关供应链攻击的更多信息,请参阅 DevOps 平台如何帮助防范供应链攻击

使用场景

  • 无需在您的 GitLab 组或项目中存储密钥。可以通过 OIDC 从您的云服务提供商获取临时凭据。
  • 通过精细的 GitLab 条件(包括组、项目、分支或标签)提供对云资源的临时访问权限。
  • 使您能够在 CI/CD 作业中定义职责分离,并实现对环境的条件访问。过去,应用程序可能使用专用的 GitLab Runner 进行部署,该 Runner 仅能访问暂存或生产环境。这导致了 Runner 的泛滥,因为每台机器都有独立的权限。
  • 允许实例 Runner 安全地访问多个云账户。访问权限由 JWT token 决定,该 token 特定于运行流水线的用户。
  • 默认情况下通过获取临时凭据,消除了创建密钥轮换逻辑的必要性。

云服务的 ID token 认证

每个作业都可以配置 ID tokens,它作为包含 token payload 的 CI/CD 变量提供。这些 JWT 可用于向支持 OIDC 的云服务提供商(如 AWS、Azure、GCP 或 Vault)进行身份验证。

授权工作流

%%{init: { "fontFamily": "GitLab Sans" }}%%
sequenceDiagram
accTitle: 授权工作流
accDescr: GitLab 与云服务提供商之间授权请求的流程。

    participant GitLab
    Note right of Cloud: 创建 OIDC 身份提供商
    Note right of Cloud: 创建带条件的角色
    Note left of GitLab: 带有 ID token 的 CI/CD 作业
    GitLab->>+Cloud: 使用 ID token 调用云 API
    Note right of Cloud: 使用公钥解码并验证 JWT (https://gitlab.com/oauth/discovery/keys)
    Note right of Cloud: 验证 OIDC 中定义的受众
    Note right of Cloud: 验证条件角色 (sub, aud)
    Note right of Cloud: 生成凭据或获取密钥
    Cloud->>GitLab: 返回临时凭据
    Note left of GitLab: 执行操作
  1. 在云中创建一个 OIDC 身份提供商(例如 AWS、Azure、GCP、Vault)。
  2. 在云服务中创建一个条件角色,该角色可筛选到特定的组、项目、分支或标签。
  3. CI/CD 作业包含一个 ID token,它是一个 JWT token。您可以使用此 token 向云 API 进行授权。
  4. 云服务验证该 token,从负载中验证条件角色,然后返回一个临时凭据。

使用 OIDC 声明配置条件角色

要配置 GitLab 和 OIDC 之间的信任关系,您必须在云服务提供商中创建一个检查 JWT 的条件角色。 该条件会根据 JWT 进行验证,以专门针对两个声明(受众和主题)建立信任关系。

  • 受众或 aud:作为 ID token 的一部分进行配置:

    job_needing_oidc_auth:
      id_tokens:
        OIDC_TOKEN:
          aud: https://oidc.provider.com
      script:
        - echo $OIDC_TOKEN
  • 主题或 sub:一个描述 GitLab CI/CD 工作流(包括组、项目、分支和标签)的元数据串联。sub 字段的格式如下:

    • project_path:{group}/{project}:ref_type:{type}:ref:{branch_name}
筛选类型 示例
筛选到任意分支 支持通配符。project_path:mygroup/myproject:ref_type:branch:ref:*
筛选到特定项目的主分支 project_path:mygroup/myproject:ref_type:branch:ref:main
筛选到组下的所有项目 支持通配符。project_path:mygroup/*:ref_type:branch:ref:main
筛选到 Git 标签 支持通配符。project_path:mygroup/*:ref_type:tag:ref:1.0

与您的云服务提供商进行 OIDC 授权

要连接您的云服务提供商,请参阅以下教程: