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
如下圖:
Role-based Authorization Strategy 外掛安裝好後,在 Jenkins 的【全域性安全配置】中的【授權策略】會多出【Role-Based Strategy】選項,我們將授權策略調整為【Role-Based Strategy】後儲存下:
這時候在 Jenkins 的【系統管理】中會看到 【Manage and Assign Roles】的設定選項以及還有一塊如下圖的黃色警告。
這個警告內容翻譯過來就是預設情況下,Jenkins中的構建以具有完整 Jenkins 許可權的虛擬 Jenkins 系統使用者身份執行。如果某些使用者對某些作業有限制或沒有訪問許可權,但可以配置其他作業,則可能會出現問題。如果是這樣的話,建議安裝一個實現構建身份驗證的外掛,並覆蓋這個預設值。我這裡的警告裡面是一個,如果你的警告裡面有兩個,則需要再安裝一個外掛 Authorize Project。安裝好 Authorize Project 外掛後,去到【全域性安全配置】中的【Access Control for Builds】進行如下設定,新增兩個如下的配置警告就消失了:
角色和許可權的設定
我們進入到【Manage and Assign Roles】,進行角色和許可權設定,它的步驟是這樣的:首先在【Manage Roles】裡面新增角色並對角色進行賦權,然後在【Assign Roles】裡面對使用者進行角色指定。
在進行角色和許可權分配之前我們先講下應用場景,最常見的一個場景是,一個公司的 IT 團隊中有專門做開發的,有做測試的還有做線上運維釋出的,這個場景下開發者就只能去構建開發環境的任務,測試就只能去構建測試環境的任務,生產環境的任務就只能由線上運維人員進行操作。明白了場景要求我們就可以劃分角色和許可權了。我們可以分為三種角色:開發者角色 dev-role、測試員角色 test-role、運維員角色 prod-role,假定開發者角色就只能構建開發環境的任務,測試人員只能構建測試環境的任務,運維人員可以構建所有環境的任務。還有一點需要注意的是,角色許可權的設定最終會落實到對任務的操作許可權,那麼任務的命名就需要規範化,因為是採用正則匹配,規範任務的命名才要寫正則表示式,否則寫正則表示式就會勸退不少人。
接下來就開始我們的角色許可權配置,首先我們先建立幾個 Jenkins 使用者賬號進行測試。用管理賬號登入到 Jenkins 系統,去到 Jenkins 【系統管理】的【管理使用者】功能設定裡面新建立使用者:張三、李四、王五:
我們假定張三、李四、王五分別是開發人員角色、測試人員角色和運維人員角色,他們的許可權分別是張三可以構建開發環境任務、李四可以構建測試環境任務、王五可以構建開發、測試和生產環境的任務。除了構建任務和對任務的配置進行設定,他們都不能修改 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 的任務型別,包括目錄。
點選某個 Pattern 正則會彈窗提示匹配到哪些任務:
然後在【Assign Roles】角色分配裡面對使用者進行角色分配,【 Global roles】和【Item roles】的設定如下,需要注意的是新增時是根據登入使用者名稱進行設定,這裡的使用者名稱最終會顯示成完整名稱。
到這裡角色和許可權的配置已經完成了,在下一節內容中我們將用實際的專案和不同角色的使用者進行演示,看看我們角色許可權是否配置正確。