第6章 Jenkins系统权限管理
  • 1.1 角色与权限划分

    • 1.1.1 Global Roles

    • 1.1.2 Item Roles

    • 1.1.3 Node Roles

  • 1.2 为用户分配角色

  • 1.3 FAQ

Jenkins基础部分最后一篇文了,对Jenkins学员提,如果有需要请大家可以支持下今天刚刚推出的DevOps教程,感谢支持

当我们安装好Jenkins之后,默认的授权策略是登录的用户可以做任何事情,对于安全方面这样存在挑战。

第6章 Jenkins系统权限划分与授权管理_java


Jenkins有一个好用的权限管理插件Role-based Authorization Strategy。这个插件在大规模使用上还是比较稳定的,所以推荐大家使用。进入插件管理,搜索Role-based Authorization Strategy ,  我们来安装此插件。安装插件后最好重启一下Jenkins。

第6章 Jenkins系统权限划分与授权管理_java_02


重启后我们进入系统管理> 未分类, 找到Manage and Assign Roles。这个插件主要提供的功能为:Manage Roles管理角色 Assign Roles授权角色。

第6章 Jenkins系统权限划分与授权管理_java_03



1.1 角色与权限划分

1.1.1 Global Roles

Global Roles适用于Jenkins中的所有项目,并覆盖您在“Item Roles”中指定的任何内容。也就是说,当您授予角色“Global Roles”中的“Job Read”权限时,则无论您在“Item Roles”中指定的内容如何,都允许该角色读取所有作业。

默认情况下,您应该能够看到一个admin用户具有了所有的权限。(图片很长,这里仅截取了一部分)

权限分为:

  • 全部:所有对象管理、读取权限。
  • 凭据:创建、删除、管理域、更新、浏览权限。
  • 代理:构建、配置、连接、创建、删除、断开连接等权限。
  • 作业:构建、取消、配置、创建、删除、发现、读取、移动、工作目录权限。
  • 运行:删除、回放、更新。
  • 视图:配置、创建、删除、读取。

在这里将整个平台角色可以分为管理员、二级管理员、普通用户。对于管理员admin具有所有权限,对于二级管理员itemadmin具有作业完全控制权限,对于普通用户users具有对作业读取权限。角色划分完成,我们开始配置。


ok,我们已经创建好了每个角色对应的权限,后续我们会根据不同的用户给予不同的角色权限。

1.1.2 Item Roles

项目作业的权限,我们可以使用正则表达式对同类作业匹配。例如:我的流水线项目名称都是按照test-开头的,test-pipeline-service、test-pipeline-web。如果具有良好的项目命名规范,划分权限会更加容易一些。

首先定位到item Roles  然后填写Role to add字段的值为test意思是这个角色的名称,Pattern填写要匹配的项目test-.*,我们点击Add添加权限。为test角色勾选Job Build/Cancel/Discover/Read/Workspace权限。

1.1.3 Node Roles

代理节点的权限也是可以按照Item Roles通过正则表达式配置,不过一般我们都会在流水线指定好相关的agent名称或者标签不会进行权限的控制,当然如果你需要对代理节点的配置进行权限控制,也是可以在这里实现的。


1.2 为用户分配角色

我们创建一个用户,在Global roles选项中为用户授权全局的权限,例如:系统管理员、作业管理员、普通用户。我们先来测试作业管理员,这里我们勾选的是itemadmin


保存配置,尝试使用此用户登录系统。经过验证是可以对作业进行增删改查完全控制的,但是对于系统设置、节点都不能操作。

此时我们将这个用户再重新分配为普通用户users,对应平台的使用者开发人员。


切换用户登入系统会发现,一片空白。显然这不符合实际的情况,我们希望普通用户能够对自己项目组的流水线项目具有构建权限。


这时候,我们在改用户权限的基础上加上Item Rolestest, 然后再进行测试。


进入系统后,只能对当前项目组的项目进行构建。



1.3 FAQ

如果不给用户分配Global Roles中的全部 Read 则会出现以下情况。


如果出现权限授权问题导致无法登陆Jenkins,这时候需要修改Jenkins的config.xml文件

<useSecurity>true</useSecurity>   ## 替换为false,重启。

这样授权只有几个项目还行,项目达到一定规模就难以维护了。我们可以使用此插件的接口进行授权。我们用Jenkins来操作Jenkins。创建一个Jenkins作业,然后使用此作业授权。具体的操作参考B站视频:https://www.bilibili.com/video/BV1hE41137q1

该作业完整的Pipeline Jenkinsfile如下:注意替换jenkins服务器地址和使用的凭据。该凭据是Jenkins的admin用户。


//封装HTTP请求def HttpReq(reqType,reqUrl,reqBody){    def apiServer = "http://localhost:8080/role-strategy/strategy"   result = httpRequest authentication: 'jenkins-admin-user',            httpMode: reqType,            contentType: "APPLICATION_JSON",            consoleLogResponseBody: true,            ignoreSslErrors: true,            requestBody: reqBody,            url: "${apiServer}/${reqUrl}"            //quiet: true    return result}

//创建权限/** @param type          (globalRoles, projectRoles)* @param roleName      Name of role* @param permissionIds Comma separated list of IDs for given roleName* @param overwrite     Overwrite existing role* @param pattern       Role pattern* @throws IOException  In case saving changes fails* @since 2.5.0*/
def CreateRole(roleType,roleName,permissionIds='',overwrite='true',pattern=''){  if (roleType == "globalRoles"){      reqUrl = "addRole?type=${roleType}&roleName=${roleName}&permissionIds=${permissionIds}&overwrite=${overwrite}"  } else {      reqUrl = "addRole?type=${roleType}&roleName=${roleName}&permissionIds=${permissionIds}&overwrite=${overwrite}&pattern=${pattern}"  }  result = HttpReq("POST",reqUrl,'')  return result
}


//授权用户def AssignRole(roleType,roleName,username){
   reqUrl = "assignRole?type=${roleType}&roleName=${roleName}&sid=${username}"    result = HttpReq("POST",reqUrl,'')    return result}


pipeline {    agent any
   parameters {        choice choices: ['','CreateRole','AssignRole'], description: '', name: 'runOpts'        choice choices: ['','globalRoles','projectRole'], description: '', name: 'roleType'        string defaultValue: '', description: '', name: 'roleName', trim: false        string defaultValue: '', description: '', name: 'userName', trim: false    }
   stages {        stage("Run"){            steps{                script{                    switch("${runOpts}"){                        case 'CreateRole':                            CreateRole("${env.roleType}","${env.roleName}",'hudson.model.Item.Discover,hudson.model.Item.ExtendedRead',true,"${env.roleName}-.*")                            break;
                       case 'AssignRole':                            AssignRole("${env.roleType}","${env.roleName}","${env.userName}")                            break;
                       default:                            println("error")                    }                }            }        }   }}



Jenkins基础部分最后一篇文了,对Jenkins学员提,如果有需要请大家可以支持下今天刚刚推出的DevOps教程,感谢支持

第6章 Jenkins系统权限划分与授权管理_java_04


第6章 Jenkins系统权限划分与授权管理_java_05