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部分取消选中"防止跨站点请求伪造攻击",它开始工作.
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)
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 令牌 -> 添加新令牌
您需要一个两步过程,首先从服务器获取碎片,然后使用它。
我正在使用这个 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 命令之一因任何原因失败,此脚本将返回错误代码。
此解决方案使用起来很安全
当我们将jenkins更改为可通过反向代理访问时,出现了此问题。
在“ 配置全局安全性 ”中有一个选项“ 启用代理兼容性 ”,这有助于解决我的问题。
根据Jenkins 指令, 如果版本 < 2.176.2,您必须首先检查您的 Jenkins 版本,然后根据 Jenkins 指南 CSRF 令牌(碎屑)现在仅对创建它们的 Web 会话有效,以限制攻击者获取它们的影响。使用 /crumbIssuer/api URL 获取 crumb 的脚本现在将无法执行受 CSRF 保护的操作,除非脚本在后续请求中保留 Web 会话 ID。
或者,您可以安装 Strict Crumb Issuer Plugin,它提供了更多选项来自定义 crumb 验证。它允许从验证标准中排除 Web 会话 ID,而是例如将其替换为基于时间的过期,以获得类似(甚至更好)的 CSRF 保护。
脚步 :
它现在应该可以工作了。
当我使用 jenkins-client 库(即com.offbytwo.jenkins)从 Java 程序创建 Jenkins 作业时,我确实遇到了相同的“403 请求中未包含有效的面包屑”错误。然后我在下面的代码中使用了 Jenkins API 令牌而不是密码。现在,问题已解决。
\nJenkinsServer jServer = new JenkinsServer(new URI(jenkins_url), jnkn_username, jnkn_password);\nRun Code Online (Sandbox Code Playgroud)\n我们可以从 Jenkins 控制台生成 API 令牌。配置文件 \xe2\x86\x92 配置\xe2\x86\x92 API 令牌(添加新令牌)。
\n还可以使用相同的 API 令牌来代替curl 的密码。
\ncurl -v -X POST http://jenkins-url:port/job/<job-name>/buildWithParameters?param=value --user <jen_username>:<jenkins_api_token>\nRun 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 的选项。
| 归档时间: |
|
| 查看次数: |
33968 次 |
| 最近记录: |