Jenkins 内容安全策略

36

我对Jenkins内容安全策略感到困惑。

我知道这些网站:

我有一个通过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等),但都无效。
所以我的问题如下:
  1. 我在哪里可以指定CSP配置?
  2. 是否可以使用内联样式?
  3. 样式应该放在哪里?我的css样式表在Jenkins服务器上本地存储。
  4. 满足内联样式和CSP规则的最佳方法是什么?
更新
尝试1:
-Dhudson.model.DirectoryBrowserSupport.CSP="default-src 'self'"在jenkins.xml文件中。 然后出现以下错误:
拒绝应用内联样式,因为它违反了以下内容安全策略指令:"default-src 'self'"。需要使用"unsafe-inline"关键字、哈希('sha256-')或nonce('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('nonce-...')来启用内联执行。
我知道这种尝试不能解决我的问题,因为default-src包括style-src。
尝试3:
-Dhudson.model.DirectoryBrowserSupport.CSP="default-src 'self'; style-src 'unsafe-inline'"在jenkins.xml文件中。 然后出现以下错误:
拒绝加载样式表s://jenkins/andsomedir/stylesheet.css [url被屏蔽],因为它违反了以下内容安全策略指令:"style-src 'unsafe-inline'"。

可以使用内联样式或位于Jenkins服务器上的文件中的样式。听起来你走在正确的轨道上,但你还没有发布确切尝试过什么(你使用了脚本控制台吗?你输入了什么?你将CSP参数设置为什么值?),所以很难指出哪里出了问题。 - Dave Bacher
感谢您的回答。我已经更新了我的帖子。 - Thomas
8个回答

54

在实验时,建议使用脚本控制台动态调整CSP参数,详见配置内容安全策略页面。(Jenkins维基页面中还有另一个注释表明,您可能需要强制重新加载页面才能看到新的设置。)

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

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

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

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


20
如果您不确定如何永久应用这些设置(因为通过“脚本控制台”进行的更改在Jenkins重新启动后会被丢弃),您可以将它们附加到 /etc/default/jenkins 中的JAVA_ARGS中:JAVA_ARGS="-Djava.awt.headless=true -Dhudson.model.DirectoryBrowserSupport.CSP=\"default-src 'self'; style-src 'self' 'unsafe-inline';\"" - Manuel
1
我必须在更改策略后清理浏览器缓存以反映更改。 - Lars Bilke
10
在启动时应用此方法的另一种方式是使用https://wiki.jenkins.io/display/JENKINS/Post-initialization+script。创建一个文件,如~jenkins/init.groovy.d/adjust-content-security-policy.groovy,其中包含单行System.setProperty(...),它将在Jenkins启动后执行。 - hshib
通过执行以下命令来删除'CSP'头本身,System.setProperty("hudson.model.DirectoryBrowserSupport.CSP", ""),这样做可以吗?我知道这会使jenkins不稳定,但现在我并不担心它。 - sjethvani
2
我认为@hshib的提议最为优雅且不会产生太多干扰。它非常有效。而JAVA_ARGS方法对我来说并没有起到作用。 - YaP

25

针对在Jenkins上永久设置CSP属性,以下是明确的步骤:

如果你正在运行Ubuntu系统下的Jenkins:

  1. $ vim /etc/default/jenkins
  2. 找到包含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:

  1. $ vim /etc/sysconfig/jenkins
  2. 找到包含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


1
你能帮我在Windows中永久设置它吗?我不确定我应该选择哪个文件。 - NarendraR
3
在Windows中,默认位置为 C:\Program Files\Jenkins\jenkins.xml。请确认。 - de.la.ru

5

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

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,你可以只使用“”:https://wiki.jenkins.io/display/JENKINS/Configuring+Content+Security+Policy - user158037
其他选项对我来说都不起作用,但这个可以。但我不建议这样做,因为它会打开很多门。 - Rvy Pandey
@user158037,不知怎么的,对我来说它没有起作用。 - kolukuri
1
@kolukuri 尝试使用以下代码:System.setProperty("hudson.model.DirectoryBrowserSupport.CSP", "sandbox allow-scripts; default-src 'self'; style-src 'self' 'unsafe-inline';") - Noam Manos

4
在下面的示例中,我设置了CSP="default-src 'self'; img-src 'self'; style-src 'self';",这足以使我的测试报告正确呈现,但您可以指定自己的策略。以下是Snyk报告的示例:
-Dhudson.model.DirectoryBrowserSupport.CSP=\"default-src 'self'; img-src \"*\" data:; style-src 'self' 'unsafe-inline';\" \

Jenkins系统服务的CSP覆盖

cat <<-'EOF' > /etc/systemd/system/jenkins.service.d/override.conf
[Service]
Environment="JAVA_OPTS=-Djava.awt.headless=true \
    -Dhudson.model.DirectoryBrowserSupport.CSP=\"default-src 'self'; img-src 'self'; style-src 'self';\""
EOF

# Restart Jenkins
systemctl daemon-reload
systemctl restart jenkins

Jenkins系统V的CSP覆盖

# Use correct config file:
# - Red Hat: /etc/sysconfig/jenkins
# - Debian: /etc/default/jenkins
cat <<-'EOF' >> /etc/sysconfig/jenkins
JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true \
    -Dhudson.model.DirectoryBrowserSupport.CSP=\"default-src 'self'; img-src 'self'; style-src 'self';\""

# Restart Jenkins
service jenkins restart

这是正确的答案。 - gjjhhh_

1
为了补充@Kirill的回答...
如果jenkins部署在tomcat容器中,可以在setenv.sh文件(位于${CATALINA_BASE}/bin文件夹中)中设置CATALINA_OPTS环境变量值,如下所示:
如果jenkins部署在tomcat容器中,可以在setenv.sh文件(位于${CATALINA_BASE}/bin文件夹中)中设置CATALINA_OPTS环境变量值,如下所示:
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文件。


1

我尝试分享我通常遵循以下这些解决方案的步骤。但是,您需要注意您的安全限制,因为应用这些修复程序可能存在潜在的不安全性。

  1. 临时修复:

转到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


0

我也遇到了类似的问题。下面的解决方案对我有用。

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

0

升级到Jenkins 2.346.1后,“JENKINS_JAVA_OPTIONS”变量对Jenkins CSP没有影响(我不知道为什么),所以我将其重命名为“JAVA_OPTS”,现在它又可以正常工作了。

这是我在Jenkins Kubernetes-Plugin中使用的JAVA_OPTS值:

-Dpermissive-script-security.enabled=true 
-Dhudson.model.DirectoryBrowserSupport.CSP="sandbox allow-scripts;
 default-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline';"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接