用户与权限管理
GitLab 权限围绕 User → Group → Project 组织。运维需与研发约定命名规范、默认角色和 Token 生命周期,避免「人人 Owner」或长期不过期的 Personal Access Token。
1. 用户体系
- User:个人账号,全局唯一 username(@root 为内置管理员);
- Group:团队/部门容器,可嵌套子 Group;
- Project:代码仓库与 CI 的最小权限单元,属于某个 Group 或 User 命名空间;
- Namespace:
group-name或username,决定 URL 路径gitlab.example.com/group-name/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:敏感变量勾选 Masked、Protected;
- 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 |
| Developer | push 非保护分支、跑 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 requests 与 Rate 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_repository、api、write_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 → Users 可 LDAP Sync 批量导入。首次建议 verify_authorship: false,在测试 Group 验证登录与组映射后再全量。
OAuth(GitHub/Google)在 Settings → General → Sign-in restrictions 配置,与 LDAP 可并存但需明确主身份源。
运维检查清单:
- 公开注册已关闭或需 Admin 审批;
- 无长期 Owner 角色的临时账号;
- PAT/Deploy Token 有过期日且 scope 最小化;
main已保护且 Pipeline 必过;- LDAP 同步与离职吊销流程已文档化。
下一章:GitLab Runner 管理。