Jenkins如何使用CrumbIssuer防御CSRF攻击
1、CSRF(跨站请求伪造)概述
在讲解Jenkins的跨站请求伪造(CSRF)保护机制之前,让我们首先对CSRF这一安全威胁及其重要性进行简明扼要的概述。
1.1 CSRF(跨站请求伪造)的原理
CSRF(即跨站请求伪造)是指利用受害者尚未失效的身份认证信息、(cookie、会话等),诱骗其点击恶意链接或者访问包含攻击代码的页面,在受害人不知情的情况下以受害人的身份向(身份认证信息所对应的)服务器发送请求,从而完成非法操作(转账,改密码等)。CSRF属于业务逻辑漏洞,在服务器看来,所有请求都是合法正常的(请求是经过身份认证的)。
因为CSRF攻击,会重复利用用户的 Cookie,而说到 Cookie,就得先从 HTTP 协议开始讲起。
1.1.1 HTTP协议
无记忆性:
HTTP是一种无状态协议,即服务器不会保留与客户交易时的状态。
用户A在很短的时间间隔内向Web服务器发送了两次同样的请求,服务器并不会因为已经响应了该请求一次就不对第二次请求进行响应,因为服务器并不知道已经响应过一次该请求。
假设用户在网站A的某一个页面上已经完成了登录操作,当在该网站的另一个页面上执行的操作需要验证用户登录的时候仍然需要用户再次登录,因为HTTP并不知道你已经登录了,它不会维持你的登录状态。
因为要多次登录太过麻烦,为了让服务器能够记住用户引入了 Cookie 机制。
1.1.2 Cookie机制
当用户访问站点的时候,站点会为该用户分配一个 Cookie 值,站点使用该 Cookie 值来标记用户,当用户浏览器接受到包含 Cookie 值得数据包后,会将 Cookie 得值取出,存放到浏览器中,随后浏览器会在发往该站点得数据包中自动得填充该 Cookie 值。Cookie 的值的填充是浏览器的行为。
1.1.3 CSRF(跨站请求伪造)的原理
当浏览器自动完成Cookie的填充,目标网站会误认为该数据包就是管理员发送的,会以管理员的权限进行相关的操作。
1.2 CSRF(跨站请求伪造)常见防御方案
之所以会出现 CSRF 的攻击,本质原因是黑客可以伪造用户的请求,用户的请求信息实际上是存在 Cookie 中的,所以黑客可以在不知道上述那些验证信息直接跳过安全验证。所以防御 CSRF 的关键点在于当用户的请求在发出的时候,黑客不能去伪造这个信息,并且这个信息不能存在于 cookie 之中。
1.2.1 添加HTTP Referer
Referer 是存在于 HTTP 报文头部的一个字段,它是由浏览器提供的,可以记录当前请求的来源地址(标明请求的来源)。黑客在伪造请求时只能在自己的网站上构造请求,这样的话服务器验证 Referer 就可以知道这个请求并不是自己网站内部的请求,而是黑客伪造的,直接拒绝。以百度里面的一个文件为例:
使用这种方式的好处是简单、方便,一般的开发人员就不用去操心 CSRF 的安全性漏洞了,只需要在服务端加一个拦截器,去验证请求的 Referer 值就可以了。这种验证 Referer 的方式固然简单高效,但是也并不是万无一失的,虽然说 Referer 的值是由浏览器提供的,但是在某些浏览器上黑客是可以在发送请求时去篡改 Referer 或其他 Header 的值的,这样的话就相当于跳过了验证,从而又可以进行 CSRF 攻击了。
1.2.2 Anti CSRF Token
Anti CSRF Token。Token,就是令牌,最大的特点就是随机性,不可预测。
Anti CSRF Token 原理上是通过 Session Token 来实现的。当客户端请求页面时,服务器会生成一个随机数 Token,并且将 Token 放置到 Session 当中,然后将 Token 发给客户端(一般通过构造 Hidden 表单)。下次客户端提交请求时,Token 会随着表单一起提交到服务器端,服务器端会在收到请求后用拦截器去对 Token 的值进行验证,判断是否和 Session 中的 Token 值相等,若相等,则可以证明请求有效,不是伪造的,如果没有Token或者Token不正确都会被认为是攻击而直接丢弃。
GET请求
http://url?csrftoken=tokenvalue
POST请求
<input type="hidden" name="csrftoken" value="tokenvalue" />
1.2.3 用户验证
对于敏感操作,可以要求用户进行额外的身份验证(例如输入密码或验证码)。
1.2.4 避免使用 GET 请求进行状态改变
确保状态改变操作(例如数据修改、删除)使用 POST、PUT 或 DELETE 方法,而不是 GET 方法。GET 请求应只用于数据获取操作。
2、Jenkins跨站请求伪造保护功能
Jenkins的CSRF保护使用Token(在Jenkins里叫Crumb),它由Jenkins创建,并发送给用户。任何导致修改的表单提交或者类似的操作,比如:触发任务或修改构建配置,都需要提供Crumb。Crumb包含标识创建它的用户的信息,因此使用其他用户令牌的提交将被拒绝。所有这些都发生在后台,除了极少数情况外,没有明显的影响,例如,在用户的会话到期后,他们再次登录。
2.1 跨站请求伪造保护功能配置
Dashboard » Manage Jenkins » Security 中,管理员可以配置 CSRF Protection。另外,从Jenkins 2.214和Jenkins LTS 2.222.1开始,Jenkins默认启用跨站请求伪造保护功能,并且在Jenkins图形化页面不允许关闭。
默认启用的The *Default Crumb Issuer, 这个拦截器会计算客户端传递的Crumb值的hash是否是可用hash, 这个hash的来源是通过用户名、sessionID、请求IP以及访问的jenkins的唯一标识生成的。
唯一支持的选项“启用代理兼容”会从令牌中删除有关用户IP地址的信息。当Jenkins在反向代理后面运行并且从Jenkins看到的用户IP地址会定期更改时,这可能很有用。
注意 1:默认的Crumb Issuer生成Crumb的哈希,并在其中编码以下的信息(如果启用代理兼容,生成的Crumb哈希时不再使用请求Ip):
- 为其生成Crumb的用户名
- 生成Crumb的网络会话 ID
- 为其生成Crumb的用户的 IP 地址
- 此 Jenkins 实例独有的salt
当Crumb被发送回 Jenkins 时,所有这些信息都需要匹配,以便该提交被视为有效。
注意 2:CrumbIssuer是一个为了抵御CSRF攻击而生成名为Crumb值的算法。Crumb通常是对能够唯一标识发送请求的代理(用户端)的信息的hash值,并且其会被加密以防第三方伪造。Crumb值由服务器端在用户登录时生成并发送给用户,之后用户每次登录时都需要对其进行验证。为了保证Crumb不会被猜测或者伪造,生成方式是获取用户信息进行hash并加密。
2.2 在API里使用Crumb
发给Jenkins的POST请求通常需要提供Crumb。这也适用于使用用户名和密码进行身份验证的脚本客户端。由于 Crumb 包含网络会话 ID,客户端需要执行以下操作:
- 向 /CrumbIssuer/api 发送请求,请求Crumb,注意 Set-Cookie响应头
- 对于所有后续请求,除了用户名和密码之外,还提供 Crumb 和会话 cookie。
示例(禁用流水线项目test-crumb):
通过API禁用流水线项目前先查看流水线状态。
通过API禁用流水线:
curl -X POST -u zmc:123456 "http://10.20.31.153:8080/jenkins/job/test-crumb/disable"
报403错误(鉴权失败),并且日志给出了明确的报错原因,请求里面缺少合法的Crumb。在第二章节介绍Jenkins跨站请求伪造保护功能时已经讲过任何导致修改的表单提交或者类似的操作,都需要提供Crumb。
那么我们就为接口提供Crumb值,通过API获取当前用户的Crumb。
curl -s -u zmc:123456 http://10.20.31.153:8080/jenkins/crumbIssuer/api/json
接下来请求头里面带着当前用户的Crumb值,再次禁用流水线:
curl -X POST -u zmc:123456 -H "Jenkins-Crumb:98faf768c7d636709ae6e328e7344366614d68db62dcaacf8737c58278cfa71c" "http://10.20.31.153:8080/jenkins/job/ssssss/disable"
还是报缺少合法的Crumb错误,这是因为除了提供用户名、密码、Crumb之外还需要填写会话cookie(curl客户端工具不是浏览器不会在请求里面自动带着cookie值),再次通过API获取当前用户的Crumb。
curl -s -verbose -u zmc:123456 http://10.20.31.153:8080/jenkins/crumbIssuer/api/json
接下来请求头里面带着当前用户的Crumb值、会话cookie,再次禁用流水线。
curl -X POST -u zmc:123456 --cookie "JSESSIONID=8A381340DD8DFC299F9A88BBE10880E0" -H "Jenkins-Crumb:a849f65adaf2ecf8ecf95bf957c1b1288fe86bf091af85a1e7d17421525bb8fc" "http://10.20.31.153:8080/jenkins/job/test-crumb/disable"
查看流水线项目状态,项目已禁用。
另外,我们知道Jenkins API认证方式有用户名/密码+用户名/Token两种形式,对于用户名/密码认证的Jenkins任何导致修改的表单提交或者类似的请求,都需要带着 Crumb,而对于用户名/API Token的话,即使Jenkins打开了CSRF保护,也不需要提供Crumb。
示例(启用流水线项目test-crumb):
通过API Token启用上面禁用的流水线项目。
curl -X POST -u zmc:116e373b20b15ca5788b2a37044f4cb0b5 "http://10.20.31.153:8080/jenkins/job/test-crumb/enable"
查看流水线项目状态,项目已启用。
注意 1:本文主要讲解Jenkins如何使用CrumbIssuer防御CSRF攻击,关于API认证如何颁发API Token本文不做讲解。
注意 2:Crumb的有效期通常与用户会话绑定,只要会话有效,Crumb就有效。jenkins本身并没有直接配置会话超时时间的设置,它依赖于底层的Servlet容器的会话配置,假设底层容器用的Tomcat的话,默认会话有效期是30分钟。
2.3 禁用跨站请求伪造保护功能(强烈不建议)
向Jenkins发送HTTP请求的过时插件可能无法在启用CSRF保护的情况下工作。在这种情况下,可能需要暂时禁用CSRF保护。要禁用CSRF保护,请设置系统属性hudson.security.CSRF.GlobalCrumbIssuerConfiguration。启动时将DISABLE_CSRF_PROTECTION设置为true。
3、总结
Jenkins的CSRF保护使用Token(在Jenkins里叫Crumb),它由Jenkins创建,并发送给用户。任何导致修改的表单提交或者类似的操作,比如:触发任务或修改构建配置,都需要提供Crumb。Crumb包含标识创建它的用户的信息,因此使用其他用户令牌的提交将被拒绝。所有这些都发生在后台,除了极少数情况外,没有明显的影响,例如,在用户的会话到期后,他们再次登录。
发给Jenkins的POST请求通常需要提供Crumb(Jenkins)。这也适用于使用用户名和密码进行身份验证的脚本客户端。由于 Crumb 包含网络会话 ID,客户端需要执行以下操作:
- 向 /CrumbIssuer/api 发送请求,请求Crumb,注意 Set-Cookie响应头
- 对于所有后续请求,除了用户名和密码之外,还提供 Crumb 和会话 cookie。
另外,我们知道Jenkins API认证方式有用户名/密码+用户名/Token两种形式,对于用户名/密码认证的Jenkins任何导致修改的表单提交或者类似的请求,都需要带着 Crumb,而对于用户名/API Token的话,即使Jenkins打开了CSRF保护,也不需要提供Crumb。
Jenkins如何使用CrumbIssuer防御CSRF攻击的更多相关文章
- Spring mvc拦截器防御CSRF攻击
CSRF(具体参考百度百科) CSRF(Cross-site request forgery跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSR ...
- yii2的防御csrf攻击机制
csrf,中文名称:跨站请求伪造,可以在百度上搜索资料,详细了解这一方面的概念.对于我们是非常有帮助的.yii2的csrf的实现功能是在yii\web\request类实现功能的.request类中的 ...
- 防御CSRF的方法有哪些(一) HTTP 头中自定义属性并验证 CSRF跨站域请求伪造攻击
CSRF (Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式,该攻击可以在受害者毫不知情的情况下以受害者名义伪造请求发送给受攻击站点,从而在并未授权的情况下 ...
- CSRF攻击与防御
CSRF是什么 CSRF在百度百科中是这么说的:“CSRF(Cross-site request forgery跨站请求伪造,也被称为“one click attack”或者session ridin ...
- CSRF 攻击原理和防御方法
1. CSRF攻击原理 CSRF(Cross site request forgery),即跨站请求伪造.我们知道XSS是跨站脚本攻击,就是在用户的浏览器中执行攻击者的脚本,来获得其cookie等信息 ...
- csrf 攻击和防御
CSRF概念:CSRF跨站点请求伪造(Cross—Site Request Forgery),跟XSS攻击一样,存在巨大的危害性,你可以这样来理解: 攻击者盗用了你的身份,以你的名义发送恶 ...
- CSRF攻击与防御(写得非常好)
转自:http://blog.csdn.net/stpeace/article/details/53512283 CSRF概念:CSRF跨站点请求伪造(Cross—Site Request Forge ...
- Web安全之CSRF攻击的防御措施
Web安全之CSRF攻击的防御措施 CSRF是什么? Cross Site Request Forgery,中文是:跨站点请求伪造. CSRF攻击者在用户已经登录目标网站之后,诱使用户访问一个攻击 ...
- 转!!CSRF攻击与防御(写得非常好)
CSRF概念:CSRF跨站点请求伪造(Cross—Site Request Forgery),跟XSS攻击一样,存在巨大的危害性,你可以这样来理解: 攻击者盗用了你的身份,以你的名义发送恶 ...
- 19、Flask实战第19天:CSRF攻击与防御
CSRF攻击原理 网站是通过cookie来实现登录功能的.而cookie只要存在浏览器中,那么浏览器在访问这个cookie的服务器的时候,就会自动的携带cookie信息到服务器上去.那么这时候就存在一 ...
随机推荐
- 深入探讨Function Calling:在Semantic Kernel中的应用实践
引言 上一章我们熟悉了 OpenAI 的 function calling 的执行原理,这一章节我们讲解一下 function calling 在 Semantic Kernel 的应用. 在Open ...
- C#.Net筑基-String字符串超全总结 [深度好文]
字符串是日常编码中最常用的引用类型了,可能没有之一,加上字符串的不可变性.驻留性,很容易产生性能问题,因此必须全面了解一下. 01.字符与字符编码 1.1.字符Char 字符 char 表示为 Uni ...
- Centos Stream 10 测试版下载:未来的RHEL10&Rocky Linux 10
简介 最近发现Centos最放出了Stream 10 测试版本,应该是基于Fedora 40构建的.未来红帽会基于此版本构建RHEL 10. 内核版本:6.9.0 Python版本:3.12.2 RH ...
- v-for 伪标签:template:
根据一组数组或对象的选项列表进行渲染. v-for指令需要使用 (item,index) in 数组或对象 形式的特殊语法,同时还需要指定key值,key的作用在vue进行新旧数据比对渲染页面里,如果 ...
- 「C++」简单模拟
这是一个公式: \[F_n=\dfrac{\left(\frac{1+\sqrt{5}}{2}\right)^n-\left(\frac{1-\sqrt{5}}{2}\right)^n}{\sqrt{ ...
- gitlab自动定时备份文件,备份失败发送邮件
一.需求 为预防gitlab出现故障,每天定时备份,备份完成后把之前的备份文件删除,备份成功或失败的时候自动发送邮件提醒,这里的gitlab为docker部署. 二.备份命令准备 1)备份命令 创建一 ...
- 解决 Visual C++ 17.5 __cplusplus 始终为 199711L 的问题
00. 软件环境 Visual Studio 2022, Visual C++, Version 17.5.4 01. 问题描述 在应用 https://github.com/ToniLipponen ...
- 18-Docker资源限制
背景 若容器使用的计算机资源不加限制,那么,可能会耗光整个计算机资源. 如代码里有bug,出现了死循环,且创建了很多线程. 在Docker中,可以使用Cgroup技术限制CPU.Block IO.RA ...
- Vim有哪几种模式?
Vim有哪几种模式? 模式一:normal模式 作用主要是用来浏览,输入各种和在文档中移动. 模式二:编辑模式 用于对文件的编辑: 常用的插入命令: a在光标位置后编辑, i在光标位置前编辑, o在下 ...
- Nuxt3 的生命周期和钩子函数(三)
title: Nuxt3 的生命周期和钩子函数(三) date: 2024/6/27 updated: 2024/6/27 author: cmdragon excerpt: 摘要:概述了Nuxt3的 ...