【问题标题】:Jenkins pipeline library calls inside closures cause security exceptions闭包内的 Jenkins 管道库调用导致安全异常
【发布时间】:2018-07-22 23:14:36
【问题描述】:

我们正在使用带有组织文件夹的多分支管道(Bitbucket 分支源插件)。我正在使用共享库干燥我们的管道,从Jenkins docs 和论坛帖子中获取提示。我还向其他开发人员提供脚本,试图在希望一切“正常工作”的人和想要自定义的人之间取得平衡。

我编写了一个包含管道和默认步骤的共享库。这个库是在 Jenkins 的文件夹级别配置的。

jenkins-lib
    vars
        pipeline_main.groovy
        pipeline_pullRequest.groovy
        ...
        default_init.groovy

pipeline_main.groovy 进行一些初始化,如果存在带有键“init”的 Map 条目,则使用用户提供的阶段;如果没有,则使用 default_init

#!groovy

def call(Map config) {
    pipeline {
        agent any
        ...
        stages {
            stage ('Init') {
                steps {
                  script {
                     config['init'] ? config['init'](config) : default_init(config)
                  }
                }
            }
            ....
        }
    }
}

还有 Jenkins 文件:

@Library('repo/jenkins-lib') _

def customInit = { Map config ->
   echo 'Custom Init function override'
//   default_init(config)   // causes security exception if uncommented
}

if (env.BRANCH_NAME ==~ /PR-\d+/ ) {
    pipeline_pullRequest(maven: 'maven3.3.9')
}
else if (env.BRANCH_NAME ==~ /master|develop/ ) {
    pipeline_main(maven: 'maven3.3.9', init: customInit)
}
else {
    pipeline_feature(maven: 'maven3.3.9')
}

当只使用默认值时,调用库中定义的管道效果很好。

现在,请注意 Jenkinsfile 中的 customInit 方法。为了进行测试,我添加了一条调试行并从库中调用了default_init 步骤。当我使用此配置 (default_init uncommented) 运行测试构建时,构建失败并出现安全异常:

org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException:脚本不允许使用方法 groovy.lang.GroovyObject invokeMethod java.lang.String java.lang.Object ...

如果customInit 方法只是echo 步骤,则管道成功执行。

我知道我可以将调用 invokeMethod 列入白名单,但我似乎应该尊重 Jenkins 发出的警告,即拒绝请求以避免可能的安全漏洞。而且,我知道我可以在全局 Jenkins 级别定义库以使其受信任;但是,如果可能的话,我更愿意坚持使用每个文件夹的方法。

我想知道为什么直接从 Jenkinsfile 调用的库方法不会调用安全异常,而封装在闭包中的库方法会调用?还是我只是错过了其他东西?

附: Jenkins 2.89.3、Bitbucket Branch Source 2.2.9、所有 'Pipeline: ...' 库的最新版本。

default_init.groovy 内容,如果重要的话:

#!groovy

import java.util.Map

def call(Map config) {
    echo sh(returnStdout: true, script: 'env | sort')
}

【问题讨论】:

  • 这听起来有点像JENKINS-26481,但已经解决了。 Jenkins Groovy 编译行为可能令人惊讶。

标签: jenkins jenkins-pipeline multibranch-pipeline


【解决方案1】:

我查看了 JENKINS-26481 和相关的 JIRA 问题。事实上,我认为这是 Jenkins 团队尚未解决的一个极端案例(还没有?)。

如果我在全局 Jenkins 级别定义库以使其受信任,那么它就像我想要的那样工作,没有例外。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多