Jenkins的授权策略

Jenkins 默认的授权策略是【登录用户可以做任何事】,也就是人人都是管理员,可以修改所有的设置以及构建所有的任务,不用做任何设置,有账号登录到 Jenkins 系统即可,这对于测试研究 Jenkins 来讲是不错的,但将这种策略用于生产环境绝对不是我们想要的。试想一下,原本很多的 Jenkins 配置信息已经设置好了,结果来了一个新手,由于不是很会使用 Jenkins,结果把 Jenkins 的设置打乱了,如果没有文档记录的话,你都不知道之前是怎么设置的。同样的,有些任务不是任何人都可以去构建的,特别是用于部署生产环境的的一些任务,随便去构建了,那就可能会部署到生产环境去,没做好控制的话很容易被误操作,这是会出生产事故的,所以做好权限控制是非常有必要的。

Jenkins 默认的授权策略显然满足不了我们的高要求,那有方式实现我们的权限精细化控制吗?肯定是有的。其实 Jenkins 除了前面说的默认“登录用户可以做任何事”的策略外还内置了其他几种授权策略:任何用户可以做任何事(没有任何限制,不登录就可以进行管理操作),安全矩阵、遗留模式、项目矩阵授权策略。其中安全矩阵策略和项目矩阵授权策略比较相似,都是对用户或组进行权限设置,但是可设置的权限还不算很细,做简单的权限控制还是够了的,但有个明显的缺点是要给所有的用户都要设置一遍。下面我将介绍另一种授权策略  Role-Based Strategy,从名称我们就可以知道这是基于角色的权限控制。

在使用 Role-Based Strategy 授权策略之前我们要先安装一个插件 Role-based Authorization Strategy。在【插件管理】的【可选插件】中过滤搜索关键词 Role,就会看到 Role-based Authorization Strategy 插件,安装好后重启下 Jenkins。Jenkins 有个很方便的重启方式,浏览器中登录到 Jenkins 系统,然后访问地址 http://jenkins_host:port/restart 确定是后就会重启 Jenkins

如下图:

Jenkins授权 jenkins 权限设置_运维

Role-based Authorization Strategy 插件安装好后,在 Jenkins 的【全局安全配置】中的【授权策略】会多出【Role-Based Strategy】选项,我们将授权策略调整为【Role-Based Strategy】后保存下:

Jenkins授权 jenkins 权限设置_Jenkins授权_02

这时候在 Jenkins 的【系统管理】中会看到 【Manage and Assign Roles】的设置选项以及还有一块如下图的黄色警告。

Jenkins授权 jenkins 权限设置_服务器_03

这个警告内容翻译过来就是默认情况下,Jenkins中的构建以具有完整 Jenkins 权限的虚拟 Jenkins 系统用户身份运行。如果某些用户对某些作业有限制或没有访问权限,但可以配置其他作业,则可能会出现问题。如果是这样的话,建议安装一个实现构建身份验证的插件,并覆盖这个默认值。我这里的警告里面是一个❌,如果你的警告里面有两个❌,则需要再安装一个插件 Authorize Project。安装好 Authorize Project 插件后,去到【全局安全配置】中的【Access Control for Builds】进行如下设置,添加两个如下的配置警告就消失了:

Jenkins授权 jenkins 权限设置_Jenkins授权_04

角色和权限的设置

我们进入到【Manage and Assign Roles】,进行角色和权限设置,它的步骤是这样的:首先在【Manage Roles】里面添加角色并对角色进行赋权,然后在【Assign Roles】里面对用户进行角色指定。

Jenkins授权 jenkins 权限设置_jenkins_05

在进行角色和权限分配之前我们先讲下应用场景,最常见的一个场景是,一个公司的 IT 团队中有专门做开发的,有做测试的还有做线上运维发布的,这个场景下开发者就只能去构建开发环境的任务,测试就只能去构建测试环境的任务,生产环境的任务就只能由线上运维人员进行操作。明白了场景要求我们就可以划分角色和权限了。我们可以分为三种角色:开发者角色 dev-role、测试员角色 test-role、运维员角色 prod-role,假定开发者角色就只能构建开发环境的任务,测试人员只能构建测试环境的任务,运维人员可以构建所有环境的任务。还有一点需要注意的是,角色权限的设置最终会落实到对任务的操作权限,那么任务的命名就需要规范化,因为是采用正则匹配,规范任务的命名才要写正则表达式,否则写正则表达式就会劝退不少人。

接下来就开始我们的角色权限配置,首先我们先创建几个 Jenkins 用户账号进行测试。用管理账号登录到 Jenkins 系统,去到 Jenkins 【系统管理】的【管理用户】功能设置里面新创建用户:张三、李四、王五:

Jenkins授权 jenkins 权限设置_运维_06

Jenkins授权 jenkins 权限设置_运维_07

Jenkins授权 jenkins 权限设置_Jenkins授权_08

我们假定张三、李四、王五分别是开发人员角色、测试人员角色和运维人员角色,他们的权限分别是张三可以构建开发环境任务、李四可以构建测试环境任务、王五可以构建开发、测试和生产环境的任务。除了构建任务和对任务的配置进行设置,他们都不能修改 Jenkins 的其他配置。创建好用户后,我们再去到【Manage and Assign Roles】的【Manage Roles】里面创建角色和配置权限。

在【Global roles】里面保持 admin 角色的权限不变,新添加 dev、test、prod 三个角色,然后将这三个角色设置上只读权限,如果不设置读取相关权限,用户登录后什么也看不到。在【Item roles】里面依旧添加 dev、test、prod 三个角色,并将所有的权限都勾选上,需要注意的是添加【Item roles】角色时还有填入 Pattern 信息,这个 Pattern 表示正则匹配哪些任务。例如我这里 dev 的角色可以管理所有名称包含 dev 关键字的任务,test 角色可以管理所有名称包含 test 关键字的任务,prod 角色可以管理所有名称包含 prod 关键字的任务,所以任务名称规范非常重要。

这里说明一下正则匹配,拿 test 角色举例。我这里 test 角色填入的 Pattern 正则表达式为 .*(?i)test.* 这表示匹配所有名称包含 test 关键字的任务,其中 test 忽略大小写,这个任务是指所有 Jenkins 的任务类型,包括目录。

Jenkins授权 jenkins 权限设置_jenkins_09

点击某个 Pattern 正则会弹窗提示匹配到哪些任务:

Jenkins授权 jenkins 权限设置_Jenkins_10

然后在【Assign Roles】角色分配里面对用户进行角色分配,【 Global roles】和【Item roles】的设置如下,需要注意的是添加时是根据登录用户名进行设置,这里的用户名最终会显示成完整名称。

Jenkins授权 jenkins 权限设置_Jenkins_11

到这里角色和权限的配置已经完成了,在下一节内容中我们将用实际的项目和不同角色的用户进行演示,看看我们角色权限是否配置正确。