Jenkins和許多插件允許用戶(hù)在Jenkins中執(zhí)行Groovy腳本。這些腳本功能由以下提供:
為了保護(hù)Jenkins不會(huì)執(zhí)行惡意腳本,這些插件在Groovy Sandbox中執(zhí)行用戶(hù)提供的腳本,可以限制可訪問(wèn)的內(nèi)部API。然后,管理員可以使用腳本安全性插件提供的“進(jìn)程內(nèi)腳本批準(zhǔn)”頁(yè)面來(lái)管理在Jenkins環(huán)境中應(yīng)該允許哪些不安全的方法(如果有的話)。
該腳本安全插件被自動(dòng)安裝后安裝設(shè)置向?qū)Вm然最初沒(méi)有額外的腳本或操作批準(zhǔn)使用。
這個(gè)插件的舊版本可能不安全使用。請(qǐng)查看腳本安全性插件頁(yè)面 中列出的安全警告,以確保腳本安全性插件是最新的。
進(jìn)程內(nèi)腳本的安全性由兩種不同的機(jī)制提供: Groovy Sandbox
Groovy Sandbox
和 Script Approval。第一個(gè)Groovy Sandbox默認(rèn)啟用Jenkins Pipeline,允許用戶(hù)提供的Scripted和Declarative Pipeline執(zhí)行,而無(wú)需事先管理員干預(yù)。第二個(gè)“腳本批準(zhǔn)”允許管理員批準(zhǔn)或拒絕未分組的腳本,或允許Sandbox腳本執(zhí)行其他方法。
在大多數(shù)情況下,Groovy Sandbox和 Script Security內(nèi)建的已批準(zhǔn)方法簽名列表的組合將足夠。強(qiáng)烈建議,如果絕對(duì)必要,管理員只會(huì)偏離這些默認(rèn)值。
為了減少管理員的手動(dòng)干預(yù),默認(rèn)情況下,大多數(shù)腳本將在Groovy Sandbox中運(yùn)行,包括所有 Jenkins Pipeline。Sandbox只允許Groovy的一些方法被認(rèn)為足夠安全,以便在未經(jīng)事先批準(zhǔn)的情況下執(zhí)行“不受信任”訪問(wèn)。使用Groovy Sandbox的腳本都受到相同的限制,因此由管理員編寫(xiě)的Pipeline將受到非管理用戶(hù)授權(quán)的限制。
當(dāng)腳本嘗試使用Sandbox未經(jīng)授權(quán)的功能或方法時(shí),腳本將立即停止,如下所示,Jenkins Pipeline
圖1.未經(jīng)授權(quán)的方法簽名在運(yùn)行時(shí)通過(guò)Blue Ocean被拒絕
在管理員通過(guò)“ 進(jìn)程內(nèi)腳本批準(zhǔn)”頁(yè)面批準(zhǔn)方法簽名之前,上述Pipeline將不會(huì)執(zhí)行 。
除了添加批準(zhǔn)的方法簽名,用戶(hù)還可以完全禁用Groovy Sandbox,如下所示。禁用Groovy Sandbox要求整個(gè)腳本必須經(jīng)過(guò)管理員審核并手動(dòng)批準(zhǔn)。
由管理員手動(dòng)批準(zhǔn)整個(gè)腳本或方法簽名,為管理員提供了額外的靈活性,以支持更高級(jí)的進(jìn)程內(nèi)腳本編寫(xiě)。當(dāng)Groovy Sandbox被禁用或者調(diào)用了內(nèi)置列表以外的方法時(shí),Script Security插件將檢查經(jīng)過(guò)管理員管理的已批準(zhǔn)腳本和方法列表。
對(duì)于希望在Groovy Sandbox之外執(zhí)行的腳本,管理員必須在“ 進(jìn)程內(nèi)腳本批準(zhǔn)”頁(yè)面中批準(zhǔn)整個(gè)腳本:
圖3.批準(zhǔn)一個(gè)unsandboxed Script Pipeline
對(duì)于使用Groovy Sandbox但是希望執(zhí)行當(dāng)前未經(jīng)批準(zhǔn)的方法簽名的腳本也將被Jenkins停止,并且要求管理員在腳本被允許執(zhí)行之前批準(zhǔn)特定的方法簽名:
圖4.批準(zhǔn)新的方法簽名
腳本批準(zhǔn)提供三個(gè)選項(xiàng):批準(zhǔn),拒絕和“批準(zhǔn)假設(shè)權(quán)限檢查”。雖然前兩者的目的是不言而喻的,但第三個(gè)要求需要對(duì)內(nèi)部數(shù)據(jù)腳本能夠訪問(wèn)的內(nèi)容以及Jenkins函數(shù)中的權(quán)限如何進(jìn)行一些額外的了解。
考慮訪問(wèn)該方法的腳本,該腳本 hudson.model.AbstractItem.getParent()本身是無(wú)害的,并返回一個(gè)包含當(dāng)前正在執(zhí)行的流水線或作業(yè)的文件夾或根目錄的對(duì)象。在該方法調(diào)用,執(zhí)行hudson.model.ItemGroup.getItems()(將列出文件夾或根項(xiàng)目中的項(xiàng)目)之后,需要該Job/Read權(quán)限。
這可能意味著批準(zhǔn)hudson.model.ItemGroup.getItems()方法簽名將允許腳本繞過(guò)內(nèi)置權(quán)限檢查。
相反,通常更需要單擊“ 批準(zhǔn)”假設(shè)權(quán)限檢查,這將導(dǎo)致腳本批準(zhǔn)引擎允許方法簽名,假設(shè)運(yùn)行該腳本的用戶(hù)具有執(zhí)行該方法的Job/Read權(quán)限,例如此示例中的權(quán)限。
更多建議: