18.2.1 权限模型与角色设计(RBAC)
权限模型与角色设计(RBAC)#
Jenkins 的 RBAC(Role-Based Access Control)以“用户/组—角色—权限”三层模型组织授权,目标是最小权限、可审计与可扩展。建议使用 Role-based Authorization Strategy 插件配合 Folder/Multibranch 做层级隔离,避免直接给用户散配权限。
一、原理草图与核心概念#
- 主体(Subject):用户或用户组(本地或 LDAP/AD)。
- 资源(Resource):Global、Folder、Job、View、Agent、Credentials。
- 动作(Action):Read/Build/Configure/Manage 等。
- 角色(Role):权限集合命名体,绑定主体。
二、角色层级设计(示例)#
-
全局角色(Global Roles)
- Admin:Overall/Administer(仅核心运维)
- Auditor:Overall/Read、View/Read、Job/Read
- Operator:Agent/Connect、Agent/Disconnect、Job/Build -
项目角色(Item/Project Roles)(匹配 Job/Folder 正则)
- Developer:Job/Read、Job/Build、Job/Workspace
- Releaser:Job/Build、Job/Cancel、Job/Read
- Maintainer:Job/Configure、Job/Delete -
节点角色(Agent Roles)
- NodeAdmin:Agent/Configure、Agent/Create、Agent/Delete
- NodeUser:Agent/Build或Agent/Connect
三、安装与启用(插件与安全策略)#
方式 A:GUI 安装
1. 进入 Manage Jenkins → Plugins → Available。
2. 安装 Role-based Authorization Strategy。
3. 进入 Manage Jenkins → Configure Global Security:
- Authorization 选择 Role-Based Strategy。
- 保存。
方式 B:CLI 安装(离线/自动化)
# 前置:下载 jenkins-cli.jar 并配置 URL 与认证
JENKINS_URL=http://127.0.0.1:8080
java -jar jenkins-cli.jar -s $JENKINS_URL -auth admin:token \
install-plugin role-strategy -deploy
预期效果:插件安装完成后,授权策略可切换为 Role-Based Strategy。
四、RBAC 实施示例(含完整可执行脚本)#
场景:
- 全局角色:Admin、Auditor
- 项目角色:DevRole 仅允许访问 team-a/.*
- 绑定:alice 为 Admin;bob 为 Auditor;dev01 为 DevRole
1)在 Script Console 执行(Manage Jenkins → Script Console)
import jenkins.model.*
import com.michelin.cio.hudson.plugins.rolestrategy.*
import hudson.security.*
// 获取 Role Strategy
def instance = Jenkins.getInstance()
def strategy = (RoleBasedAuthorizationStrategy) instance.getAuthorizationStrategy()
// 定义权限
def adminPerms = [
Jenkins.ADMINISTER
] as Set
def auditorPerms = [
Jenkins.READ,
Item.READ,
View.READ
] as Set
def devPerms = [
Jenkins.READ,
Item.READ,
Item.BUILD,
Item.WORKSPACE
] as Set
// 创建角色(Global)
def globalRoleMap = strategy.getRoleMap(RoleBasedAuthorizationStrategy.GLOBAL)
globalRoleMap.addRole(new Role("Admin", adminPerms))
globalRoleMap.addRole(new Role("Auditor", auditorPerms))
// 创建角色(Project),匹配 Folder/Job
def projectRoleMap = strategy.getRoleMap(RoleBasedAuthorizationStrategy.PROJECT)
projectRoleMap.addRole(new Role("DevRole", "team-a/.*", devPerms))
// 绑定用户
globalRoleMap.assignRole(RoleBasedAuthorizationStrategy.GLOBAL, "Admin", "alice")
globalRoleMap.assignRole(RoleBasedAuthorizationStrategy.GLOBAL, "Auditor", "bob")
projectRoleMap.assignRole(RoleBasedAuthorizationStrategy.PROJECT, "DevRole", "dev01")
instance.save()
println("RBAC roles assigned")
2)验证权限效果
- 以 dev01 登录:仅可访问 team-a/ 下的 Job,其他目录不可见。
- 以 bob 登录:可读所有 Job 与 View,但不能构建。
五、Folder 分区与角色绑定示例#
Jenkins
├── team-a
│ ├── dev
│ └── prod
└── team-b
├── dev
└── prod
- 项目角色正则:
team-a/.*→ TeamA-Developerteam-a/prod/.*→ TeamA-Releaser(仅发布)- 建议用 Folder 级权限隔离环境,避免跨团队访问。
六、权限粒度划分建议#
- 强约束权限:
Overall/Administer、Overall/Manage仅限 Admin。 - 敏感权限隔离:
Credentials/*归凭据管理员。 - 配置与构建分离:
Job/Configure与Job/Build分离。
七、排错与诊断#
- 切换策略后权限丢失
- 现象:普通用户无法登录或看不到 Job。
- 处理:确认 Global Roles 中是否给了Overall/Read。 - 正则配置不生效
- 现象:项目角色未生效。
- 处理:检查 Job 路径是否包含 Folder 前缀,如team-a/dev/job1。 - 用户绑定未生效
- 现象:权限未变化。
- 处理:保存后重登;检查用户 ID 与实际登录名一致。 - 无法执行 Script Console
- 现象:403 或无权限。
- 处理:只有 Admin 具备Overall/Administer才可执行脚本。
八、练习(可操作)#
- 创建 Folder
team-a与team-b,各建一个流水线 Job。 - 使用 Script Console 创建项目角色:
-TeamA-Dev→team-a/.*
-TeamB-Dev→team-b/.* - 创建用户
devA、devB,分别绑定角色,验证访问隔离。 - 移除
Job/Configure权限,确认用户无法修改 Jenkinsfile 相关配置。
通过规范化 RBAC 设计与分层授权,Jenkins 权限模型可实现清晰职责边界、降低误操作与安全风险,为 CI/CD 稳定运行提供基础保障。