前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >第6章 Jenkins系统权限划分与授权管理

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

作者头像
DevOps云学堂
发布2020-08-04 16:35:42
5.8K0
发布2020-08-04 16:35:42
举报
文章被收录于专栏:DevOps持续集成DevOps持续集成

第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")
                    }
                }
            }
        }
   }
}
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-07-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DevOps云学堂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 第6章 Jenkins系统权限管理
    • 1.1 角色与权限划分
      • 1.1.1 Global Roles
      • 1.1.2 Item Roles
      • 1.1.3 Node Roles
    • 1.2 为用户分配角色
      • 1.3 FAQ
      相关产品与服务
      CODING DevOps
      CODING DevOps 一站式研发管理平台,包括代码托管、项目管理、测试管理、持续集成、制品库等多款产品和服务,涵盖软件开发从构想到交付的一切所需,使研发团队在云端高效协同,实践敏捷开发与 DevOps,提升软件交付质量与速度。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档