Jenkins 進階篇 – 權限配置

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 系統,然後訪問地址 //jenkins_host:port/restart 確定是後就會重啟 Jenkins
如下圖:
image.png

Role-based Authorization Strategy 插件安裝好後,在 Jenkins 的【全局安全配置】中的【授權策略】會多出【Role-Based Strategy】選項,我們將授權策略調整為【Role-Based Strategy】後保存下:
image.png

這時候在 Jenkins 的【系統管理】中會看到 【Manage and Assign Roles】的設置選項以及還有一塊如下圖的黃色警告。
image.png

這個警告內容翻譯過來就是默認情況下,Jenkins中的構建以具有完整 Jenkins 權限的虛擬 Jenkins 系統用戶身份運行。如果某些用戶對某些作業有限制或沒有訪問權限,但可以配置其他作業,則可能會出現問題。如果是這樣的話,建議安裝一個實現構建身份驗證的插件,並覆蓋這個默認值。我這裡的警告裏面是一個❌,如果你的警告裏面有兩個❌,則需要再安裝一個插件 Authorize Project。安裝好 Authorize Project 插件後,去到【全局安全配置】中的【Access Control for Builds】進行如下設置,添加兩個如下的配置警告就消失了:
image.png

角色和權限的設置

我們進入到【Manage and Assign Roles】,進行角色和權限設置,它的步驟是這樣的:首先在【Manage Roles】裏面添加角色並對角色進行賦權,然後在【Assign Roles】裏面對用戶進行角色指定。
image.png

在進行角色和權限分配之前我們先講下應用場景,最常見的一個場景是,一個公司的 IT 團隊中有專門做開發的,有做測試的還有做線上運維發佈的,這個場景下開發者就只能去構建開發環境的任務,測試就只能去構建測試環境的任務,生產環境的任務就只能由線上運維人員進行操作。明白了場景要求我們就可以劃分角色和權限了。我們可以分為三種角色:開發者角色 dev-role、測試員角色 test-role、運維員角色 prod-role,假定開發者角色就只能構建開發環境的任務,測試人員只能構建測試環境的任務,運維人員可以構建所有環境的任務。還有一點需要注意的是,角色權限的設置最終會落實到對任務的操作權限,那麼任務的命名就需要規範化,因為是採用正則匹配,規範任務的命名才要寫正則表達式,否則寫正則表達式就會勸退不少人。

接下來就開始我們的角色權限配置,首先我們先創建幾個 Jenkins 用戶賬號進行測試。用管理賬號登錄到 Jenkins 系統,去到 Jenkins 【系統管理】的【管理用戶】功能設置裏面新創建用戶:張三、李四、王五:
image.png
image.png
image.png
我們假定張三、李四、王五分別是開發人員角色、測試人員角色和運維人員角色,他們的權限分別是張三可以構建開發環境任務、李四可以構建測試環境任務、王五可以構建開發、測試和生產環境的任務。除了構建任務和對任務的配置進行設置,他們都不能修改 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 的任務類型,包括目錄。
image.png

點擊某個 Pattern 正則會彈窗提示匹配到哪些任務:
image.png

然後在【Assign Roles】角色分配裏面對用戶進行角色分配,【 Global roles】和【Item roles】的設置如下,需要注意的是添加時是根據登錄用戶名進行設置,這裡的用戶名最終會顯示成完整名稱。
image.png

到這裡角色和權限的配置已經完成了,在下一節內容中我們將用實際的項目和不同角色的用戶進行演示,看看我們角色權限是否配置正確。

Tags: