Jenkins 内容安全政策

Posted

技术标签:

【中文标题】Jenkins 内容安全政策【英文标题】:Jenkins Content Security Policy 【发布时间】:2016-10-03 18:52:37 【问题描述】:

我对 感到困惑。

我知道这些网站:

Configuring Content Security Policy Content Security Policy Reference

我有一个通过 Jenkins Clover 插件显示的 html 页面。此html页面使用内联样式,例如:

<div class='greenbar' style='width:58px'>

div 元素可视化进度条。 使用默认的 Jenkins CSP 配置会导致以下结果: Progressbar_FAIL

我想要的结果如下所示: Progressbar_WORKS

我尝试放宽 CSP 规则,添加不同级别的参数组合(script-src、style-src)(self、unsafe-inline、..),但没有任何效果。

所以我现在的问题:

    我必须在哪里指定 CSP 配置? 是否可以使用内联样式? 样式应该放在哪里?我的 css 样式表位于 Jenkins 服务器的本地。 “满足”内联样式和 CSP 规则的最佳方法是什么

更新

1.尝试: -Dhudson.model.DirectoryBrowserSupport.CSP="default-src 'self' 在 jenkins.xml 文件中。然后出现如下错误:

拒绝应用内联样式,因为它违反了以下内容 内容安全策略指令:“default-src 'self'”。无论是 'unsafe-inline' 关键字、哈希 ('sha256-') 或随机数 ('nonce-...') 是启用内联执行所必需的。另请注意 'style-src' 没有明确设置,所以 'default-src' 被用作 后备。

2。试试 -Dhudson.model.DirectoryBrowserSupport.CSP="default-src 'self'; style-src 'self' 在 jenkins.xml 文件中。然后出现如下错误:

拒绝应用内联样式,因为它违反了以下内容 内容安全策略指令:“style-src 'self'”。无论是 'unsafe-inline' 关键字,一个哈希 ('sha256-') 或随机数 ('nonce-...') 是启用内联执行所必需的

我知道这个尝试不能解决我的问题,因为 default-src 包含 style-src

3.试试 -Dhudson.model.DirectoryBrowserSupport.CSP="default-src 'self'; style-src 'unsafe-inline' 在 jenkins.xml 文件中。然后出现如下错误:

拒绝加载样式表 s://jenkins/andsomedir/stylesheet.css [它的 https://... 不允许发布两个以上的链接 :(] 因为它违反了以下内容安全政策指令: "style-src 'unsafe-inline'"。

【问题讨论】:

可以使用内联样式或来自 Jenkins 服务器上的文件的样式。听起来您在正确的轨道上,但您还没有发布确切您尝试过的内容(您是否使用了脚本控制台?您输入了什么?您将 CSP 参数设置为什么值?),所以很难指出哪里出了问题。 感谢您的回答。更新了我的帖子。 【参考方案1】:

以下属性对我有用。以下属性允许所有外部服务器。

System.setProperty("hudson.model.DirectoryBrowserSupport.CSP", "default-src * 'unsafe-inline' 'unsafe-eval'; script-src * 'unsafe-inline' 'unsafe-eval'; connect-src * 'unsafe-inline'; img-src * data: blob: 'unsafe-inline'; frame-src *; style-src * 'unsafe-inline';")

【讨论】:

这几乎完全禁用了 CSP,你可以只使用 "": wiki.jenkins.io/display/JENKINS/… 其他选项对我不起作用,但确实如此。但我不建议这样做,因为它打开了很多大门。 @user158037,不知何故“”它对我不起作用【参考方案2】:

我也有类似的问题。以下解决方案对我有用。

java -Dhudson.model.DirectoryBrowserSupport.CSP="sandbox allow-scripts allow-popups allow-popups-to-escape-sandbox; style-src 'unsafe-inline' *;" -Dsvnkit.http.sslProtocols=TLSv1 -jar C:/server/Jenkins.war --httpPort=8280

【讨论】:

【参考方案3】:

为了分享我的程序,我总是遵循其中一种解决方法。但是,您需要注意您的安全限制,因为应用这些修复程序可能不安全。

    临时修复:

转到 Jenkins 控制台并根据您想要的 CSP 策略放松类型应用以下命令。

System.setProperty("hudson.model.DirectoryBrowserSupport.CSP", "sandbox allow-scripts; default-src 'self'; style-src 'self' 'unsafe-inline'; script-src * 'unsafe-inline';")

此解决方法适用于临时测试或开发环境。

如果您想永久更改它,请在运行应用程序时将其添加到 java 命令中:

-Dhudson.model.DirectoryBrowserSupport.CSP="sandbox allow-scripts; default-src 'self'; style-src 'self' 'unsafe-inline';"

最后我强烈建议你阅读这些文章:

Jenkins 官方文档 https://wiki.jenkins.io/display/JENKINS/Configuring+Content+Security+Policy

临时或永久重置 CSP 规则的解决方法: https://www.cyotek.com/blog/adjusting-the-jenkins-content-security-policy

【讨论】:

【参考方案4】:

要为@Kirill 的答案添加更多内容...

如果 jenkins 部署在 tomcat 容器中,请在 setenv.sh file 中设置 CATALINA_OPTS 环境值(存在于 $CATALINA_BASE/bin 文件夹中),如下所示:-

export CATALINA_OPTS="-Xmx2048m -Xms2048m -XX:MaxNewSize=768m -XX:-HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$CATALINA_BASE/logs/java.hprof -XX:ParallelGCThreads=2 -XX:-UseConcMarkSweepGC -Dcom.sun.management.jmxremote -Dhudson.model.DirectoryBrowserSupport.CSP=\"\" 

export CATALINA_OPTS="-Xmx2048m -Xms2048m -XX:MaxNewSize=768m -XX:-HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/software/jenkins/tomcat_jenkins/logs/java.hprof -XX:ParallelGCThreads=2 -XX:-UseConcMarkSweepGC -Dcom.sun.management.jmxremote -Dhudson.model.DirectoryBrowserSupport.CSP=\"sandbox allow-scripts; default-src 'self'; script-src *; 'unsafe-eval'; img-src *; style-src *; 'unsafe-inline'; font-src *;\

更改上述文件后,重新启动tomcat。它对我来说就像魅力一样。希望对你有帮助:)

注意:- CSP 仅适用于 HTML 发布者、maven 插件等插件。它不适用于电子邮件 html 文件。

【讨论】:

【参考方案5】:

只是要明确在 Jenkins 上永久设置此 CSP 属性。

如果您在 Ubuntu 上运行 Jenkins:

    $ vim /etc/default/jenkins 找到带有JAVA_ARGS 的行并像这样添加CSP 策略:JAVA_ARGS="-Djava.awt.headless=true -Dhudson.model.DirectoryBrowserSupport.CSP=\"default-src 'self' 'unsafe-inline' 'unsafe-eval'; img-src data:;\""

如果您在 CentOS 上运行 Jenkins:

    $ vim /etc/sysconfig/jenkins 找到带有JENKINS_JAVA_OPTIONS 的行并像这样添加CSP 策略:JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true -Dhudson.model.DirectoryBrowserSupport.CSP=\"default-src 'self' 'unsafe-inline' 'unsafe-eval'; img-src data:;\""

保存文件并重启 Jenkins。 $ sudo service jenkins restart 或在您的浏览器中http://localhost:8080/safeRestart

【讨论】:

你能帮我在windows中永久设置它吗?我不确定我必须选择哪个文件 Windows 中的默认位置是C:\Program Files\Jenkins\jenkins.xml。请检查。【参考方案6】:

在试验时,我建议使用脚本控制台来动态调整 CSP 参数,如Configuring Content Security Policy 页面上所述。 (Jenkins wiki 页面中有另一条注释表明您可能需要强制重新加载页面才能看到新设置。)

为了同时使用内联样式和本地样式表,您需要同时添加 selfunsafe-inline

System.setProperty("hudson.model.DirectoryBrowserSupport.CSP", "default-src 'self'; style-src 'self' 'unsafe-inline';")

根据进度条的操作方式,您可能还需要以相同的方式调整“script-src”。

找到有效的设置后,您可以调整 Jenkins 启动脚本以添加 CSP 参数定义。

【讨论】:

如果您不确定如何永久应用这些设置(因为通过脚本控制台进行的更改在 Jenkins 重启后会被丢弃),您可以将它们附加到 /etc/default/jenkins:JAVA_ARGS="-Djava.awt.headless=true -Dhudson.model.DirectoryBrowserSupport.CSP=\"default-src 'self'; style-src 'self' 'unsafe-inline';\"" 中的 JAVA_ARGS 中 我必须在更改要反映的策略后清理浏览器缓存。 在启动时应用它的另一种方法是使用wiki.jenkins.io/display/JENKINS/Post-initialization+script。创建一个文件,例如 ~jenkins/init.groovy.d/adjust-content-security-policy.groovy 一行 System.setProperty(...) ,它将在 Jenkins 启动后执行。 通过触发以下命令来删除“CSP”标头本身,System.setProperty("hudson.model.DirectoryBrowserSupport.CSP", "") 会这样吗?我知道这会使 jenkins 变得不稳定,但我现在不关心它。 我发现来自@hshib 的建议是最优雅且不那么打扰的。它就像一个魅力。无论如何,JAVA_ARGS 方法对我不起作用。

以上是关于Jenkins 内容安全政策的主要内容,如果未能解决你的问题,请参考以下文章

内容安全政策指令不适用于电子

Google 字体违反了内容安全政策

Cordova 内容安全政策

内容安全政策上的 Google 地图错误

我网站上的内容安全政策警告

Google analytics.js 和内容安全政策