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

2020-08-04 16:35:42 浏览数 (1)

第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之后,默认的授权策略是登录的用户可以做任何事情,对于安全方面这样存在挑战。

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

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


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 Roles test, 然后再进行测试。

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


1.3 FAQ

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

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

代码语言:javascript复制
<useSecurity>true</useSecurity>   ## 替换为false,重启。

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

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

代码语言:javascript复制

//封装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")
                    }
                }
            }
        }
   }
}

0 人点赞