如果你還不理解 RBAC,看看 Jenkins 如何做到的
通過本篇你可以學習到如下內容:
- RBAC 的基礎知識。
- Jenkins 的角色權限插件的使用。
- 實戰:通過角色來管理用戶的部署權限。
一、RBAC
Jenkins 對權限的支持是比較弱的,存在以下不足:
- 有多個流水線任務,期望不同用戶能看到的任務不一樣。
- 一個項目有多套環境,期望用戶只能部署某些環境。
- 有的項目只讓用戶有查看權限,期望不給部署權限。
針對上面的不足,Jenkins 可以通過 RBAC 插件的方式來實現對權限的管控。RBAC 是常見的權限控制方案。
RBAC(Role-Based Access Control):基于角色的權限控制。通過角色關聯用戶,角色關聯權限的方式間接賦予用戶權限。
如下圖所示,三個用戶對應了三種角色,每個角色關聯了不同的部署任務,通過這種關聯方式間接賦予了用戶權限。
圖片
二、角色權限插件
目前發現這個角色權限插件是比較好用的,推薦給大家使用。
插件名:Role-based Authorization Strategy。可以到插件管理那里進行安裝,如下圖所示:
角色權限策略插件
三、選擇授權策略
Jenkins 自帶了多種授權策略,如下圖所示,在全局安全設置中可以選擇授權策略。
對應的訪問路徑如下:
Dashboard->Manage Jenkins->Configure Global Security
當我們安裝好 Role-based Authorization Strategy 插件后,就會出現一個 Role-Base Strategy 授權策略。
Jenkins 授權策略
下面開始演示如何基于這個授權策略來分配多個流水線的部署權限。
四、創建演示用戶
為了更好的演示角色權限管理功能,我創建了 3 個用戶以及 4 個流水線任務。
創建用戶的路徑為:
http://<你的jenkins地址>:8080/securityRealm/
我在 jenkins 后臺創建了幾個用戶:
- 開發組長1:用戶名=passjava-master1
- 測試組長1:用戶名=passjava-tester1
- 項目經理1:用戶名=passjava-pm1
如下圖所示:
圖片
五、創建演示任務
我創建了 4 個部署流水線任務,分別對應項目一和項目二的測試和生產環境。如下圖所示:
圖片
項目一和項目二的測試和生產環境
然后還創建了兩個分組:正式環境分組和測試環境分組。
正式環境分組:demo-prod-env
- 項目一正式環境:對應 passjava-prod-project1 任務
- 項目二正式環境:對應 passjava-prod-project2 任務
測試環境分組:demo-test-env
- 項目一測試環境:對應 passjava-test-project1 任務
- 項目二測試環境:對應 passjava-test-project2 任務
分組的好處是可以歸類以及可以按組分配權限。
六、創建演示角色
6.1 創建角色的頁面路徑
創建角色的路徑如下圖所示:
圖片
創建角色的頁面路徑
頁面地址:
http://<你的jenkins服務ip>:8080/manage/role-strategy/
訪問路徑:
Dashboard->Manage Jenkins->Manage and Assign Roles->Manage Roles
6.2 三種角色
這個插件可以創建三種角色:
- Global roles:全局角色,例如管理員、作業創建者、匿名等,允許在全局基礎上設置總體、代理、任務、運行、查看和 SCM 權限。
- Item roles:任務角色,允許在任務、分組上設置特定權限。
- Agent roles:Agent 角色,本篇用不上。
6.3 全局角色
全局角色適用于 Jenkins 中的任何任務,并覆蓋你在任務角色中指定的任何內容。也就是說,當你在全局角色中授予角色權限 Job/Read,無論你在任務角色中指定什么,都允許該角色讀取所有任務。
所以為了分配不同任務權限給不同角色,這里對于全局角色勾選一個 Overall Read 權限即可。如下圖所示:
我創建了一個全局角色:passjava,如下圖所示。
創建全局角色 passjava
后續將上面創建的三個用戶加到這個 Global 角色中即可。
注意:如果這三個用戶不加入到 passjava 角色中的話,后續這三個用戶登錄會提示報錯,如下圖所示:
圖片
6.4 任務角色
我創建了三種任務角色:
- passjava-master:具有部署項目一和項目二的正式環境的權限。
- passjava-tester:具有部署項目一的和項目二的測試環境的權限。
- passjava-pm:具有查看項目一和項目二的正式環境和測試環境的權限,沒有部署權限。
如下圖所示:
項目角色
下面解釋下上面的權限配置:
- Role:代表角色名稱
- Pattern:代表正則表達式。例如,如果將該字段設置為 passjava-prod.*,則該角色將匹配名稱以 passjava-prod 開頭的所有任務,更多匹配規則可到該插件的官網上查看。點擊藍色的 passjava-prod.*,則能看到匹配成功的任務:passjava-prod-project1任務 和 passjava-prod-project2任務,如下圖所示:
正則表達式匹配成功 項目
- Job:任務的權限,我們勾選 Build(部署),Cancel(取消部署),Read(查看任務)即可。
6.5 分配角色
創建好全局角色和任務角色,我們就可以將用戶加入到對應的任務角色中,用戶和角色是多對多的關系。比如用戶張三可以具有角色 A 和角色 B 的權限,角色 A 的權限也可以給用戶張三和李四。
6.5.1 分配全局角色
通過 Assign Roles 功能將三個用戶都加入到 passjava 角色中。
圖片
6.5.2 分配項目角色
圖片
- 開發組長具有 passjava-master 權限,可以部署項目一和項目二的正式環境。開發組長登錄系統后看到的任務列表如下圖所示:
開發組長查看項目列表
- 項目經理具有 passjava-pm 權限,可以查看項目一和項目二的測試和正式環境的部署情況。項目經理登錄系統后看到的任務列表如下圖所示:
圖片
- 測試組長具有 passjava-tester 權限,可以部署項目一和項目二的測試環境。測試組長登錄系統后看到的任務列表如下圖所示:
而是組長查看項目列表
可以從上面的結果看出用戶、角色、權限分配完成,不同的用戶可以部署不同的環境。
七、總結
通過本篇的學習,我們了解了 RBAC 以及角色權限插件的使用。通過實戰掌握了如何配置不同用戶具有不同角色,不同角色具有不同任務的權限,從而可以更安全地管理用戶的部署權限。
回到最開始提到的 Jenkins 的不足之處我們來看看解決方案是怎么樣的:
- 有多個流水線任務,期望不同用戶能看到的任務不一樣,解決方案是可以給不同角色分配不同的任務,不同用戶賦予不同角色。如實戰中的開發組長和測試組長看到的任務不一樣。
- 一個項目有多套環境,期望用戶只能部署某些環境,解決方案是對多套環境創建對應的多個任務,多個角色擁有對應環境的任務,并對用戶賦予對應環境的角色。如實戰中開發組長只能看到正式環境的任務。
- 有的項目只讓用戶有查看權限,期望不給部署權限,解決方案是添加一個只能查看對應項目的任務的角色,并給用戶賦予這個角色,如實戰中項目經理1只有查看權限,沒有部署權限。