Jenkins 进程内脚本审批

Jenkins 及多个插件允许用户在 Jenkins 中执行 Groovy 脚本。提供这些能力的功能包括:

  • 脚本控制台。
  • Jenkins Pipeline。
  • Extended Email 插件。
  • Groovy 插件中的“Execute system Groovy script”步骤。
  • JobDSL 插件 1.60 及更新版本。

为了防止恶意脚本危害 Jenkins,这些插件会在 Groovy 沙箱中执行用户提供的脚本,限制它们能够访问的内部 API。此保护由 Script Security 插件提供。一旦脚本使用了不安全的方法,管理员就可以通过“管理 Jenkins”中的“In-process Script Approval”(进程内脚本审批)允许该方法。启用不安全的方法之前,必须认真考虑其影响。

Entering the In-process Script Approval configuration

进入进程内脚本审批配置。

入门

Script Security 插件由安装后设置向导自动安装,但初始状态下,没有任何额外脚本或操作获得批准。

旧版插件可能不安全。请查看 Script Security 插件页面列出的安全警告,确保使用的是最新版本。

进程内脚本的安全性由两种机制提供:Groovy 沙箱和脚本审批。Groovy 沙箱在 Jenkins Pipeline 中默认启用,使用户提供的脚本式、声明式 Pipeline 可以在不需要管理员预先介入的情况下执行。脚本审批则允许管理员批准或拒绝不使用沙箱的脚本,或允许沙箱脚本执行额外的方法。

对大多数系统而言,Groovy 沙箱与 Script Security 内置的已批准方法签名列表已经足够。强烈建议管理员只有在确有必要时才偏离这些默认设置。

Groovy 沙箱

为了减少管理员的手动介入,包括全部 Jenkins Pipeline 在内的大多数脚本默认运行在 Groovy 沙箱中。沙箱只允许执行一部分被认为足够安全、可以供“不受信任”访问使用的 Groovy 方法,而无需预先批准。所有使用 Groovy 沙箱的脚本都受到相同限制。因此,管理员编写的 Pipeline 也与非管理员用户编写的 Pipeline 一样受到限制。

如果脚本尝试使用沙箱未授权的功能或方法,它会立即停止。下面的 Jenkins Pipeline 展示了这一情况:

Sandbox method rejection

图 1:Blue Ocean 显示在运行时拒绝未授权的方法签名。

上述 Pipeline 在管理员通过进程内脚本审批页面批准该方法签名之前,不会执行。

除了添加获准的方法签名,用户也可以完全禁用 Groovy 沙箱,如下图所示。禁用沙箱后,管理员必须审阅整个脚本并手动批准。

Creating a Scripted Pipeline and unchecking 'Use Groovy Sandbox'

图 2:为 Pipeline 禁用 Groovy 沙箱。

脚本审批

管理员手动批准整个脚本或方法签名,为进程内脚本的高级用法提供了更多灵活性。禁用 Groovy 沙箱,或者调用内置列表以外的方法时,Script Security 插件会检查管理员维护的已批准脚本和方法列表。

一个脚本一旦获得批准,就可以用于任何集成了脚本审批机制的 Jenkins 功能或插件。审批不局限于某个作业,也不局限于该脚本的某一种具体用途。因此,审批脚本时必须谨慎,确保用户提供的参数无法被用来利用控制器漏洞。

对于希望在 Groovy 沙箱外执行的脚本,管理员必须在进程内脚本审批页面批准整个脚本:

Approving an unsandboxed Scripted Pipeline

图 3:批准一个不使用沙箱的脚本式 Pipeline。

对于使用 Groovy 沙箱、但希望调用当前尚未批准的方法签名的脚本,Jenkins 同样会中止执行。只有管理员批准相应方法签名后,脚本才获准执行:

Approving a new method signature

图 4:批准新的方法签名。

在进行权限检查的前提下批准

脚本审批提供三个选项:“Approve”(批准)、“Deny”(拒绝)和“Approve assuming permissions check”(在进行权限检查的前提下批准)。前两者的用途很直观;要理解第三个选项,则需要了解脚本能够访问哪些内部数据,以及 Jenkins 内部如何进行权限检查。

例如,脚本调用 hudson.model.AbstractItem.getParent()。这个方法本身没有危害,它返回一个对象,表示当前执行的 Pipeline 或作业所在的文件夹或根项目。随后调用 hudson.model.ItemGroup.getItems(),列出文件夹或根项目中的项目时,则需要 Job/Read 权限。

这意味着,直接批准 hudson.model.ItemGroup.getItems() 方法签名,可能让脚本绕过内置权限检查。

通常更合适的选择是“Approve assuming permissions check”:脚本审批引擎仅在运行脚本的用户拥有执行该方法所需权限时,才允许该方法签名。这里的例子需要的就是 Job/Read 权限。


原文:In-process Script Approval。作者/维护方:Jenkins 文档维护者。本文为中文翻译,代码及命令保留原文。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容