Spinnaker:403请求中未包含有效的碎屑

Bal*_*hna 20 jenkins spinnaker

我按如下方式在大三角帆中配置了jenkins并设置了spinnaker管道.

 jenkins:
    # If you are integrating Jenkins, set its location here using the baseUrl
    # field and provide the username/password credentials.
    # You must also enable the "igor" service listed separately.
    #
    # If you have multiple jenkins servers, you will need to list
    # them in an igor-local.yml. See jenkins.masters in config/igor.yml.
    #
    # Note that jenkins is not installed with Spinnaker so you must obtain this
    # on your own if you are interested.
    enabled: ${services.igor.enabled:false}
    defaultMaster:
      name: default
      baseUrl: http://server:8080
      username: spinnaker
      password: password
Run Code Online (Sandbox Code Playgroud)

但是我在尝试运行spinnaker管道时看到以下错误.

Exception ( Start Jenkins Job ) 403 No valid crumb was included in the request

Bal*_*hna 29

要解决此问题,我在jenkins.com/configureSecurity部分取消选中"防止跨站点请求伪造攻击",它开始工作.

防止跨站点请求伪造攻击

  • 禁用此功能会降低Jenkins安装的安全性,请勿盲目执行此操作. (21认同)
  • 你能否提出一种可以解决这个问题而不会产生安全风险的替代方法?@ Yorik.sar (5认同)
  • 您无法再禁用此设置。Jenkins v2.303 中未出现该复选框 (2认同)

Ale*_*kin 17

对于 Jenkins 的新版本,您应该遵循以下解决方案:

https://jenkins.io/doc/upgrade-guide/2.176/#upgrading-to-jenkins-lts-2-176-3

升级到 Jenkins 2.176.2 改进 CSRF 保护

安全-626

CSRF 令牌(碎屑)现在仅对创建它们的 Web 会话有效,以限制攻击者获取它们的影响。使用 /crumbIssuer/api URL 获取 crumb 的脚本现在将无法执行受 CSRF 保护的操作,除非脚本在后续请求中保留 Web 会话 ID。脚本可以改为使用 API 令牌,自 Jenkins 2.96 以来不需要 CSRF 令牌(碎屑)。

要禁用此改进,您可以将系统属性 hudson.security.csrf.DefaultCrumbIssuer.EXCLUDE_SESSION_ID 设置为 true。或者,您可以安装 Strict Crumb Issuer Plugin,它提供了更多选项来自定义 crumb 验证。它允许从验证标准中排除 Web 会话 ID,而是例如将其替换为基于时间的过期,以获得类似(甚至更好)的 CSRF 保护

在我的情况下,帮助安装了 Strict Crumb Issuer Plugin,重新启动 jenkins 并按照供应商站点上的建议对 Jenkins 的 Web 界面应用不太严格的策略。


San*_*nan 15

最后,这篇文章帮助我解决了面包屑问题,但仍然使詹金斯免受CSRF攻击。

请求问题中包含无效面包屑的解决方案

基本上,我们需要首先请求带有身份验证的面包屑,然后再次发出带有身份验证的面包屑的POST api调用。

这就是我做的

curl -v -X GET http://jenkins-url:8080/crumbIssuer/api/json --user <username>:<password>
Run Code Online (Sandbox Code Playgroud)

回应是

{
"_class":"hudson.security.csrf.DefaultCrumbIssuer",
"crumb":"0db38413bd7ec9e98974f5213f7ead8b",
"crumbRequestField":"Jenkins-Crumb"
}
Run Code Online (Sandbox Code Playgroud)

然后,其中包含上面的屑信息的POST api。

curl -X POST http://jenkins-url:8080/job/<job-name>/build --user <username>:<password> -H 'Jenkins-Crumb: 0db38413bd7ec9e98974f5213f7ead8b'
Run Code Online (Sandbox Code Playgroud)

  • crumbIssuer 不应再用于脚本,请参阅 https://jenkins.io/redirect/crumb-cannot-be-used-for-script (4认同)
  • `crumbIssuer` 仍然可以使用,只是行为发生了变化 - 现在它也需要保存会话。除非您可以在脚本化请求之间使用相同的会话,否则您必须转向“TOKEN”身份验证。 (3认同)

ans*_*pta 13

Crumb只不过是访问令牌.下面是获取面包屑的api

https://jenkins.xxx.xxx.xxx/crumbIssuer/api/json //用您的jenkins网址替换它,并在邮递员或rest-api来电者中进行GET调用.

这将生成如下输出:

{
    "_class": "hudson.security.csrf.DefaultCrumbIssuer",
    "crumb": "ba4742b9d92606f4236456568a",
    "crumbRequestField": "Jenkins-Crumb"
}
Run Code Online (Sandbox Code Playgroud)

以下是与此相关的更多详细信息和链接: 如何为jenkins Jenkins wiki页面请求Crumb发行者:https: //wiki.jenkins-ci.org/display/jenkins/remote+access+api

如果您通过rest-api呼叫呼叫相同,请查看以下链接,其中说明了如何使用jenkins-crumb呼叫休息呼叫

https://blog.dahanne.net/2016/05/17/how-to-update-a-jenkins-job-posting-config-xml/

示例:

curl -X POST http://anthony:anthony@localhost:8080/jenkins/job/pof/config.xml --data-binary "@config.xml" -data ".crumb=6bbabc426436b72ec35e5ad4a4344687"
Run Code Online (Sandbox Code Playgroud)


Ara*_*n K 12

我通过使用API TOKEN作为基本身份验证密码解决了这个问题。这是如何

curl -v -X POST http://jenkins-url:8080/job/<job-name>/buildWithParameters?param=value --user <username>:<token>
Run Code Online (Sandbox Code Playgroud)

注意:要在帐户图标下创建API TOKEN -> 配置 -> API 令牌 -> 添加新令牌

  • 对于 CSRF 保护,首选 API 令牌而不是碎屑:来自 https://www.jenkins.io/doc/book/using/remote-access-api/ (2认同)

Gar*_*ary 8

您需要一个两步过程,首先从服务器获取碎片,然后使用它。

我正在使用这个 Bash 脚本和cURL

#!/bin/bash
# buildme.sh    Runs a build Jenkins build job that requires a crumb
# e.g.
# $ ./buildme.sh 'builderdude:monkey123' 'awesomebuildjob' 'http://paton.example.com:8080'
# Replace with your admin credentials, build job name and Jenkins URL
#
# More background:
# https://support.cloudbees.com/hc/en-us/articles/219257077-CSRF-Protection-Explained

USERPASSWORD=$1
JOB=$2
SERVER=$3

# File where web session cookie is saved
COOKIEJAR="$(mktemp)"
CRUMB=$(curl -f -u "$USERPASSWORD" --cookie-jar "$COOKIEJAR" "$SERVER/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,%22:%22,//crumb)")
status=$?
if [[ $status -eq 0 ]] ; then
  curl -f -X POST -u "$USERPASSWORD" --cookie "$COOKIEJAR" -H "$CRUMB" "$SERVER"/job/"$JOB"/build
  status=$?
fi
rm "$COOKIEJAR"
exit $status
Run Code Online (Sandbox Code Playgroud)

以下是使用所需参数执行此脚本的示例:

./buildme.sh 'builderdude:monkey123' 'awesomebuildjob'
Run Code Online (Sandbox Code Playgroud)

输出:

'http://paton.example.com:8080'
Run Code Online (Sandbox Code Playgroud)

如果 cURL 命令之一因任何原因失败,此脚本将返回错误代码。

更多详细信息可以从cloudbees找到。


sac*_*_ur 7

此解决方案使用起来很安全

当我们将jenkins更改为可通过反向代理访问时,出现了此问题。

在“ 配置全局安全性 ”中有一个选项“ 启用代理兼容性 ”,这有助于解决我的问题。

在此处输入图片说明

  • 只是关于我所发现的内容的站点注释: 1. 通过 JENKINS_URL/manage 访问此站点 2. 这适用于您在 nginx 代理后面使用 Jenkins 时。 (2认同)
  • 这帮助了我。勾选**启用代理兼容性**后,您需要单击**保存**而不是**应用**。就这样。谢谢。 (2认同)

mht*_*que 7

根据Jenkins 指令, 如果版本 < 2.176.2,您必须首先检查您的 Jenkins 版本,然后根据 Jenkins 指南 CSRF 令牌(碎屑)现在仅对创建它们的 Web 会话有效,以限制攻击者获取它们的影响。使用 /crumbIssuer/api URL 获取 crumb 的脚本现在将无法执行受 CSRF 保护的操作,除非脚本在后续请求中保留 Web 会话 ID。

或者,您可以安装 Strict Crumb Issuer Plugin,它提供了更多选项来自定义 crumb 验证。它允许从验证标准中排除 Web 会话 ID,而是例如将其替换为基于时间的过期,以获得类似(甚至更好)的 CSRF 保护。

脚步 :

  • 您必须安装名为“Strict Crumb Issuer”的插件
  • 安装好后重启jenkins服务
  • 转到“管理 Jenkins”-->“配置全局安全性”--> 在 CSRF 保护下,从下拉列表中选择“Strict Crumb 问题”--> 单击“高级”并取消选中所有内容,但选择“防止违规攻击”选项。--> 应用并保存。
  • 现在运行你的面包屑脚本。

它现在应该可以工作了。

检查此图像以供参考


San*_*osh 5

当我使用 jenkins-client 库(即com.offbytwo.jenkins)从 Java 程序创建 Jenkins 作业时,我确实遇到了相同的“403 请求中未包含有效的面包屑”错误。然后我在下面的代码中使用了 Jenkins API 令牌而不是密码。现在,问题已解决。

\n
JenkinsServer jServer = new JenkinsServer(new URI(jenkins_url), jnkn_username, jnkn_password);\n
Run Code Online (Sandbox Code Playgroud)\n

我们可以从 Jenkins 控制台生成 API 令牌。配置文件 \xe2\x86\x92 配置\xe2\x86\x92 API 令牌(添加新令牌)

\n

还可以使用相同的 API 令牌来代替curl 的密码。

\n
curl -v -X POST http://jenkins-url:port/job/<job-name>/buildWithParameters?param=value --user <jen_username>:<jenkins_api_token>\n
Run Code Online (Sandbox Code Playgroud)\n


小智 5

我花了很多时间试图解决这个问题。最后,我刚刚安装了插件Build Authorization Token Root并为匿名用户启用了构建权限。

最后并不重要,因为 Jenkins 实例位于 VPN 之后,我使用https://smee.io将 webhook 转发到 Jenkins 实例。

此外,Jenkins 实例位于反向代理后面,因此也会选中“启用代理兼容性”选项,并且在服务器级别的 Nginx 配置中将“ignore_invalid_headers”设置设置为关闭。我分享我的解决方案,以防其他人也遇到困难。我确信有更好的方法可以做到这一点,但这是一种选择。

请注意,使用此插件,构建 URL 设置为buildByToken/build?job=JobName&token=TokenValue,并且令牌是在作业设置中生成的。

这是 Jenkins 2.235.2 中的情况,它没有禁用 CSRF 的选项。