第6章 Jenkins系统权限划分与授权管理
第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文件
<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")
}
}
}
}
}
}
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 有效地读取图像,对比opencv、PIL、turbojpeg、lmdb、tfrecords
- 消息队列的使用(kafka举例)
- 类加载过程,双亲委派模型?
- 图卷积网络-多标签分类
- MySQL parttion分区,以及分区和分表的区别
- ThreadPoolExcutor源码分析
- 动态分组卷积-Dynamic Group Convolution for Accelerating Convolutional Neural Networks
- (15)Shell概述及脚本执行方式
- jvm线上内存问题排查
- (18)Bash输入输出重定向
- RPC 和 REST还有RESTFul到底是个什么玩意?
- 线程和线程池的几个状态值
- 阿里代码规约为什么不让使用Executors包装好线程池呢?
- Groovy、热部署和热加载(自定义类加载器)及spring loaded 部分源码分析
- Centos在线迁移到腾讯云cvm