Jenkins 内容安全政策

Jenkins Content Security Policy

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

我知道这些网站:

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

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

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

我想要的结果是这样的: Progressbar_WORKS

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

所以我现在的问题是:

  1. 我必须在哪里指定 CSP 配置?
  2. 是否可以使用内联样式?
  3. 样式应该放在哪里?我的 css-stylesheets 位于本地的 Jenkins 服务器上。
  4. 获取内联样式和 CSP 规则的最佳方法是什么"satisfied"

更新

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

Refused to apply inline style because it violates the following Content Security Policy directive: "default-src 'self'". Either the 'unsafe-inline' keyword, a hash ('sha256-'), or a nonce ('nonce-...') is required to enable inline execution. Note also that 'style-src' was not explicitly set, so 'default-src' is used as a fallback.

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

Refused to apply inline style because it violates the following Content Security Policy directive: "style-src 'self'". Either the 'unsafe-inline' keyword, a hash ('sha256-'), or a nonce ('nonce-...') is required to enable inline execution

我明白这个尝试不能解决我的问题,因为 default-src 包括 style-src

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

Refused to load the stylesheet s://jenkins/andsomedir/stylesheet.css [its https://... not allowed to post more than two links :(] because it violates the following Content Security Policy directive: "style-src 'unsafe-inline'".

在试验时,我建议使用脚本控制台动态调整 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 上永久设置此 CSP 属性。

如果你是 运行 詹金斯 Ubuntu:

  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:;\""

如果你是 运行 Jenkins on CentOS:

  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

为@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 publisher、maven plugin 等插件。它不适用于电子邮件 html 文件。

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

  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

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

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

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

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="default-src 'self'; img-src 'self'; style-src 'self';",这足以让我的测试报告正确呈现,但您可以指定自己的策略。

Jenkins CSP 覆盖 systemd

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

系统 V 的 Jenkins 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