跳到主要内容

用户与权限管理

GitLab 权限围绕 User → Group → Project 组织。运维需与研发约定命名规范、默认角色和 Token 生命周期,避免「人人 Owner」或长期不过期的 Personal Access Token。

1. 用户体系

  • User:个人账号,全局唯一 username(@root 为内置管理员);
  • Group:团队/部门容器,可嵌套子 Group;
  • Project:代码仓库与 CI 的最小权限单元,属于某个 Group 或 User 命名空间;
  • Namespacegroup-nameusername,决定 URL 路径 gitlab.example.com/group-name/project

GitLab Group、Subgroup 与 Project 权限继承关系

用户加入上层 Group 后,成员身份和角色默认向下继承到 Subgroup 与 Project。如果在下层单独授权,实际权限以用户在该资源上获得的最高角色为准。

Admin Area(Admin → Overview)仅 Administrator 可见,用于实例级设置、用户审批、Runner、License。

2. 用户创建与管理

2.1 Web 创建

Admin Area → Overview → Users → New user,填写 Name、Username、Email。可勾选 Administrator(仅给运维核心人员)。

2.2 命令行创建

sudo gitlab-rails console -e production
u = User.new(name: 'Zhang San', username: 'zhangsan', email: 'zhangsan@example.com', password: 'TempPassw0rd!Change', password_confirmation: 'TempPassw0rd!Change')
u.skip_confirmation!
u.save!

2.3 禁用与删除

Admin → Users → 选择用户 → Block(保留贡献记录)或 Delete(需确认数据归属)。

# console 中 block
User.find_by_username('zhangsan').block
注意

删除用户不会自动删除其 Personal Project 中的代码;先迁移仓库 Owner 再删账号。

3. Group

Group 用于统一成员与 Runner、共享 CI 变量、合规策略。

创建:Groups → Create group,设置 Visibility

级别说明
Private仅成员可见
Internal登录用户可见(需开启 internal visibility)
Public未登录可读(谨慎)

Group → Members 邀请用户并分配 Group 角色(继承到子 Group 与 Project,除非 Project 单独改成员)。

推荐:按部门建顶级 Group,应用建 Project;CI 变量在 Group 级配置 PROD_*,Project 级配置应用专用变量。

4. Project

New project → Create blank project,选择 Namespace(Group),初始化 README 可选。

关键设置:

  • Settings → General → Visibility:Private 为默认推荐;
  • Settings → Repository → Protected branches:保护 main,MR 才能合并;
  • Settings → CI/CD → Variables:敏感变量勾选 MaskedProtected
  • Settings → Merge requests:Approvals、Merge only if pipeline succeeds。

转移 Project:Settings → General → Advanced → Transfer project

5. 角色权限模型

Project/Group 成员角色从低到高:

角色典型权限
Guest读 Issue、看 Wiki,无代码 push
Reporter读代码、CI 结果、下载 Artifact
Developerpush 非保护分支、跑 Pipeline、创建 MR
Maintainer管理分支保护、CI 变量、部分 Settings
Owner删除 Project、管理成员、转移项目

Minimal Access(EE)与 Custom Role(EE)可进一步细粒度限制。

Protected Branch 规则(Settings → Repository):

Branch: main
Allowed to merge: Maintainers
Allowed to push: No one
Allowed to force push: 否
提示

生产 main 应对 Developer 禁止直接 push,仅通过 MR + Pipeline 成功 + Code Review 合并。

6. SSH Key

用户 Preferences → SSH Keys 添加公钥,用于 git@gitlab.example.com

ssh-keygen -t ed25519 -C "zhangsan@example.com" -f ~/.ssh/id_ed25519_gitlab
cat ~/.ssh/id_ed25519_gitlab.pub # 粘贴到 GitLab
ssh -T git@gitlab.example.com

实例级 Admin → Settings → Network → Outbound requestsRate limits 可限制 API/SSH 滥用。

Deploy Key(Project → Settings → Repository → Deploy keys):只读/读写单个仓库,适合发布服务器 pull,不要与用户 Key 混用。

7. Access Token

7.1 Personal Access Token (PAT)

Preferences → Access Tokens,勾选 read_repositoryapiwrite_registry 等最小 scope,设置过期日。

export GITLAB_TOKEN="glpat-xxxxxxxxxxxx"
curl --header "PRIVATE-TOKEN: $GITLAB_TOKEN" \
"https://gitlab.example.com/api/v4/user"

7.2 Project / Group Access Token

在 Project/Group Settings → Access Tokens 创建,归属 bot 用户,便于轮换和审计。

7.3 CI Job Token

Pipeline 内 CI_JOB_TOKEN 可访问同源 GitLab 部分 API;通过 CI/CD → Token Access 限制可访问项目,防止横向移动。

7.4 Deploy Token

只读/读写 Registry 或 Repository,无 UI 登录:

Settings → Repository → Deploy tokens,用于 docker login 或 CI 拉私有依赖。

注意

Token 等同于密码;禁止写入公开仓库。离职流程必须吊销 PAT、Group Token 和 Deploy Key。

8. LDAP/AD集成

企业统一账号通过 Admin Area → Settings → General → LDAP 配置(CE 支持 LDAP,部分高级组同步为 EE)。

gitlab.rb 示例片段:

gitlab_rails['ldap_enabled'] = true
gitlab_rails['ldap_servers'] = {
'main' => {
'label' => 'Company LDAP',
'host' => 'ldap.example.com',
'port' => 636,
'uid' => 'sAMAccountName',
'encryption' => 'simple_tls',
'bind_dn' => 'CN=gitlab-bind,OU=Service,DC=example,DC=com',
'password' => '绑定账号密码',
'base' => 'DC=example,DC=com',
'user_filter' => '(memberOf=CN=GitLabUsers,OU=Groups,DC=example,DC=com)',
}
}
sudo gitlab-ctl reconfigure
sudo gitlab-rake gitlab:ldap:check

Admin → UsersLDAP Sync 批量导入。首次建议 verify_authorship: false,在测试 Group 验证登录与组映射后再全量。

OAuth(GitHub/Google)在 Settings → General → Sign-in restrictions 配置,与 LDAP 可并存但需明确主身份源。


运维检查清单

  1. 公开注册已关闭或需 Admin 审批;
  2. 无长期 Owner 角色的临时账号;
  3. PAT/Deploy Token 有过期日且 scope 最小化;
  4. main 已保护且 Pipeline 必过;
  5. LDAP 同步与离职吊销流程已文档化。

下一章:GitLab Runner 管理