如何为私有本地Gitlab配置Workload Identity Federation?含版本适配疑问
一、仅VPN可访问的私有GitLab配置Workload Identity Federation的方案
GCP要求身份提供商的OIDC元数据和JWKs端点必须公开可访问,针对你的私有GitLab只能通过VPN访问的场景,有两种可行方案:
部署公网反向代理服务
在公网可访问的服务器上搭建反向代理,仅转发GitLab的/.well-known/openid-configuration(OIDC元数据)和/oauth/discovery/keys(JWKs)端点请求,代理服务器通过VPN访问你的私有GitLab。这样GCP就能通过公网代理获取到所需的OIDC配置,GitLab的其他接口仍保持私有访问限制。
部署时要确保代理服务的稳定性,同时添加必要的访问控制,防止无关请求干扰。手动配置OIDC提供商信息
若无法部署公网代理,可手动提取GitLab的OIDC元数据和JWKs内容,在GCP创建Workload Identity Provider时跳过自动发现流程,手动填入以下关键信息:- 从GitLab的OIDC元数据中提取
issuer字段值(格式通常为https://你的私有GitLab域名) - 将JWKs中的公钥内容手动添加到GCP的身份提供商配置里
这种方式的缺点是,当GitLab进行密钥轮换更新JWKs时,需要手动同步到GCP,否则会导致身份验证失败,需要定期维护。
- 从GitLab的OIDC元数据中提取
二、GitLab v14.0获取合规JWT令牌的替代方案
GitLab v14.0确实未引入CI_JOB_JWT_V2变量,该变量是在v14.3版本才正式支持的,但并非只能通过升级版本解决:
自定义生成符合要求的JWT令牌
在GitLab CI流水线中,利用内置的CI变量(如CI_JOB_ID、CI_PROJECT_ID、CI_PROJECT_PATH等)填充JWT所需的声明字段,然后使用GitLab的签名密钥(可通过JWKs端点获取对应的公钥,或在项目CI变量中存储专用签名密钥)生成合规的JWT。
生成的JWT必须包含Workload Identity Federation要求的核心声明,比如iss(签发者,需与GCP IdP配置的issuer一致)、sub(主体,可设为CI作业的唯一标识)、aud(受众,需指定为GCP的Workload Identity Provider的受众值),且签名算法要与GCP侧配置匹配。升级GitLab版本
如果自定义生成JWT的开发和维护成本过高,或者需要长期保障兼容性,升级到v14.3及以上版本是更省心的选择,直接使用官方提供的CI_JOB_JWT_V2变量即可满足需求,无需额外开发。
内容的提问来源于stack exchange,提问作者Krisztian

