Jenkins 管理安全

2018-08-26 10:48 更新
Jenkins從公司內(nèi)部網(wǎng)的工作站到達(dá)連接到公共互聯(lián)網(wǎng)的大功率服務(wù)器。為了安全地支持這種廣泛的安全和威脅配置文件,Jenkins提供了許多配置選項(xiàng),用于啟用,編輯或禁用各種安全功能。

從Jenkins 2.0開始,默認(rèn)情況下啟用了許多安全選項(xiàng),以確保Jenkins環(huán)境保持安全,除非管理員明確禁用某些保護(hù)。

本節(jié)將介紹Jenkins管理員可用的各種安全選項(xiàng),解釋所提供的保護(hù)措施,并對其中某些功能進(jìn)行權(quán)衡。

啟用安全性

選中“ 啟用安全性”復(fù)選框后,自Jenkins 2.0起是默認(rèn)啟用安全性復(fù)選框,用戶可以使用用戶名和密碼登錄,以執(zhí)行匿名用戶不可用的操作。哪些操作要求用戶登錄取決于所選擇的授權(quán)策略及其配置; 默認(rèn)情況下,匿名用戶沒有權(quán)限,并且登錄的用戶具有完全的控制權(quán)。對于任何非本地(測試)Jenkins環(huán)境,應(yīng)始終啟用此復(fù)選框。

Web UI的“啟用安全性”部分允許Jenkins管理員啟用,配置或禁用適用于整個(gè)Jenkins環(huán)境的關(guān)鍵安全功能。

Jenkins 管理安全

NLP TCP端口

Jenkins使用TCP端口與通過JNLP協(xié)議啟動的代理(如基于Windows的代理)進(jìn)行通信。截至Jenkins 2.0,默認(rèn)情況下此端口被禁用。

對于希望使用基于JNLP的代理的管理員,兩個(gè)端口選項(xiàng)是:

  1. 隨機(jī):JNLP端口是隨機(jī)選擇的,以避免Jenkins主機(jī)發(fā)生沖突 。隨機(jī)JNLP端口的缺點(diǎn)是在Jenkins主引導(dǎo)期間選擇它們,這使得難以管理允許JNLP流量的防火墻規(guī)則。
  2. 固定:JNPP端口由Jenkins管理員選擇,并且在Jenkins主控器的重新啟動之間是一致的。這使得管理防火墻規(guī)則更容易,允許基于JNLP的代理連接到主服務(wù)器。

訪問控制

訪問控制是保護(hù)Jenkins環(huán)境免受未經(jīng)授權(quán)的使用的主要機(jī)制。在Jenkins中配置訪問控制需要兩個(gè)方面的配置:

  1. 一個(gè)安全域,其通知Jenkins環(huán)境如何以及在哪里獲取用戶(或標(biāo)識)的信息。也被稱為“認(rèn)證”。
  2. 授權(quán)配置,通知Jenkins環(huán)境,哪些用戶和/或組在多大程度上可以訪問Jenkins的哪些方面。

使用安全領(lǐng)域和授權(quán)配置,可以在Jenkins中配置非常輕松或非常剛性的身份驗(yàn)證和授權(quán)方案。

此外,一些插件(如 基于角色的授權(quán)策略) 插件可以擴(kuò)展Jenkins的訪問控制功能,以支持更細(xì)微的身份驗(yàn)證和授權(quán)方案。

安全領(lǐng)域

默認(rèn)情況下Jenkins包括對幾個(gè)不同安全領(lǐng)域的支持:

委托給servlet容器

用于委托身份驗(yàn)證運(yùn)行Jenkins主服務(wù)器的servlet容器,如 Jetty。如果使用此選項(xiàng),請參閱servlet容器的身份驗(yàn)證文檔。

Jenkins自己的用戶數(shù)據(jù)庫

使用Jenkins自己的內(nèi)置用戶數(shù)據(jù)存儲進(jìn)行身份驗(yàn)證,而不是委派給外部系統(tǒng)。默認(rèn)情況下,這將啟用新的Jenkins 2.0或更高版本的安裝,適用于較小的環(huán)境。

LDAP

將所有身份驗(yàn)證委托給配置的LDAP服務(wù)器,包括用戶和組。對于已經(jīng)配置了外部身份提供程序(如LDAP)的組織中的較大安裝,此選項(xiàng)更為常見。這也支持Active Directory安裝。

此功能由可能未安裝在您的實(shí)例上的LDAP插件提供。

Unix用戶/組數(shù)據(jù)庫

將認(rèn)證委托給Jenkins主服務(wù)器上的底層Unix操作系統(tǒng)級用戶數(shù)據(jù)庫。此模式還允許重新使用Unix組進(jìn)行授權(quán)。例如,Jenkins可以配置為“ developers群組中的所有人都具有管理員訪問權(quán)限”。為了支持此功能,Jenkins依賴于 PAM ,可能需要在Jenkins環(huán)境外配置。

插件可以提供額外的安全領(lǐng)域,這對于將Jenkins納入現(xiàn)有身份系統(tǒng)可能是有用的,例如:

授權(quán)

安全領(lǐng)域或認(rèn)證表明誰可以訪問Jenkins環(huán)境。另一個(gè)謎題是授權(quán),這表明他們可以在Jenkins環(huán)境中訪問什么。默認(rèn)情況下,Jenkins支持幾個(gè)不同的授權(quán)選項(xiàng):

所有人都可以控制Jenkins

每個(gè)人都可以完全控制Jenkins,包括尚未登錄的匿名用戶。請勿將本設(shè)置用于本地測試Jenkins管理以外的任何其他設(shè)置。

傳統(tǒng)模式

與Jenkins<1.164完全一樣。也就是說,如果用戶具有“admin”角色,他們將被授予對系統(tǒng)的完全控制權(quán),否則(包括匿名用戶)將僅具有讀訪問權(quán)限。不要將本設(shè)置用于本地測試Jenkins

管理以外的任何設(shè)置。

登錄用戶可以做任何事情

在這種模式下,每個(gè)登錄的用戶都可以完全控制Jenkins。根據(jù)高級選項(xiàng),匿名用戶可以讀取Jenkins的訪問權(quán)限,也可以不訪問。此模式有助于強(qiáng)制用戶在執(zhí)行操作之前登錄,以便有用戶操作的審計(jì)跟蹤。

基于矩陣的安全性

該授權(quán)方案可以精確控制哪些用戶和組能夠在Jenkins環(huán)境中執(zhí)行哪些操作(請參見下面的屏幕截圖)。

基于項(xiàng)目的矩陣授權(quán)策略

此授權(quán)方案是基于Matrix的安全性的擴(kuò)展,允許在項(xiàng)目配置屏幕中單獨(dú)為每個(gè)項(xiàng)目定義附加的訪問控制列表(ACL)。這允許授予特定用戶或組訪問指定的項(xiàng)目,而不是Jenkins環(huán)境中的所有項(xiàng)目。使用基于項(xiàng)目的矩陣授權(quán)定義的ACL是加法的,使得在“配置全局安全性”屏幕中定義的訪問權(quán)限將與項(xiàng)目特定的ACL組合。

基于矩陣的安全性和基于項(xiàng)目的矩陣授權(quán)策略由Matrix授權(quán)策略插件提供,可能不會安裝在您的Jenkins上。

對于大多數(shù)Jenkins環(huán)境,基于Matrix的安全性提供最大的安全性和靈活性,因此建議將其作為“生產(chǎn)”環(huán)境的起點(diǎn)。

configure-global-security-matrix-authorization

圖1.基于矩陣的安全性

上面顯示的表可以變得相當(dāng)寬泛,因?yàn)槊恳涣卸急硎居蒍enkins核心或插件提供的權(quán)限。將鼠標(biāo)懸停在權(quán)限上將顯示有關(guān)權(quán)限的更多信息。

表中的每一行表示用戶或組(也稱為“角色”)。這包括名為“匿名”和“認(rèn)證”的特殊條目。“匿名”條目表示授予訪問Jenkins環(huán)境的所有未認(rèn)證用戶的權(quán)限。而“已認(rèn)證”可用于向訪問環(huán)境的所有經(jīng)過身份驗(yàn)證的用戶授予權(quán)限。

矩陣中授予的權(quán)限是加法的。例如,如果用戶“kohsuke”在“開發(fā)人員”和“管理員”組中,則授予“kohsuke”的權(quán)限將是授予“kohsuke”,“開發(fā)人員”,“管理員” ,“認(rèn)證”和“匿名”。

標(biāo)記格式器

Jenkins允許用戶輸入許多不同的配置字段和文本區(qū)域,這可能會導(dǎo)致用戶無意或惡意地插入不安全的HTML和/或JavaScript。

默認(rèn)情況下,“ 標(biāo)記格式化程序”配置設(shè)置為“ 純文本”,將會轉(zhuǎn)義不安全的字符,例如<和&其各自的字符實(shí)體。

使用安全的HTML標(biāo)記格式化程序允許用戶和管理員將有用的和信息的HTML片段注入到項(xiàng)目描述和其他地方。

跨站點(diǎn)請求偽造

跨站點(diǎn)請求偽造(或CSRF / XSRF)是一種漏洞,它允許未經(jīng)授權(quán)的第三方通過模仿另一個(gè)經(jīng)過身份驗(yàn)證的用戶對Web應(yīng)用程序執(zhí)行請求。在Jenkins環(huán)境的上下文中,CSRF攻擊可能允許惡意actor刪除項(xiàng)目,更改構(gòu)建或修改Jenkins的系統(tǒng)配置。為了防范此類漏洞,默認(rèn)情況下,CSRF保護(hù)已啟用,所有Jenkins版本自2.0以來。

configure-global-security-prevent-csrf

啟用該選項(xiàng)后,Jenkins將會在可能更改Jenkins環(huán)境中的數(shù)據(jù)的任何請求上檢查CSRF令牌或“crumb”。這包括任何表單提交和對遠(yuǎn)程API的調(diào)用,包括使用“基本”身份驗(yàn)證的表單。

這是強(qiáng)烈建議這個(gè)選項(xiàng)不要被啟用,包括私人,完全可信的網(wǎng)絡(luò)運(yùn)行情況。

注意事項(xiàng)

CSRF保護(hù)可能會對 Jenkins更高級的使用帶來挑戰(zhàn),例如:

  • 某些Jenkins功能(如遠(yuǎn)程API)在啟用此選項(xiàng)時(shí)更難使用。
  • 通過配置不正確的反向代理訪問Jenkins可能會導(dǎo)致CSRF HTTP頭被從請求中刪除,導(dǎo)致受保護(hù)的操作失敗。
  • 未經(jīng)使用CSRF保護(hù)測試的過時(shí)插件可能無法正常工作。

有關(guān)CSRF漏洞的更多信息,請參見 OWASP網(wǎng)站。

代理/主訪問控制

在概念上,Jenkins的管理員和代理人可以被認(rèn)為是一個(gè)凝聚力的系統(tǒng),恰好在多個(gè)離散的過程和機(jī)器上執(zhí)行。這允許代理向主進(jìn)程請求可用的信息,例如文件的內(nèi)容等。

對于Jenkins管理員可能啟用由其他團(tuán)隊(duì)或組織提供的代理的較大或成熟的Jenkins環(huán)境,平面代理/主信任模型不足。

引入了代理/主訪問控制系統(tǒng),允許Jenkins管理員在Jenkins主服務(wù)器和連接的代理程序之間添加更精細(xì)的訪問控制定義。

configure-global-security-enable-agent-master

從Jenkins 2.0開始,該子系統(tǒng)默認(rèn)啟用。

自定義訪問

對于可能希望允許從代理到Jenkins主機(jī)的某些訪問模式的高級用戶,Jenkins允許管理員從內(nèi)置訪問控制規(guī)則創(chuàng)建特定的豁免。

configure-global-security-access-control-rules

通過遵循上面突出顯示的鏈接,管理員可以編輯命令和文件訪問代理/主訪問控制規(guī)則。

命令

Jenkins及其插件中的“命令”通過其完全限定的類名來標(biāo)識。大多數(shù)這些命令旨在通過主機(jī)的請求在代理上執(zhí)行,但是其中一些命令旨在通過代理的請求在主機(jī)上執(zhí)行。

尚未更新的此子系統(tǒng)的插件可能不會對每個(gè)命令所屬的類別進(jìn)行分類,以便當(dāng)代理請求主機(jī)執(zhí)行不明確允許的命令時(shí),Jenkins將錯(cuò)誤地注意并拒絕執(zhí)行該命令。

在這種情況下,Jenkins管理員可能會將某些命令列入白名單 ,以便在主服務(wù)器上執(zhí)行。

configure-global-security-whitelist-commands

高級

管理員也可以通過.conf 在目錄中創(chuàng)建具有擴(kuò)展名的文件來對類進(jìn)行白名單JENKINS_HOME/secrets/whitelisted-callables.d/。這些.conf文件的內(nèi)容應(yīng)該在單獨(dú)的行上列出命令名稱。

該目錄中的所有.conf文件的內(nèi)容將被Jenkins讀取并合并,default.conf在目錄中創(chuàng)建一個(gè)列出所有已知安全命令的文件。該default.conf文件將每次Jenkins啟動時(shí)重新編寫。

Jenkins還管理一個(gè)文件gui.conf,在whitelisted-callables.d 目錄中,通過Web UI添加的命令被寫入。為了禁用管理員從Web UI更改列入白名單的命令的能力,請gui.conf在目錄中放置一個(gè)空文件,并更改其權(quán)限,以便操作系統(tǒng)用戶Jenkins運(yùn)行時(shí)不能寫入。

文件訪問規(guī)則

文件訪問規(guī)則用于驗(yàn)證從代理向主設(shè)備提交的文件訪問請求。每個(gè)文件訪問規(guī)則是一個(gè)三元組,它必須包含以下每個(gè)元素:

  1. allow/ deny:如果以下兩個(gè)參數(shù)與正在考慮的當(dāng)前請求匹配,則allow條目將允許執(zhí)行請求,并且deny條目將拒絕該請求被拒絕,而不管稍后的規(guī)則如何。
  2. 操作:請求的操作的類型。存在以下6個(gè)值。操作也可以通過逗號分隔值組合。all表示所有列出的操作的值被允許或拒絕。
  • read:讀取文件內(nèi)容或列出目錄條目
  • write:寫文件內(nèi)容
  • mkdirs:創(chuàng)建一個(gè)新的目錄
  • create:在現(xiàn)有目錄中創(chuàng)建一個(gè)文件
  • delete:刪除文件或目錄
  • stat:讀取文件/目錄的元數(shù)據(jù),例如時(shí)間戳,長度,文件訪問模式。

  3.文件路徑:指定與此規(guī)則匹配的文件路徑的正則表達(dá)式。除了基本的正則表達(dá)式語法之外,它還支持以下令牌:

  • <JENKINS_HOME>可以用作前綴來匹配主 JENKINS_HOME目錄。
  • <BUILDDIR>可以用作前綴來匹配構(gòu)建記錄目錄,比如/var/lib/jenkins/job/foo/builds/2014-10-17_12-34-56。
  • <BUILDID>匹配時(shí)間戳格式的構(gòu)建ID,如 2014-10-17_12-34-56。

這些規(guī)則是按照順序排列的,并被應(yīng)用于規(guī)則上。例如,以下規(guī)則允許訪問JENKINS_HOME 除secrets文件夾之外的所有文件:

# To avoid hassle of escaping every '\' on Windows, you can use / even on Windows.
deny all <JENKINS_HOME>/secrets/.*
allow all <JENKINS_HOME>/.*

規(guī)則非常重要!以下規(guī)則被錯(cuò)誤地寫入,因?yàn)榈诙l規(guī)則永遠(yuǎn)不會匹配,并允許所有代理訪問下列所有文件和文件夾JENKINS_HOME

allow all <JENKINS_HOME>/.*
deny all <JENKINS_HOME>/secrets/.*
高級

管理員還可以通過.conf.在目錄中創(chuàng)建擴(kuò)展名的文件來添加文件訪問規(guī)則 JENKINS_HOME/secrets/filepath-filters.d/。Jenkins本身30-default.conf在此目錄中的引導(dǎo)時(shí)生成文件,其中包含默認(rèn)值,被認(rèn)為是Jenkins項(xiàng)目的兼容性和安全性之間的最佳平衡。為了禁用這些內(nèi)置的默認(rèn)值,請?zhí)鎿Q30-default.conf為操作系統(tǒng)用戶Jenkins不能寫入的空文件。

在每次啟動時(shí),Jenkins將以 字母順序讀取目錄中的所有.conf文件filepath-filters.d,因此,以表示其加載順序的方式命名文件是一種好習(xí)慣。

Jenkins還管理50-gui.conf,在filepath-filters/目錄中,其中通過網(wǎng)絡(luò)用戶界面添加文件訪問規(guī)則寫入。為了禁止管理員從Web UI更改文件訪問規(guī)則的能力,請將空50-gui.conf文件放在目錄中,并更改其權(quán)限,以便操作系統(tǒng)用戶Jenkins運(yùn)行時(shí)不能寫入。

禁用

雖然不推薦使用,但如果Jenkins環(huán)境中的所有代理程序都可以被認(rèn)為與主機(jī)信任的程度相當(dāng)“受信任”,則可能會禁用代理/主訪問控制功能。

此外,Jenkins環(huán)境中的所有用戶都應(yīng)具有對所有已配置項(xiàng)目的訪問級別。

管理員可以通過取消選中“ 配置全局安全性”頁面上的框來禁用Web UI中的代理/主訪問控制。或者,管理員可以使用內(nèi)容JENKINS_HOME/secrets命名 并重新啟動Jenkins 來創(chuàng)建一個(gè)文件。slave-to-master-security-kill-switchtrue

大多數(shù)Jenkins環(huán)境隨著時(shí)間的推移需要他們的信任模型隨著環(huán)境的增長而發(fā)展。請考慮安排定期的“檢查”以查看是否應(yīng)重新啟用所有已禁用的安全設(shè)置。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號