连接云服务
- 层级:免费版、高级版、旗舰版
- 提供方案:GitLab.com、GitLab 自托管、GitLab 专属版
CI_JOB_JWT 和 CI_JOB_JWT_V2 在 GitLab 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: 执行操作
- 在云中创建一个 OIDC 身份提供商(例如 AWS、Azure、GCP、Vault)。
- 在云服务中创建一个条件角色,该角色可筛选到特定的组、项目、分支或标签。
- CI/CD 作业包含一个 ID token,它是一个 JWT token。您可以使用此 token 向云 API 进行授权。
- 云服务验证该 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 授权
要连接您的云服务提供商,请参阅以下教程: