- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我编写了一些在 Jenkins Pipelines 中使用的常规实用方法。一个简单的例子是:
// src/org/package/utils.groovy
def remove_file(String file) {
new File(file).delete()
}
但是,正如预期的那样,这会在 Jenkins Pipeline 中引发以下异常:
org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: Scripts not permitted to use new java.io.File java.lang.String
根据Script Security Plugin documentation ,我可以使用 @Whitelisted
方法注释绕过这个:
@Whitelisted
def remove_file(String file) {
new File(file).delete()
}
根据这个question ,我可以使用 @NonCPS
注释绕过这个问题(并且此方法中的代码当然不必是可序列化的):
@NonCPS
def remove_file(String file) {
new File(file).delete()
}
共享库正在全局变量中使用,如下所示:
// vars/var.groovy
import org.package.utils
def method(body) {
...
new utils().remove_file('file')
...
}
正在 Jenkinsfile 中导入和使用库/var,如下所示:
library identifier: 'lib@master', retriever: modernSCM(
[$class: 'GitSCMSource',
remote: 'https://github.com/org/repo.git'])
pipeline {
...
script {
var.method {
// body
}
}
...
}
在列出的基于代码的导入 Pipeline 共享库的方法中,我上面使用的方法似乎是唯一真正适用于标准 Jenkins Pipeline 插件集的方法,因此这就是我采用的方法。
这两个都未能绕过 Jenkins Pipeline 抛出的安全异常。使用代码绕过脚本安全插件并避免手动/人为错误解决方案(例如修改 GUI 中的白名单)的最佳解决方案是什么?
最佳答案
根据您最后的评论以及您对原始问题的更新,我想我了解发生了什么。我将尝试澄清全局共享库和“常规”共享库之间的差异。
<小时/>(在撰写本文时)有几种不同的方法可以向 Jenkins 实例注册共享库。
Folder
- 文件夹中的所有项目都有可用的管道库库注册需要一些设置:
library
步骤和 @Library
注释一起使用的库名称@Library
或 library
)Global Shared Libraries上面提到的绕过安全沙箱,这意味着他们可以做任何事情。这是一些相关的documentation :
Since these libraries will be globally usable, any Pipeline in the system can utilize functionality implemented in these libraries.
These libraries are considered "trusted:" they can run any methods in Java, Groovy, Jenkins internal APIs, Jenkins plugins, or third-party libraries. This allows you to define libraries which encapsulate individually unsafe APIs in a higher-level wrapper safe for use from any Pipeline. Beware that anyone able to push commits to this SCM repository could obtain unlimited access to Jenkins. You need the
Overall/RunScripts
permission to configure these libraries (normally this will be granted to Jenkins administrators).
这些是唯一绕过安全沙箱检查的管道库。其他类型(例如 Folder 库)经过安全检查,这意味着您无法执行诸如 new File(file).delete()
之类的操作。
在管道中,用户可以访问所有可用的共享库。从安装或文件夹隐式加载的库(上面注明为隐式加载选项)在脚本类路径上自动可用。必须使用 @Library
注释或 library
步骤引入其他库。
例如,假设您有一个包含以下选项的库:
my-shared-lib
master
false
true
从管道中提取此特定库的几种方法是:
@Library('my-shared-lib')
- 与默认版本一起使用@Library('my-shared-lib@develop')
- 与 develop
的覆盖版本一起使用def myLib = library('my-shared-lib@develop')
- 与 develop
的重写版本一起使用这些都将使用之前配置的库。
在您的示例中,您使用的是 library
步骤,但从远程存储库动态加载,而不是使用注册版本。这也是您指定 retriever
参数的原因。请记住,任何不是全局共享库的库都无法绕过安全沙箱。
如果您想让您的库绕过沙箱,您需要在 Jenkins 安装中将其注册为全局共享库。
关于 new File(file).delete()
的旁注 - 在 Jenkins 管道内编写“正常”Groovy 时要小心(请参阅此 answer 了解一些详细原因)。
关于jenkins - 绕过代码中的脚本安全插件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48170958/
我正在学习 Spring 安全性,但我对它的灵活性感到困惑.. 我知道我可以通过在标签中定义规则来保护网址 然后我看到有一个@secure 注释可以保护方法。 然后还有其他注释来保护域(或 POJO)
假设有一个 key 加密 key 位于内存中并且未写入文件或数据库... byte[] kek = new byte[32]; secureRandom.nextBytes(kek); byte[]
我有 Spring Security 3.2.0 RC1 的问题 我正在使用标签来连接我 这表示“方法‘setF
我正在创建一个使用 Node Js 服务器 API 的 Flutter 应用程序。对于授权,我决定将 JWT 与私钥/公钥一起使用。服务器和移动客户端之间的通信使用 HTTPS。 Flutter 应用
在过去的几年里,我一直在使用范围从 Raphael.js 的 javascript 库。至 D3 ,我已经为自己的教育操纵了来自网络各地的动画。我已经从各种 git 存储库下载了 js 脚本,例如 s
在 python 中实现身份验证的好方法是什么?已经存在的东西也很好。我需要它通过不受信任的网络连接进行身份验证。它不需要太高级,只要足以安全地获取通用密码即可。我查看了 ssl 模块。但那个模块让我
我正在尝试学习“如何在 Hadoop 中实现 Kerberos?”我已经看过这个文档 https://issues.apache.org/jira/browse/HADOOP-4487我还了解了基本的
我有一个带有 apache2、php、mysql 的生产服务器。我现在只有一个站点 (mysite.com) 作为虚拟主机。我想把 phpmyadmin、webalizer 和 webmin 放在那里
前些天在网上看到防火墙软件OPNsense,对其有了兴趣,以前写过一个其前面的一个软件M0n0wall( 关于m0n0wa
我在 Spring Boot 和 oauth2(由 Google 提供)上编写了 rest 后端,在 "/login" 上自动重定向。除了 web 的 oauth 之外,我还想在移动后端进行 Fire
我想调用类 Foo,它的构造函数中有抽象类 Base。我希望能够从派生自 Base 的 Derived 调用 Foo 并使用 Derived覆盖方法而不是 Base 的方法。 我只能按照指示使用原始指
如何提高 session 的安全性? $this->session->userdata('userid') 我一直在为我的 ajax 调用扔掉这个小坏蛋。有些情况我没有。然后我想,使用 DOM 中的
我目前正在为某些人提供程序集编译服务。他们可以在在线编辑器中输入汇编代码并进行编译。然后编译它时,代码通过ajax请求发送到我的服务器,编译并返回程序的输出。 但是,我想知道我可以做些什么来防止对服务
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
目前,我通过将 session 中的 key 与 MySQl 数据库中的相同 key 相匹配来验证用户 session 。我使用随机数重新生成 session ,该随机数在每个页面加载时都受 MD5
Microsoft 模式与实践团队提供了一个很棒的 pdf,称为:“构建安全的 asp.net 应用程序”。 microsoft pdf 由于它是为 .Net 1.0 编写的,所以现在有点旧了。有谁知
在 Lua 中,通常会使用 math.random 生成随机值和/或字符串。 & math.randomseed , 其中 os.time用于 math.randomseed . 然而,这种方法有一个
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我们有一个严重依赖 Ajax 的应用程序。确保对服务器端脚本的请求不是通过独立程序而是通过坐在浏览器上的实际用户的好方法是什么 最佳答案 真的没有。 通过浏览器发送的任何请求都可以由独立程序伪造。 归
我正在寻找使用 WebSockets 与我们的服务器通信来实现 web (angular) 和 iPhone 应用程序。在过去使用 HTTP 请求时,我们使用请求数据、url、时间戳等的哈希值来验证和
我是一名优秀的程序员,十分优秀!