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")
}
}
}
}
}
}
Jenkins基础部分最后一篇公开的博文了,后续系列博文仅对Jenkins课程学员提供,如果有需要请大家可以支持下今天刚刚推出的DevOps教程,感谢支持!