Rocky Linux 10 搭建 GitLab Runner,并接入已集成 LDAP 与 CAS 的 GitLab
GitLab Runner 是 GitLab CI/CD 的作业执行器。它从 GitLab 获取 Pipeline Job,在 Shell、Docker、Kubernetes 或其他 Executor 中执行脚本,再把日志、状态和制品返回 GitLab。
用户经常提出“让 GitLab Runner 集成 LDAP 和 CAS”,但这里需要先澄清产品边界:
GitLab Runner 没有人类用户登录页面,也不会验证 LDAP 用户密码或 CAS 会话。LDAP 和 CAS 集成发生在 GitLab Server;Runner 使用以
glrt-开头的 Runner Authentication Token 与 GitLab 进行机器到机器认证。
正确架构:
1 | |
因此本文标题中的“集成 LDAP+CAS”实际含义是:
- GitLab 已接入 OpenLDAP 和 CAS SAML/OIDC;
- LDAP/CAS 用户按 GitLab 权限创建和管理 Runner;
- Runner 使用专用 Token 注册;
- Pipeline 权限继承 GitLab 项目、分支、环境和 Token 策略;
- Runner 本身不保存人员 LDAP 密码和 CAS Cookie。
一、整体架构
| 组件 | 地址 | 说明 |
|---|---|---|
| GitLab | https://gitlab.example.com |
已接入 LDAP/CAS |
| GitLab Runner | runner01.example.com |
Rocky Linux 10 |
| OpenLDAP | ldaps://ldap.example.com:636 |
用户主数据 |
| CAS | https://sso.example.com/cas |
人员 SSO |
| Container Registry | registry.example.com 或 GitLab Registry |
构建镜像 |
flowchart LR
User[开发者/管理员] -->|CAS SSO| GitLab[GitLab]
GitLab -->|LDAP Identity| LDAP[OpenLDAP]
CAS[CAS] -->|LDAP Bind| LDAP
Runner[GitLab Runner] -->|glrt Token| GitLab
GitLab -->|Job Request| Runner
Runner -->|CI_JOB_TOKEN| Repo[Git Repository]
Runner -->|CI Variables| Registry[Container/Package Registry]
身份与授权边界:
| 对象 | 认证方式 | 权限来源 |
|---|---|---|
| 开发者 | CAS/LDAP | GitLab Group/Project Role |
| GitLab Admin | CAS/LDAP 或本地应急账号 | Instance Admin |
| Runner Manager | glrt- Token |
Runner Scope/配置 |
| CI Job | CI_JOB_TOKEN、Deploy Token、OIDC |
Project/Job Policy |
| Docker Registry | Job Token/Robot/Deploy Token | Registry Project Policy |
二、Runner Scope 设计
GitLab Runner 可以是:
| 类型 | 作用范围 |
|---|---|
| Instance Runner | 整个 GitLab Instance |
| Group Runner | 一个 Group 及其子组/项目 |
| Project Runner | 单个 Project |
推荐优先级:
1 | |
不要用一个拥有特权 Docker 权限的 Instance Runner 执行全公司的不可信代码。
2.1 LDAP/CAS 用户如何管理 Runner
人员先通过 CAS 登录 GitLab,再由 GitLab Role 决定是否可以:
- 创建 Instance Runner;
- 创建 Group Runner;
- 创建 Project Runner;
- 查看 Runner Token;
- 暂停、删除和轮换 Runner;
- 修改 Protected、Tags 和 Access Level。
CAS 只认证“是谁”,不会直接赋予 Runner 管理权限。
三、资源规划
3.1 Docker Executor
| 并发 | CPU | 内存 | 数据盘 |
|---|---|---|---|
| 1~2 | 4 核 | 8 GB | 100 GB SSD |
| 4~8 | 8~16 核 | 16~32 GB | 300 GB 以上 SSD |
| 8 以上 | 按 Job 压测 | 64 GB 以上 | NVMe/独立缓存盘 |
容量受以下因素影响:
- Docker Image Layer;
- BuildKit Cache;
- Maven/npm/Gradle Cache;
- Artifacts;
- 并行容器;
- 测试报告;
- DinD;
- 日志。
3.2 Shell Executor
Shell Executor 直接在宿主机执行 CI 脚本,隔离性很弱。它适合:
- 受控仓库;
- 专用构建机;
- iOS/硬件/特殊工具链;
- 不运行 Fork/MR 中不可信代码。
不要在装有生产 SSH Key、数据库密码或管理员 Kubeconfig 的机器上运行开放项目 Shell Runner。
四、Rocky Linux 10 初始化
1 | |
1 | |
1 | |
1 | |
Runner 通常只需出站访问 GitLab 和 Registry,不需要开放公网入站端口。
五、安装 GitLab Runner
5.1 添加官方仓库
1 | |
检查:
1 | |
查看版本:
1 | |
安装:
1 | |
检查:
1 | |
推荐 GitLab Runner 与 GitLab Server 保持相近的 Major/Minor 版本,并按 GitLab 兼容策略升级。
5.2 主要文件
| 路径 | 用途 |
|---|---|
/etc/gitlab-runner/config.toml |
Runner 配置和 Token |
/etc/gitlab-runner/certs |
私有 CA |
/home/gitlab-runner |
Runner 用户 Home |
/var/log/Journal |
服务日志 |
config.toml 包含敏感 Runner Token:
1 | |
实际包可能将文件所有者设为 Root/Runner,保证只有服务和管理员可读即可。
六、信任 GitLab HTTPS 证书
GitLab 使用企业 CA 时,将 CA 安装到系统:
1 | |
Runner 专用路径:
1 | |
验证:
1 | |
不要使用:
1 | |
长期绕过证书校验。
七、在 GitLab 创建 Runner
使用 CAS 登录 GitLab,然后按作用域进入:
1 | |
创建 Runner 时设置:
- Description;
- Tags;
- Run Untagged;
- Protected;
- Lock to current Project;
- Maximum Job Timeout;
- Maintenance Note。
创建后得到:
1 | |
这是 Runner Authentication Token,不是人员 Token,也不是 LDAP/CAS Token。
不要使用已弃用的 Legacy Registration Token 工作流。
八、注册 Shell Runner
1 | |
1 | |
清理环境变量:
1 | |
检查:
1 | |
Shell Runner 的 Tags、Protected、Locked 等应优先在 GitLab 创建 Runner 时配置。
8.1 Shell Runner 最小权限
Runner 使用:
1 | |
用户执行 Job。不要无条件配置:
1 | |
需要构建命令时:
- 安装到固定目录;
- 通过 Toolchain 管理;
- 必要 Sudo 精确到命令;
- 不允许覆盖 systemd、SSH、Firewall;
- 不保存生产密钥。
九、安装 Docker Engine
Docker Executor 需要 Docker:
1 | |
1 | |
9.1 Docker 权限风险
将 Runner 加入 Docker Group:
1 | |
意味着 Runner Job 基本可以取得宿主机 Root 权限,例如挂载 / 或 Docker Socket。
因此:
- 使用专用 Runner Host;
- 不与生产服务混布;
- 只执行可信项目;
- Protected Runner 只跑 Protected Branch/Tag;
- 不允许公共 Fork 使用;
- 定期重建 Runner Host。
十、注册 Docker Runner
1 | |
1 | |
1 | |
查看 /etc/gitlab-runner/config.toml:
1 | |
验证配置:
1 | |
十一、Runner 配置调优
11.1 concurrent
全局:
1 | |
表示该 Runner Manager 同时执行的 Job 总数。
不要设置为 CPU 数的几十倍。Job 可能同时占用:
- CPU;
- 内存;
- Docker Layer;
- 网络;
- Maven/npm Cache;
- 测试容器;
- 数据库 Service。
11.2 request_concurrency
1 | |
控制 Runner 同时向 GitLab请求 Job 的 Long Poll 数量。Runner 数量和 Job 短时突发较大时可调整,但不要将其当成 Job 并发参数。
11.3 limit
单个 Runner:
1 | |
全局 concurrent 和单 Runner limit 共同限制。
11.4 output_limit
1 | |
单位通常为 KB,用于限制 Job Log,防止失控输出占满 GitLab 和网络。
11.5 Docker 资源限制
1 | |
实际语法以当前 Runner 版本文档为准。限制应结合 Job 类型。
11.6 Helper Image
使用私有 Registry 或离线环境时,需要同步 GitLab Runner Helper Image,并确保与 Runner 版本一致。不要随意固定一个跨版本 Helper Image。
十二、Docker Build 策略
12.1 Docker Socket
1 | |
这是高风险方案:Job 可以控制宿主机 Docker Daemon。
适合:
- 专用可信 Runner;
- Protected Project;
- 不运行外部 MR;
- 宿主机可随时重建。
12.2 Docker-in-Docker
.gitlab-ci.yml:
1 | |
DinD 常需要 privileged = true,同样有较大风险和额外 I/O。
12.3 BuildKit/Buildah/Kaniko
更安全的镜像构建可评估:
- Rootless BuildKit;
- Buildah;
- Podman;
- Kaniko;
- Kubernetes Executor 隔离 Pod。
没有一种方案自动安全,仍需控制 Build Context、Secret 和 Registry 权限。
十三、LDAP/CAS 权限如何传递到 Pipeline
用户通过 CAS 登录 GitLab,GitLab 已根据 LDAP/SAML Identity 知道用户身份。用户触发 Pipeline 后:
1 | |
Runner 不需要知道:
- 用户 LDAP 密码;
- CAS TGT;
- SAML Assertion;
- 用户浏览器 Cookie。
13.1 CI_JOB_TOKEN
Job 可使用:
1 | |
访问 GitLab 允许的资源。权限应通过 Job Token Scope 限制。
13.2 Protected Variables
生产 Secret:
- 标记 Protected;
- 标记 Masked/Hidden;
- 只在 Protected Branch/Tag;
- 使用 Environment Scope;
- 定期轮换;
- 优先 Vault/OIDC 短期凭证。
CAS 登录用户不应该因为是 Maintainer 就能在 Job Log 中看到生产密码。
十四、Runner 标签与权限隔离
推荐 Tags:
1 | |
.gitlab-ci.yml:
1 | |
生产 Runner:
- Protected;
- Locked;
- 不 Run Untagged;
- 只允许受控 Group/Project;
- 只执行 Protected Ref;
- 不运行 Fork MR。
十五、缓存
15.1 本地 Cache
1 | |
单机简单,但 Runner 重建后丢失,无法多节点共享。
15.2 S3/MinIO Cache
1 | |
Access Key/Secret 应通过安全配置注入。
15.3 Cache Key
1 | |
不要让所有项目共享固定 Key:
1 | |
否则会出现污染、越权和难以复现。
十六、npm/Maven/Docker 私服凭证
16.1 npm
1 | |
NPM_TOKEN 放在 Protected CI Variable。
16.2 Container Registry
GitLab Registry:
1 | |
Harbor:
1 | |
使用 Robot Account,不使用人员 CAS 密码。
十七、systemd 与服务监控
包安装后:
1 | |
1 | |
Override:
1 | |
1 | |
1 | |
检查:
1 | |
Runner 健康不仅是进程 Active,还应检查:
1 | |
以及 GitLab UI 中 Last Contact。
十八、Docker 与磁盘治理
1 | |
定期清理必须谨慎。可以清理超过一定时间且未使用的缓存:
1 | |
不要在 Job 运行期间执行全量:
1 | |
它可能删除仍需要的 Cache 和 Service Volume。
推荐:
- Docker Data Root 独立盘;
- SSD/NVMe;
- 监控 inode;
- 清理策略错峰;
- Runner Host 可重建;
- 基础镜像走私有 Proxy Cache。
十九、安全加固
19.1 Runner Token
glrt- Token 存储在:
1 | |
泄露后攻击者可能克隆 Runner Manager。措施:
chmod 0600;- 不提交 Git;
- 不输出日志;
- 定期 Rotate;
- Runner 删除后 Revoke;
- 主机入侵后立即轮换。
19.2 Executor 隔离
安全级别从弱到强并不是绝对,但通常:
1 | |
19.3 Untrusted Code
Fork/Merge Request 中的代码可以:
- 读取工作区;
- 探测网络;
- 消耗 CPU/磁盘;
- 尝试读取 Secret;
- 利用 Docker Socket;
- 污染 Cache。
因此外部 MR 不得运行在生产 Runner。
19.4 LDAP/CAS 不保护 Runner Host
人员使用 CAS 登录 GitLab,并不自动保护 Runner 宿主机。Runner Host 仍需:
- SSH Key/MFA;
- 管理网;
- Sudo 最小权限;
- OS Patch;
- EDR/审计;
- SELinux;
- 防火墙;
- 不与 GitLab Server 共机。
二十、备份与恢复
Runner 本身基本是可重建节点。备份重点:
1 | |
备份:
1 | |
备份文件包含 Token,必须加密。
更推荐通过 IaC 重建:
1 | |
二十一、升级
查看版本:
1 | |
升级:
1 | |
按 GitLab UI 暂停 Runner、等待 Job 完成后再升级,避免中断构建。
固定版本:
1 | |
确认 Runner Helper Image 与版本匹配。
二十二、常见故障
22.1 x509 unknown authority
1 | |
检查:
1 | |
更新后:
1 | |
22.2 Runner 注册 403
检查:
- Token 是否
glrt-; - Runner 是否已在 UI 创建;
- URL 是否正确;
- Token 是否被重置;
- GitLab 版本与 Runner 是否兼容;
- 代理是否修改请求。
22.3 Runner Offline
1 | |
检查时间、DNS、CA、Token、防火墙和代理。
22.4 Job 一直 Pending
检查:
- Tags 是否匹配;
- Runner 是否 Protected;
- Branch 是否 Protected;
- Runner 是否 Paused;
- Run Untagged;
- Scope;
- Maximum Timeout;
- 并发上限。
22.5 Docker permission denied
1 | |
加入 Docker Group 后必须重启 Runner 服务。
22.6 No space left on device
1 | |
可能是磁盘或 inode 用完。
22.7 Job 能读取不该读取的 Secret
检查:
- Variable 是否 Protected;
- Environment Scope;
- Runner 是否 Protected;
- MR Pipeline 来源;
- Fork;
- Job Log;
- Cache;
- Artifacts;
- Docker Socket。
22.8 LDAP/CAS 用户无法创建 Runner
这不是 Runner LDAP 问题。检查 GitLab:
- 用户是否正确关联 LDAP/SAML;
- 用户是否 Block;
- Group/Project Role;
- 是否有 Owner/Admin 权限;
- Runner 创建策略;
- Instance Setting。
二十三、生产检查清单
- 明确 Runner 不直接集成 LDAP/CAS;
- GitLab 已完成 LDAP/CAS 身份接入;
- Runner 使用
glrt-Authentication Token; - Legacy Registration Token 未继续使用;
- Runner Scope 最小化;
- Protected Runner 只跑 Protected Ref;
- Shell/Docker Socket 风险已评估;
- Runner Host 与生产服务隔离;
- GitLab 企业 CA 已安装;
-
config.toml权限受控; - Token 已进入轮换和撤销流程;
- CI Secret 使用 Protected/Masked/Environment Scope;
- 缓存 Key 隔离;
- Docker Data Root 容量已监控;
- Runner 版本与 GitLab 相近;
- 已验证重建 Runner 的自动化流程;
- 外部 MR 不进入可信生产 Runner。
二十四、总结
GitLab Runner 的正确身份关系:
1 | |
核心原则:
- Runner 没有 LDAP/CAS 登录能力,也不需要;
- 人员身份统一发生在 GitLab Server;
- Runner 是机器身份,使用可轮换的 Authentication Token;
- LDAP/CAS 用户的 GitLab Role 决定 Runner 管理权限;
- Pipeline Secret 与人员密码完全分离;
- Shell、Docker Socket 和 Privileged Runner 都应视为高权限执行环境;
- Runner Host 应专用、可重建、可撤销;
- Protected Runner、Protected Ref 和 Secret Scope 必须配套。
“让 Runner 集成 LDAP/CAS”真正要解决的不是给 Runner 加登录页,而是让人员身份、GitLab 权限、机器 Token 和 CI Secret 各守自己的边界。