Crumb的作用
CSRF Protection
首先解释一下CSRF,Cross-Site Request Forgery(CSRF或XSRF)跨站请求伪造,是一种web安全漏洞。如果没有CSRF保护,Jenkins的admin访问其他网站,将允许这个网站对Jenkins执行操作,导致Jenkins受害。
Jenkins 中的 CSRF 保护
Jenkins的CSRF保护使用token(在Jenkins里叫crumb),它由Jenkins创建,并发送给用户。任何导致修改的表单提交或者类似的操作,比如:触发任务或修改构建配置,都需要提供Crumb。crumb 包含标识创建它的用户的信息,因此使用另一个用户的token提交将被拒绝。
设置CSRF保护
Manage Jenkins » Configure Global Security » CSRF Protection
中,管理员可以配置 CSRF Protection。
默认的Crumb Issuer,生成crumb的哈希,并在其中编码以下的信息
- 为其生成crumb的用户名
- 生成crumb的网络会话 ID
- 为其生成crumb的用户的 IP 地址
- 此 Jenkins 实例独有的salt
当面包屑被发送回 Jenkins 时,所有这些信息都需要匹配,以便该提交被视为有效。
在脚本里使用
发给Jenkins的POST请求通常需要提供crumb。这也适用于使用用户名和密码进行身份验证的脚本客户端。由于 crumb 包含网络会话 ID,客户端需要执行以下操作:
- 向
/crumbIssuer/api
发送请求,请求面包屑。注意 Set-Cookie响应头 - 对于所有后续请求,除了用户名和密码之外,还提供 crumb 和会话 cookie。
或者使用用户名和 API Token 进行身份验证。
使用API Token的话,即使Jenkins打开了CSRF保护,也不需要提供crumb