部署令牌
- Tier: Free, Premium, Ultimate
- Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
部署令牌提供对 GitLab 资源的安全访问,而无需将权限绑定到单个用户账户。您可以将它们与 Git 操作、容器注册表和包注册表一起使用,为部署自动化提供精确所需的访问权限。
使用部署令牌,您可以获得:
- 通过从自动化系统中移除个人凭据,实现更安全的部署
- 为每个令牌提供特定权限的细粒度访问控制
- 使用内置认证变量简化 CI/CD 管道
- 可靠的部署流程,不会因团队成员变动而中断
- 通过专用令牌身份跟踪部署,提供更好的审计跟踪
- 与外部构建系统和部署工具的无缝集成
部署令牌是一对值:
- 用户名:HTTP 认证框架中的
username。默认用户名格式为gitlab+deploy-token-{n}。创建部署令牌时,您可以指定自定义用户名。 - 令牌:HTTP 认证框架中的
password。
部署令牌不支持 SSH 认证。
您可以将部署令牌用于对以下端点的 HTTP 认证:
- GitLab 包注册表公共 API。
- Git 命令。
- GitLab 虚拟注册表包操作。
您可以在项目级别或组级别创建部署令牌:
- 项目部署令牌:权限仅适用于项目。
- 组部署令牌:权限适用于组中的所有项目。
默认情况下,部署令牌不会过期。创建时,您可以可选地设置过期日期。过期时间在该日期的 UTC 午夜发生。
如果启用了 外部授权,您不能使用新的或现有的部署令牌进行 Git 操作和包注册表操作。
范围
部署令牌的范围决定了它可以执行的操作。
| 范围 | 描述 |
|---|---|
read_repository |
使用 git clone 对仓库进行只读访问。 |
read_registry |
对项目 容器注册表 中的镜像进行只读访问。 |
write_registry |
对项目的 容器注册表 进行写入(推送)访问。推送镜像需要同时具有读写权限。 |
read_virtual_registry |
如果项目是私有的且需要授权,则通过 依赖代理 授予对容器镜像的只读(拉取)访问权限。仅在依赖代理启用时可用。 |
write_virtual_registry |
如果项目是私有的且需要授权,则通过 依赖代理 授予对容器镜像的读取(拉取)、写入(推送)和删除权限。仅在依赖代理启用时可用。 |
read_package_registry |
对项目的包注册表进行只读访问。 |
write_package_registry |
对项目的包注册表进行写入访问。 |
GitLab 部署令牌
GitLab 部署令牌是一种特殊类型的部署令牌。如果您创建一个名为 gitlab-deploy-token 的部署令牌,该令牌会自动作为变量暴露给项目的 CI/CD 作业:
CI_DEPLOY_USER:用户名CI_DEPLOY_PASSWORD:令牌
例如,使用 GitLab 令牌登录到您的 GitLab 容器注册表:
echo "$CI_DEPLOY_PASSWORD" | docker login $CI_REGISTRY -u $CI_DEPLOY_USER --password-stdin在 GitLab 15.0 及更早版本中,gitlab-deploy-token 部署令牌的特殊处理不适用于组部署令牌。要使组部署令牌可用于 CI/CD 作业,请在 设置 > CI/CD > 变量 中将 CI_DEPLOY_USER 和 CI_DEPLOY_PASSWORD CI/CD 变量设置为组部署令牌的名称和令牌。
当在组中定义 gitlab-deploy-token 时,CI_DEPLOY_USER 和 CI_DEPLOY_PASSWORD CI/CD 变量仅对该组的直接子项目可用。
部署令牌过期
此功能的可用性由功能标志控制。 有关更多信息,请参阅历史记录。
部署令牌在您定义的日期的 UTC 00:00 过期。
GitLab 每天在 UTC 01:00 检查即将过期的部署令牌。 项目所有者和维护者会在这些令牌过期前 60、30 和 7 天收到电子邮件通知。
这些电子邮件通知仅对活动(未撤销)的部署令牌在每个间隔发送一次。
GitLab 部署令牌安全性
GitLab 部署令牌是长期有效的,这使得它们对攻击者具有吸引力。
为防止部署令牌泄露,您还应配置您的 运行器 以确保安全:
- 如果机器被重复使用,避免使用 Docker
privileged模式。 - 当作业在同一台机器上运行时,避免使用
shell执行器。
不安全的 GitLab Runner 配置会增加有人可以从其他作业中窃取令牌的风险。
GitLab 公共 API
部署令牌不能与 GitLab 公共 API 一起使用。但是,您可以将部署令牌与某些端点一起使用,例如包注册表中的端点。您可以通过 URL 中包含字符串 packages/<format> 来识别端点属于包注册表。例如:https://gitlab.example.com/api/v4/projects/24/packages/generic/my_package/0.0.1/file.txt。有关更多信息,请参阅 使用注册表进行认证。
创建部署令牌
创建部署令牌以可以独立于用户账户运行的自动化部署任务。
先决条件:
- 要创建组部署令牌,您必须拥有该组的所有者角色。
- 要创建项目部署令牌,您必须拥有该项目的至少维护者角色。
- 在左侧边栏,选择 搜索或转到 并找到您的项目或组。
- 选择 设置 > 仓库。
- 展开 部署令牌。
- 选择 添加令牌。
- 完成字段,并选择所需的 范围。
- 选择 创建部署令牌。
记录部署令牌的值。离开或刷新页面后,您将无法再次访问它。
撤销部署令牌
当令牌不再需要时,请撤销它。
先决条件:
- 要撤销组部署令牌,您必须拥有该组的所有者角色。
- 要撤销项目部署令牌,您必须拥有该项目的至少维护者角色。
要撤销部署令牌:
- 在左侧边栏,选择 搜索或转到 并找到您的项目或组。
- 选择 设置 > 仓库。
- 展开 部署令牌。
- 在 活动部署令牌 部分,在要撤销的令牌旁边,选择 撤销。
克隆仓库
您可以使用部署令牌克隆仓库。
先决条件:
- 具有
read_repository范围的部署令牌。
使用部署令牌克隆仓库的示例:
git clone https://<username>:<deploy_token>@gitlab.example.com/tanuki/awesome_project.git从容器注册表拉取镜像
您可以使用部署令牌从容器注册表拉取镜像。
先决条件:
- 具有
read_registry范围的部署令牌。
使用部署令牌从容器注册表拉取镜像的示例:
echo "$DEPLOY_TOKEN" | docker login -u <username> --password-stdin registry.example.com
docker pull $CONTAINER_TEST_IMAGE向容器注册表推送镜像
您可以使用部署令牌向容器注册表推送镜像。
先决条件:
- 具有
read_registry和write_registry范围的部署令牌。
使用部署令牌向容器注册表推送镜像的示例:
echo "$DEPLOY_TOKEN" | docker login -u <username> --password-stdin registry.example.com
docker push $CONTAINER_TEST_IMAGE从包注册表拉取包
您可以使用部署令牌从包注册表拉取包。
先决条件:
- 具有
read_package_registry范围的部署令牌。
对于您选择的 包类型,请遵循部署令牌的认证说明。
从 GitLab 注册表安装 NuGet 包的示例:
nuget source Add -Name GitLab -Source "https://gitlab.example.com/api/v4/projects/10/packages/nuget/index.json" -UserName <username> -Password <deploy_token>
nuget install mypkg.nupkg向包注册表推送包
您可以使用部署令牌向 GitLab 包注册表推送包。
先决条件:
- 具有
write_package_registry范围的部署令牌。
对于您选择的 包类型,请遵循部署令牌的认证说明。
向包注册表发布 NuGet 包的示例:
nuget source Add -Name GitLab -Source "https://gitlab.example.com/api/v4/projects/10/packages/nuget/index.json" -UserName <username> -Password <deploy_token>
nuget push mypkg.nupkg -Source GitLab从依赖代理拉取镜像
您可以使用部署令牌从依赖代理拉取镜像。
先决条件:
- 具有
read_registry和write_registry范围的部署令牌。
遵循依赖代理 认证说明。