Jenkins服務安全加固
Jenkins早期版本的默認配置下沒有安全檢查。任何人都可以以匿名用戶身份進入Jenkins,執行build操作。然而,對大多數Jenkins應用,尤其是暴露在互聯網的應用,安全控制是非常重要的。從Jenkins 2.0開始,其默認配置中啟用了許多安全選項,以確保Jenkins環境安全,除非管理員明確禁用某些保護。
本文介紹了Jenkins管理員可操作的各種安全選項,用來加固您的Jenkins服務,以防被黑客攻擊。
Jenkins訪問控制
Jenkins訪問控制分為:安全域(即認證)與授權策略。
-
安全域決定Jenkins在認證的過程中從哪里尋找用戶,默認選項有:Jenkins專有用戶數據庫,LDAP,和Servlet容器代理。
-
授權策略決定用戶登錄后可以做什么,默認選項有:任何用戶可以做任何事(沒有任何限制),安全矩陣,登錄用戶可以做任何事情,遺留模式,項目矩陣授權策略。
Jenkins加固方案
關注安全漏洞
定期關注Jenkins官方安全公告,使用或更新到官方最新版本的Jenkins,防止部署存在安全漏洞的版本。
啟用安全性設置
自2.0版本起,Jenkins默認勾選Enable security復選框。Jenkins管理員可以在Web UI的啟用安全性部分啟用,配置或禁用適用於整個Jenkins環境的關鍵安全功能。
默認情況下,匿名用戶沒有權限,而登錄的用戶具有完全的控制權。用戶可以使用用戶名和密碼登錄,以執行匿名用戶不可用的操作。哪些操作要求用戶登錄取決於所選擇的授權策略及其配置。對於任何非本地(測試)Jenkins環境,應始終啟用此復選框。
配置NLP TCP端口
Jenkins使用TCP端口與通過JNLP協議啟動的代理(如基於Windows的代理)進行通信。截止Jenkins 2.0,默認情況下此端口被禁用。
對於希望使用基於JNLP代理的管理員,以下兩種類型的端口可供選用:
- 隨機:隨機選擇JNLP端口,避免Jenkins主機發生沖突 。該方式的缺點是在Jenkins主引導期間,難以管理允許JNLP流量的防火牆規則。
- 固定:由Jenkins管理員選擇JNLP端口,端口在Jenkins主控器的重新啟動之間是一致的。這使得管理防火牆規則更容易,允許基於JNLP的代理連接到主服務器。
啟用訪問控制
訪問控制是保護Jenkins環境免受未經授權使用的主要機制。在Jenkins中配置訪問控制包括以下三個方面:
-
管理控制台。根據一般的管理方式,管理人員不需要直接在互聯網上進行管理,僅需要根據業務資深需求,對管理控制台訪問源IP、端口進行限制,防止被惡意人員訪問后台。
-
安全域。通知Jenkins環境如何以及在哪里獲取用戶(或標識)的信息,也被稱為“認證”。
-
授權配置。通知Jenkins環境,哪些用戶和/或組在多大程度上可以訪問Jenkins的哪些方面。
使用安全域和授權配置,可以在Jenkins中輕松地配置非常剛性的身份驗證和授權方案。此外,一些插件(如基於角色的授權策略)可以擴展Jenkins的訪問控制功能,以支持更細微的身份驗證和授權方案。
選擇合理的授權方式
安全領域或認證表明誰可以訪問Jenkins環境,而授權解決的是他們可以在Jenkins環境中訪問什么。
默認情況下,Jenkins支持以下的授權選項:
-
所有人都可以控制Jenkins。每個人都可以完全控制Jenkins,包括尚未登錄的匿名用戶。請勿將本設置用於本地測試Jenkins管理以外的任何其他設置。
-
傳統模式。如果用戶具有“admin”角色,他們將被授予對系統的完全控制權,否則該用戶(包括匿名用戶)將僅具有讀訪問權限。不要將本設置用於本地測試Jenkins管理以外的任何設置。
-
登錄用戶可以做任何事情。在這種模式下,每個登錄的用戶都可以完全控制Jenkins。根據高級選項,還可以允許或拒絕匿名用戶讀取Jenkins的訪問權限。此模式有助於強制用戶在執行操作之前登錄,以便有用戶操作的審計跟蹤。
-
基於矩陣的安全性。該授權方案可以精確控制哪些用戶和組能夠在Jenkins環境中執行哪些操作。
-
基於項目的矩陣授權策略。此授權方案是基於Matrix的安全性的擴展,允許在項目配置屏幕中單獨為每個項目定義附加的訪問控制列表(ACL)。這允許授予特定用戶或組訪問指定的項目,而不是Jenkins環境中的所有項目。使用基於項目的矩陣授權定義的ACL是加法的,使得在“配置全局安全性”屏幕中定義的訪問權限將與項目特定的ACL組合。
上圖表中的每一行表示用戶或組(也稱為“角色”)。這包括名為“匿名”和“認證”的特殊條目。“匿名”條目表示授予訪問Jenkins環境的所有未認證用戶的權限。而“已認證”用於向訪問環境的所有經過身份驗證的用戶授予權限。
矩陣中授予的權限是加法的。例如,如果用戶“kohsuke”在“開發人員”和“管理員”組中,則授予“kohsuke”的權限將包含授予給“kohsuke”,“開發人員”,“管理員” ,“認證”和“匿名”的所有權限。
選用與認證和用戶管理相關的插件
Jenkins提供一系列與認證和用戶管理相關的插件,用戶可以根據業務需求安裝使用(https://plugins.jenkins.io/) 。例如:
-
Active Directory Plugin:允許使用Microsoft Active Directory(即Windows域賬號)進行認證。
-
Crowd Plugin:允許使用Atlassian Crowd進行認證。
-
Script Security Realm Plugin:允許使用自定義的腳本進行認證。
-
Role Strategy Plugin:提供了基於角色的授權策略,允許定義全局的和項目集的角色,並為用戶分配相應角色。
啟用CSRF保護
跨站點請求偽造(或CSRF/XSRF)是一種漏洞,它允許未經授權的第三方通過模仿另一個經過身份驗證的用戶對Web應用程序執行請求。在Jenkins環境的上下文中,CSRF攻擊可能允許惡意actor刪除項目,更改構建或修改Jenkins的系統配置。
為了防范此類漏洞,自2.0以來所有Jenkins版本,在默認情況下都已啟用CSRF保護。
啟用該選項后,Jenkins將會在可能更改Jenkins環境中的數據的任何請求上檢查CSRF令牌或“crumb”。這包括任何表單提交和對遠程API的調用,包括使用“基本”身份驗證的表單。
但是,CSRF保護可能會對Jenkins更高級的使用帶來挑戰,例如:
- 某些Jenkins功能(如遠程API)在啟用此選項時變得更難使用。
- 通過配置不正確的反向代理訪問Jenkins,可能使CSRF HTTP頭被從請求中刪除,導致受保護的操作失敗。
- 未經過CSRF保護測試的過時插件可能無法正常工作。