mirror of
https://github.com/cheetahlou/CategoryResourceRepost.git
synced 2025-11-02 07:13:45 +08:00
mod
This commit is contained in:
123
极客时间专栏/安全攻防技能30讲/安全防御工具/18 | 安全标准和框架:怎样依“葫芦”画出好“瓢”?.md
Normal file
123
极客时间专栏/安全攻防技能30讲/安全防御工具/18 | 安全标准和框架:怎样依“葫芦”画出好“瓢”?.md
Normal file
@@ -0,0 +1,123 @@
|
||||
<audio id="audio" title="18 | 安全标准和框架:怎样依“葫芦”画出好“瓢”?" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/c4/45/c484e47811ae4e4754e1b6b15cf56c45.mp3"></audio>
|
||||
|
||||
你好,我是何为舟。
|
||||
|
||||
感谢你来学习安全专栏,如果有任何疑惑或者建议欢迎留言和我沟通。新的一年祝你工作顺利、事业有成、升职加薪!
|
||||
|
||||
从这一讲开始,我们讨论安全防御工具。实际上,每个公司都需要进行安全体系建设,业内将这些通用性的建设经验进行总结,形成了各种安全标准和框架。从这些标准和框架中,我们能了解到建设安全体系的思路和方向,对于实际的安全落地工作,有很大的指导作用。
|
||||
|
||||
根据安全等级和关注点的不同,不同的安全标准和框架都有各自的具体要求。这些要求都非常简单直接,也很容易理解,所以,这不是我们要讲解的重点。在今天的课程中,我更想通过这些标准和框架的设计思路来讲一讲,作为公司的安全人员,该如何推动公司整体的安全体系建设。
|
||||
|
||||
## 安全标准和框架有哪些?
|
||||
|
||||
首先,我们来看看,安全标准和框架都有哪些。
|
||||
|
||||
国内的安全标准和框架,就是我们常听到的等级保护制度(方便起见,后文都简称“等保”)。等级保护根据公司的安全性高低,划分了由一到五这五个等级。每个等级都有需要满足和达标的[安全要求](https://baike.baidu.com/item/%E4%BF%A1%E6%81%AF%E5%AE%89%E5%85%A8%E7%AD%89%E7%BA%A7%E4%BF%9D%E6%8A%A4/2149325?fromtitle=%E7%AD%89%E7%BA%A7%E4%BF%9D%E6%8A%A4&fromid=2104129&fr=aladdin#2)。等级越高说明公司的安全水平越高,越被政府认可。安全等级三级以上的公司,还会受到国家信息安全监管部门的监督和检查。
|
||||
|
||||
在国外,比较知名的安全标准和框架包括:ISO27000系列、NIST、COBIT和ITIL。接下来,我们一一来讲。
|
||||
|
||||
我们前面讲了等级保护制度,实际上,NIST也被称为“美国版等保”。因为NIST是美国政府提出的,对公司的安全能力进行监督和管控的安全框架。但是,NIST并未考虑公司在实施安全标准时需要付出的成本,所以除了美国政务之外,NIST很少被使用。
|
||||
|
||||
而ISO27000系列和COBIT都是不包含具体实施细节的安全标准和框架。
|
||||
|
||||
其中,ISO27000系列是国际上比较认可的安全标准之一。它提供了兼容性极高的安全体系和信息安全管理的最佳实践指导。但是,ISO27000系列更关注于方向上的指导,没有覆盖具体的实施细节,所以无法作为技术手册来使用。
|
||||
|
||||
COBIT( Control Objectives for Information and related Technology)则是给安全管理者提供了一个内控的框架,它本身更关注于内控和审计。
|
||||
|
||||
最后,我们来看ITIL( Information Technology Infrastructure Library )。ITIL是一个提升服务质量的标准框架,而安全只是影响服务质量的一个因子。因此,ITIL会更多地考虑如何提高公司的研发和管理效率,在机密性、可用性和完整性上只给予了比较基本的关注。
|
||||
|
||||
以上这些安全标准和框架,除了能对企业的安全建设进行指导,也提供了测评的服务。测评的目的,一方面是帮助公司认识到自身安全水平,另一方面也是公司对外宣传的一个标杆。比如说,国内目前最流行的ISO27001测评。各个公司都会以通过了ISO27001测评,来对用户和合作伙伴表明,自己的安全水平达到了一个比较成熟的高度。这就是一个对外宣传的表现。
|
||||
|
||||
除此之外,等级保护制度作为国家标准,还具备规避和降低公司法律风险的能力。比如,当公司出现了某个安全事件导致数据泄露,如果这个公司没有做过“等保”的话,那么法院就可能认为公司在安全上没有尽到自己的职责,而根据《网络安全法》给予这个公司很严厉的惩罚。但是,如果公司做了“等保”的话,法院可能会认为公司有努力在做,只是仍然有缺陷,而不会给予非常严厉的惩罚。所以,完全不做“等保”和做了但不到位,处罚的标准就完全不同了。
|
||||
|
||||
## 现有安全标准和框架有哪些可以借鉴的地方?
|
||||
|
||||
### 1. 等保:为什么安全体系建设要区分管理与技术?
|
||||
|
||||
首先,我们来看一下等保的分类思路。等保对公司的安全要求划分为了十类,分别是:
|
||||
|
||||
- 技术要求:安全物理环境、安全通信网络、安全区域边界、安全计算环境、安全管理中心;
|
||||
- 管理要求:安全管理制度、安全管理机构、安全管理人员、安全建设管理、安全运维管理。
|
||||
|
||||
对于每个分类的具体含义,你通过名字应该就能够理解,这里我就不细说了。
|
||||
|
||||
从这些分类中,我们可以看出,等保的大体思路是将安全分为了管理和技术。我们之前就讲过,**安全往往是需要自上而下来推动的**。因此,安全并不是一个纯技术的“活”,它也需要在管理层面上作出改进。比如,等保要求公司必须要成立专门的安全管理机构,安排专门的安全管理人员,这样才有人能够对公司的整体安全来负责,去推动安全的落地。
|
||||
|
||||
### 2. ISO27001:如何通过PDCA流程进行规划安全建设?
|
||||
|
||||
ISO27001是国内比较流行的安全评估认证之一。它提出了14个不同的安全方向,分别是:
|
||||
|
||||
- 安全策略
|
||||
- 信息安全组织
|
||||
- 人力资源安全
|
||||
- 资产管理
|
||||
- 访问控制
|
||||
- 密码学
|
||||
- 物理和环境安全
|
||||
- 操作安全
|
||||
- 通信安全
|
||||
- 系统获取、开发和维护
|
||||
- 供应关系
|
||||
- 信息安全事件管理
|
||||
- 业务连续性管理中的信息安全考虑
|
||||
- 符合性
|
||||
|
||||
可以看到,这个划分还是很全面的。这些安全方向基本包括了安全行业内的各个知识领域。在每个安全方向中,ISO27001会列举出公司需要完成的安全事项,我觉得你甚至可以依照这个标准来学习安全。
|
||||
|
||||
不仅如此,ISO的一系列框架和标准其实都遵循PDCA流程,PDCA也是项目管理上经常被提到的管理方法。这里我就简单说一下。
|
||||
|
||||
- Plan:计划,确定安全的目标并制定建设的规划。
|
||||
- Do:执行,按照计划的内容和时间来执行。
|
||||
- Check:检查,对执行的结果进行总结,看是否符合预期。
|
||||
- Action:改进,如果执行不符合预期,或者计划出现纰漏,则进行分析和改进。
|
||||
|
||||
那PDCA流程如何应用在安全体系的建设中呢?这里,我就举一个公司在做ISO27001例子。
|
||||
|
||||
- Plan:认证机构会先到公司进行调研和培训,然后和公司一块制定一个详细的安全规划。
|
||||
- Do:公司会花几个月的时间,去执行这些规划。
|
||||
- Check:完成之后,认证机构再次去公司进行回访,评估完成的情况。
|
||||
- Action:如果达到预期,则通过认证;否则继续计划、执行、检查的操作。
|
||||
|
||||
其实,我们在实际去建设公司的安全体系时,也完全可以按照PDCA的流程来进行。我们可以先制定一个年度或者季度的规划,根据指定的规划去执行。当前阶段完成之后,我们要先检查是否满足了安全需求,以及还有哪些安全风险存在,然后提出改进的方案。基于这个方案,我们就可以接着制定下一个阶段的规划了。
|
||||
|
||||
### 3. NIST:如何通过IPDRR建立纵深防御?
|
||||
|
||||
NIST提出了公司建立安全体系的IPDRR方法框架,主要包括Identiify、Protect、Detect、Respond和Recover这五个部分。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/3b/ff/3b88b2ed48bf41c217319ca3f464f8ff.jpg" alt=""><br>
|
||||
图片来源:[IPDRR方法框架](https://www.nist.gov/cyberframework/online-learning/components-framework)
|
||||
|
||||
我认为NIST所提出的IPDRR方法,是解决各类安全问题的一种通用思路。这里,我就以Web安全为例,结合IPDRR方法的五个步骤,来详细讲解一下,针对Web应用中可能出现的各种漏洞,我们该如何建立安全防护体系。
|
||||
|
||||
第一步是Identify(识别)。我们需要掌握公司有哪些Web应用,并对Web应用做威胁评估。
|
||||
|
||||
也就是说,我们需要定位公司的资产,衡量这些资产的价值,然后评估资产保护的优先级和投入成本。
|
||||
|
||||
第二步是Protect(保护)。我们要在安全事件发生之前,对数据和资产采取适当的保护措施。(比如:通过访问控制机制来避免越权访问、通过加密来保护数据的CIA、通过防火墙保护内网隔离等)。在开发上,我们需要采用安全的方法,尽量避免漏洞出现。同时,我们可以部署WAF等安全工具,统一对Web攻击进行防护检测。
|
||||
|
||||
第三步是Detect(检测)。在安全事件发生之中或者之后,我们要能及时发现和检测出安全事件或者攻击行为。这就需要对请求的日志和返回的结果进行分析,评估是否产生攻击行为和数据泄露。
|
||||
|
||||
第四步是Respond(响应)。当检测到安全事件后,我们需要采取有效的措施,来阻止攻击的持续进行,尽可能地降低事件所带来的影响。我认为最可行的操作,就是对出现漏洞的Web业务进行下线,对已经受到影响的数据进行隔离。这也要求我们制定好详细的应急预案,避免攻击发生时公司陷入手忙脚乱的无序状态。
|
||||
|
||||
第五步是Recover(恢复)。当事件响应完成后,我们要将应用或者服务恢复到攻击前的状态,也就是对应用和数据进行修复和重新上线。同时,也要对事件的原因进行复盘分析,然后进一步完善安全机制。
|
||||
|
||||
从这个例子中,我们知道,针对Web安全体系建设,我们可以根据IPDRR方法 采取多重安全策略进行保护。这也符合安全防护的一个原则:**纵深防御,即任何单点的安全策略都存在纰漏和被绕过的可能。因此,我们需要采取多重相互独立的安全策略,使得这些策略相互补充,降低安全策略被绕过的可能性。**
|
||||
|
||||
## 总结
|
||||
|
||||
好了,今天的内容讲完了。我们来一起总结回顾一下,你需要掌握的重点内容。
|
||||
|
||||
通过对等保、ISO27001和NIST这三个安全标准的分析,我们知道,除了一些比较细的安全机制指导之外,安全标准本身也包含了我们自己去做安全的思路。比如:等保告诉我们安全要分为技术和管理;ISO27001告诉我们要通过PDCA流程去规划安全建设;NIST告诉我们安全可以通过IPDRR建立纵深防御。
|
||||
|
||||
对于安全标准的思维提炼,远远不止我提出的这些点。在各个标准和框架的细节中,也都给出了公司在各个安全方向上需要去落地的内容,比如,根据ISO27001的访问控制的标准,你可以学习如何制定合适的访问控制机制。
|
||||
|
||||
总而言之,我认为,在实际建立安全体系的过程中,我们不应该一味地按照这些安全标准实施,也要主动学习当中的设计思路。这样你才能更高效、更完善地建立公司自有的安全体系。<br>
|
||||
<img src="https://static001.geekbang.org/resource/image/9a/55/9ac1feba7ab8a4d0a8e82903b6442455.jpg" alt="">
|
||||
|
||||
## 思考题
|
||||
|
||||
最后,我们还是来看一道思考题。
|
||||
|
||||
你还接触过哪些安全标准和框架,它们又包括了哪些内容和思想?你认为该如何依靠这些思想,去推动公司的安全建设?
|
||||
|
||||
欢迎留言和我分享你的思考和疑惑,也欢迎你把文章分享给你的朋友。我们下一讲再见!
|
||||
93
极客时间专栏/安全攻防技能30讲/安全防御工具/19 | 防火墙:如何和黑客“划清界限”?.md
Normal file
93
极客时间专栏/安全攻防技能30讲/安全防御工具/19 | 防火墙:如何和黑客“划清界限”?.md
Normal file
@@ -0,0 +1,93 @@
|
||||
<audio id="audio" title="19 | 防火墙:如何和黑客“划清界限”?" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/24/72/24a18b32b0507b800d74ba78c72a9272.mp3"></audio>
|
||||
|
||||
你好,我是何为舟。
|
||||
|
||||
黑客在网络攻击时,第一步会扫描系统对外开放的端口,尝试发起连接或者攻击。比如,黑客可以扫描公司公网IP的22端口(SSH服务),然后尝试爆破登录。这个时候,通过防火墙,我们既可以屏蔽掉开放的22端口,也能拦截爆破的请求。所以,防火墙是面对外部入侵的第一道防线。
|
||||
|
||||
当然,这只是个简单的例子,现实中黑客的攻击手段更多,攻击场景也更加复杂。那这个时候,防火墙是如何为系统和网络提供保护的呢?具体来说,防火墙能够拦截哪些攻击呢?它的盲区又是什么呢?今天,我们就一起来学习,如何通过防火墙进行安全防护。
|
||||
|
||||
## 防火墙如何为网络提供保护?
|
||||
|
||||
你对防火墙应该不陌生。为了咱们统一一下思想,方便学习后面的内容,这里我还是再和你啰嗦几句。
|
||||
|
||||
防火墙是部署在网络边界上的一种安全设备,其概念比较宽泛,根据需求不同可以工作在OSI(Open System Interconnection,开放式系统互联) 网络模型的一层或多层上。一般情况下,防火墙会和路由器搭配使用(或者说路由器能够承担部分防火墙的功能),来对网络进行隔离。
|
||||
|
||||
根据实现方式和功能的不同,防火墙可以分为三种类型:包过滤防火墙、应用网关防火墙和状态检测防火墙。不同的防火墙在性能和防护能力上都有各自的特点,适用于不同的场景。下面我们一一来看。
|
||||
|
||||
### 1.包过滤防火墙
|
||||
|
||||
包过滤防火墙工作在网络层和传输层上。在这两个层级中,网络请求都是以TCP或者UDP数据包的形式进行流动的。因此,包过滤防火墙是通过检测并拦截所有流经防火墙的TCP和UDP数据包,来对系统提供保护。它能够获取到的信息包括:源IP和端口、目标IP和端口、协议号等。由于大部分的路由器甚至Linux系统本身(Iptables)也具备类似的功能。因此,通常情况下,我们不需要采购额外的设备部署包过滤防火墙,只需要直接对网络边界的路由器进行设置,就能够满足最基本的拦截需求了。
|
||||
|
||||
但是,在防护能力上,包过滤防火墙是比较弱的,它只能提供最基础的安全防护。这是因为,包过滤防火墙的过滤规则基本都是静态的。也就是说,包过滤防火墙只能够通过匹配IP地址和端口号,判断这些信息是否命中特定的规则来进行过滤。比如,禁止外网IP访问80和443以外的公司IP端口。所以,现在大部分的包过滤防火墙都进行了升级,引入了诸如“连接状态”等概念,也就变成了状态检测防火墙。
|
||||
|
||||
### 2.应用网关防火墙
|
||||
|
||||
应用网关防火墙以代理的模式工作在应用层。所谓“代理”,即接收客户端发出的请求,然后以客户端的身份将请求再发往服务端。大部分的系统和应用都是工作在应用层的,因此,应用网关防火墙能够获取到系统和应用的全部信息,从而实现更复杂的功能,如:内容监控、认证、协议限制甚至缓存。
|
||||
|
||||
在包过滤防火墙中,防火墙直接对流经的TCP和UDP包进行处理。而应用网关防火墙需要对TCP和UDP包进行解析,处理成应用层的数据协议,如HTTP。因此应用网关防火墙对于网络的性能会产生负面影响,而且不是所有的应用都能够很好地兼容代理的存在,所以部署应用网关防火墙有可能对系统的可用性产生影响。除此之外,在应用网关防火墙中,服务端看到的请求都来自于代理,这会导致服务端无法有效地追踪请求的来源。
|
||||
|
||||
尽管应用网关防火墙有这些潜在的危害存在,但是它能处理的信息最多,能够提供的安全防护能力也最强。由于Web攻击是黑客常见的攻击手段,因此,应用网关防火墙也逐渐演变成了专门的Web防火墙,在之后的课程中,我们会详细介绍,这里暂时就不多说啦。
|
||||
|
||||
### 3.状态检测防火墙
|
||||
|
||||
状态检测防火墙是包过滤防火墙的一种升级,它同样工作在网络层和传输层之上。状态检测和包过滤防火墙最大的不同在于,它会以连接的形式来“看待”低层级的TCP和UDP数据包。怎么理解呢?我来举个简单的例子。
|
||||
|
||||
当客户端发起一次完整的HTTP请求时,会需要进行“TCP三次握手”建立连接(SYN+ACK数据包),HTTP请求和响应的数据往往也是通过多个数据包才能完整发送。传统的包过滤防火墙只能基于每一个数据包进行判断,比如在“握手”的过程中,包过滤防火墙会分别看到SYN、SYN+ACK、ACK这三个数据包,并对每一个数据包进行判断。而事实上,这三个数据包(SYN、SYN+ACK、ACK)代表的是一次握手请求。所以,状态检测防火墙会尝试将这一连串的数据包组成一次完整的连接请求,从而获得一个更全面的视角,大大提高其安全性。
|
||||
|
||||
对比应用网关防火墙,状态检测防火墙通常不会尝试将数据包构建成高层级的数据,也就是说它不会尝试去解析整个HTTP请求中的内容。因此,状态检测防火墙能获得更优的性能。目前市面上普遍采用的,都是状态检测防火墙。<br>
|
||||
<img src="https://static001.geekbang.org/resource/image/36/69/36bd7102203b92fdea8af1f112493e69.jpeg" alt="">
|
||||
|
||||
## 防火墙可以为网络边界提供哪些保护呢?
|
||||
|
||||
网络边界之间的信用层级通常是不一样的,因此,我们需要利用防火墙在网络边界上提供必要的保护,使得跨越边界的数据和连接相对可信。那防火墙究竟可以为网络边界提供哪些保护呢?下面,我就详细来讲一讲。
|
||||
|
||||
### 1.保护操作系统的漏洞
|
||||
|
||||
在操作系统的发展历程中,出现过很多臭名昭著的漏洞。比如:由于对网络请求处理不当,导致的DDoS攻击(如死亡之PING、SYN洪泛等);由于高危服务默认开放导致的代码执行(如熊猫烧香扫描的是135和445端口的弱密钥);由于服务漏洞导致的代码执行(如永恒之蓝利用的SMB漏洞)。
|
||||
|
||||
如果在这些漏洞曝光时,我们能即时更新操作系统补丁、关闭对应服务,那自然是能够避免系统和应用受到侵害。但是,在通常情况下,尤其是当公司扩大规模的时候,服务器管理员意识到问题并采取措施的这段响应时间,已经足够病毒或者蠕虫进行大规模的传播了。
|
||||
|
||||
这时,防火墙的存在就很有必要了。一方面,防火墙可以迅速对全网的服务器进行保护,拒绝向高危端口发起的请求,如Windows中的135、137和445等,这也就是我们之前所说的“虚拟补丁”。另一方面,更加智能的防火墙,能够检测到整体流量中的异常变化,比如,突然出现了针对某个端口的大量请求,这就说明系统或者应用中很可能出现了新的漏洞,这时,防火墙可以产生报警甚至自动对异常的请求进行拦截,及时避免网络中的操作系统受到攻击。
|
||||
|
||||
### 2.阻止非法的信息流动
|
||||
|
||||
在网络边界之间流动的数据,往往都会受到一定的规则约束。最著名的有中国的防火长城(Great Firewall)。防火长城的主要目的不是为了防止国外对中国发起网络攻击,而是根据法律法规,防止国内网民访问国外违法的数据信息。同样地,美国也存在类似的防火墙设备,比如:根据美国儿童网络保护法令(CHIPA),学校和图书馆的网络必须限制学生可以浏览的网页。
|
||||
|
||||
除了防止非法地获取数据,防火墙同样能够防止敏感数据的流出。比如,防火墙可以对部分关键词或者敏感词进行检测阻止其外流。如果数据安全做得好一些的公司,可以对公司内的全部数据打上标签,然后根据标签的安全等级对跨越安全边界的数据进行处理。
|
||||
|
||||
需要注意的是,防火墙能够提供的数据安全保护是有限的。原因在于,大部分防火墙都是用来处理较低层级的数据,且很多连接会对数据本身进行加密(VPN、HTTPS)。这就导致了防火墙实际能够看到的可识别数据并不多,拦截能力因此下降。其实,这种绕过防火墙的例子很常见,各类“梯子”能翻墙访问Google就是基于这个原理实现的。
|
||||
|
||||
### 3.限制可访问的服务和审计
|
||||
|
||||
防火墙作为安全策略的一部分,还可以帮助公司落地安全制度。公司所有对于网络方面的限制和要求,基本都可以在防火墙上进行实现。比如:限制外网开放的服务只能是HTTP服务,那么所有非HTTP的请求就会被拦截;再比如,防火墙也可以对带宽的使用进行限制,避免某个服务抢占全部的带宽资源。
|
||||
|
||||
除此之外,防火墙作为网络安全设备,它的日志功能通常比路由器等常规网络设备更加完备。因此,在网络攻击发生之后,我们需要进行事件调查时,防火墙日志是很关键的信息来源。
|
||||
|
||||
## 防火墙有哪些防御盲区?
|
||||
|
||||
我们知道,防火墙不仅是网络安全中很重要的组成部分,也是我们最为熟知的安全工具。但是,**在安全领域中不存在绝对**,所以防火墙对于某些攻击也同样无能为力。接下来,我会主要讲解防火墙不能防御的攻击手段,在了解这些攻击之后,我们才能提高对防火墙和网络安全的整体认识。
|
||||
|
||||
首先,防火墙只位于网络边界。因此,防火墙只能用来对跨越边界的请求进行检测和拦截。当请求通过后,后续发起的攻击请求对于防火墙来说,就是不可见的。比如,当黑客利用弱密钥,通过合法的SSH登录到服务器之后,就相当于穿透了防火墙的保护,之后黑客再通过SSH执行的命令,防火墙都无法检测和拦截。**所以,防火墙不能防御已授权服务中的恶意攻击。**
|
||||
|
||||
其次,尽管防火墙位于网络边界,但这并不意味着所有的请求都会经过防火墙。比如,直接通过物理网线接入到服务器,黑客就可以在不经过防火墙的情况下进入内网。在这种情况下,防火墙自然也起不到任何作用了。同样地,在网络内部发生的攻击行为,也不在防火墙的保护范围内。也就是说,**防火墙不能防御不通过防火墙的访问。**
|
||||
|
||||
最后,作为边界设备,防火墙自身其实是暴露在外界的。因此,防火墙会遭受到黑客的直接攻击。如果**防火墙自身的操作系统存在缺陷**,那么,黑客就能够直接攻击并控制防火墙,然后关闭防火墙的防护功能,轻松突破边界。正是因为如此,部分防火墙厂商会为防火墙设备专门设计和开发一个加固过的专用操作系统,以此来提高防火墙的安全性。
|
||||
|
||||
## 总结
|
||||
|
||||
好了,今天的内容讲完了。我们来一起总结回顾一下,你需要掌握的重点内容。
|
||||
|
||||
防火墙作为最基础的网络安全设备之一,广泛存在于各种网络边界上,是网络安全的第一道防线。
|
||||
|
||||
在业务相对简单时,我们可以通过IP、端口和协议等参数,配置简单的黑白名单规则来阻挡恶意的网络请求;在业务逐渐复杂时,开放的端口协议变多,我们对防火墙的技术实现和配置复杂度都会有较高要求,需要由专业的人员或者团队来进行维护。
|
||||
|
||||
因此,尽管防火墙是我们最熟悉的安全设备,但实际上,防火墙是一个专业性较强的安全产品,开发或者运维人员一般不需要对其进行直接操作或者配置,具体的部署和配置工作都是交给防火墙厂商来完成和定期维护的。<br>
|
||||
<img src="https://static001.geekbang.org/resource/image/2e/d6/2e55ffc676f97e93ff58eb5b09eb0cd6.jpg" alt="">
|
||||
|
||||
## 思考题
|
||||
|
||||
最后,给你留一个思考题。
|
||||
|
||||
你可以检查一下你的服务器或者网络设备中,对外开放的端口有哪些。这些端口中,有哪些不需要对外开放,有哪些可以限制源IP?你能否通过防火墙(或者路由器、Iptables等)对这些端口进行限制呢?
|
||||
|
||||
欢迎留言和我分享你的思考和疑惑,也欢迎你把文章分享给你的朋友。我们下一讲再见!
|
||||
100
极客时间专栏/安全攻防技能30讲/安全防御工具/20 | WAF:如何为漏洞百出的Web应用保驾护航?.md
Normal file
100
极客时间专栏/安全攻防技能30讲/安全防御工具/20 | WAF:如何为漏洞百出的Web应用保驾护航?.md
Normal file
@@ -0,0 +1,100 @@
|
||||
<audio id="audio" title="20 | WAF:如何为漏洞百出的Web应用保驾护航?" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/48/90/48b9ef1c0d359869a6899b2a758f6790.mp3"></audio>
|
||||
|
||||
你好,我是何为舟。
|
||||
|
||||
如果你细心观察的话,应该会发现,随着Web应用越来越多,黑客的攻击目标也逐渐转向了针对Web安全的攻击。传统的防火墙主要专注于网络层的攻击防御,对Web安全的防御能力相对欠缺。因此,WAF(Web Application Firewall,Web应用防护系统)的概念也就被提了出来。WAF说白了就是应用网关防火墙的一种,它只专注于Web安全的防御,近几年来逐渐被当成一个相对独立的产品方向来研究。
|
||||
|
||||
那么,WAF和防火墙到底有哪些区别呢?针对我们之前讲过的各种Web攻击手段,WAF是如何提供保护的呢?今天,我们就一起来看!
|
||||
|
||||
## WAF的工作模式
|
||||
|
||||
前面我说过,WAF的本质是“专注于Web安全的防火墙”,Web安全关注于应用层的HTTP请求。因此,WAF的分析和策略都工作于应用层。
|
||||
|
||||
在Web安全这个方向上,WAF对比防火墙又做出了哪些改进呢?我们可以从WAF的三种工作模式入手,探讨这两者的区别。这三种工作模式分别是:透明代理、反向代理和插件模式。
|
||||
|
||||
**透明代理和大部分防火墙的工作模式相同**:在客户端和服务端通信不需要作出任何改变的情况下,对HTTP流量进行请求和转发。在这个过程中,为了解密HTTPS流量,WAF必须和服务端同步HTTPS对称密钥。<br>
|
||||
<img src="https://static001.geekbang.org/resource/image/5a/28/5a545133d2e1eee0455a232df595c528.jpg" alt=""><br>
|
||||
透明代理的优点就是容易部署,它不需要客户端和服务端进行任何改动。但是,透明代理的缺点也有很多。透明代理本身不是一个Web服务,所以它无法修改或者响应HTTP的请求,只能够控制请求的通过或者拒绝。正因为如此,它也无法实现Web服务所提供的认证、内容过滤等功能。
|
||||
|
||||
**区别于透明代理,反向代理要求客户端将请求的目标地址指向WAF,而不是服务端**。在反向代理工作模式中,服务端接收的请求,实际上也是由WAF发起的。在这个过程中,WAF本身就相当于一个Web服务,只不过对所有的HTTP请求都进行了转发。<br>
|
||||
<img src="https://static001.geekbang.org/resource/image/59/3f/59568304a8a84041838eba9dd52dd63f.jpg" alt=""><br>
|
||||
因为**反向代理WAF本质上是一个Web服务**,所以HTTPS证书可以直接部署在WAF上。WAF在对HTTPS流量解密之后,就可以在内网中用HTTP的形式,向服务端发起代理请求了。
|
||||
|
||||
而且,反向代理WAF作为一个Web服务,能够提供的功能也更加丰富。比如,WAF可以充当一个前置的认证平台,对所有请求进行身份校验和身份管理。同时,也因为在反向代理工作模式中,客户端和服务端不直接通信,而是将全部请求都先请求到WAF上,所以反向代理WAF对服务端的隔离也更加彻底。
|
||||
|
||||
但是,反向代理同样存在缺点。首先,功能更丰富意味着性能开销更大。因此,反向代理WAF对硬件要求更高。其次,反向代理WAF一旦宕机,就无法响应客户端的任何请求。这样一来,即使服务端仍然正常,但用户已经无法正常使用应用了。而对于透明代理WAF来说,如果WAF宕机了,只是无法提供Web防护而已,客户端和服务端的通信不会受到任何影响。
|
||||
|
||||
最后,我们来看**插件模式**。在插件模式中,WAF不再是网络中一个独立的安全产品了,而是以插件的形式依附于Web服务端本身,为Web安全提供防护。
|
||||
|
||||
那怎么才能将WAF植入到服务端的逻辑中呢?我们最常使用的一种技术就是[AOP](https://baike.baidu.com/item/AOP/1332219?fr=aladdin)(Aspect Oriented Programming,面向切面编程)技术。在AOP技术中,WAF可以作为一个切片植入到服务端的逻辑中。<br>
|
||||
<img src="https://static001.geekbang.org/resource/image/70/cd/7088839e71a8ea0ad30251924a60f7cd.jpg" alt=""><br>
|
||||
而且,目前AOP技术十分流行,各类编程语言都支持。所以,插件模式的WAF部署同样十分简单。但是,这种将WAF和服务端强耦合的方式,会带来一定的负向影响。
|
||||
|
||||
首先,WAF和服务端一块工作在服务器上,会消耗服务器额外的资源,对Web服务本身的性能产生影响。
|
||||
|
||||
其次,WAF和服务端耦合,也就意味着WAF的所有改动都会直接影响到服务端。对于代理模式的WAF来说,通常只需要自测就可以升级了。而对于插件模式的WAF,它本身的升级必须和服务端一起进入评估和测试流程,就会增加额外的工作量。
|
||||
|
||||
为了帮助你理解这三种工作模式,我总结了一张表格。<br>
|
||||
<img src="https://static001.geekbang.org/resource/image/0a/99/0a25d69ed7803de96a8e2bb50232b899.jpeg" alt=""><br>
|
||||
总结一下,关于WAF的三种工作模式,你需要重点掌握这些内容:首先,WAF将处理的请求协议限定为HTTP,所以WAF比应用网关防火墙具备更高的专业性和灵活性;其次,WAF可以以代理的形式,在网络中提供Web安全防护,也可以作为插件嵌入到服务端中;最后,我们也可以根据需求、成本和硬件环境等因素,选择不同的部署模式对Web安全进行防护。
|
||||
|
||||
## WAF的功能
|
||||
|
||||
在了解WAF的主要工作模式之后,我们知道,在部署模式上WAF比防火墙具备更高的灵活性。WAF可以根据不同的需求,以不同的形式为Web服务提供保护。同样地,在功能上,WAF也可以去实现一些HTTP请求中特有的安全功能。比如去解析HTTP数据、解密HTTPS流量等。下面,我们就来看一下,WAF到底有哪些功能服务?
|
||||
|
||||
### 1. HTTP解析能力
|
||||
|
||||
我们知道,WAF专注于Web安全。因此,对HTTP请求进行解析是WAF最基础的能力。在HTTP中,通用的内容包括:请求的URL以及其中的参数、HTTP头部信息、POST的body内容等。
|
||||
|
||||
除此之外,某些攻击特征可能隐藏得比较深,比如JSON中的某个字段,无法通过JSON的整体内容检测出来,我们必须一个字段一个字段去判断。因此,WAF还需要解析XML、JSON等RPC传输协议,能够理解对应的key和value分别是什么。
|
||||
|
||||
除了单纯地解析内容,WAF还需要对HTTP内容做必要的处理。为什么要这么做呢?这主要有两方面原因。
|
||||
|
||||
第一,HTTP中的内容可能经过了UrlEncode等编码方式的处理,因此,**WAF需要具备解码能力,避免攻击的特征通过编码来进行绕过**。
|
||||
|
||||
第二,**想要看到HTTPS中的加密内容,WAF必须能够解密HTTPS请求**。在透明代理模式中,WAF需要和服务端同步HTTPS的密钥,才能够获得解密的请求;在反向代理模式中,WAF自带证书,可以直接解密;在插件模式中,WAF依靠服务端解密请求之后,再进行HTTP的解析。
|
||||
|
||||
### 2. Web安全防护
|
||||
|
||||
通过对HTTP请求进行解析、对编码内容进行解码和对HTTPS进行解密之后,WAF就能够获得全部HTTP请求内容了。在此基础之上,WAF就可以对请求内容进行分析,为Web服务提供安全保护了。
|
||||
|
||||
我总结了三种主要的分析手段。
|
||||
|
||||
- 签名匹配:和杀毒软件中病毒库的概念类似,WAF也可以维护一个攻击样本库。样本库中存有已知攻击请求的散列签名,只要HTTP请求内容的散列签名在这个样本库,就说明HTTP请求中携带了攻击内容。
|
||||
- 正则匹配:签名匹配需要请求完全一致才能够检测出来,而正则匹配只需要部分特征就可以检测。WAF可以通过抽象一些攻击特征的正则表达式,对HTTP请求进行检测。比如,如果请求的某个参数中出现了单引号,那么很有可能就是黑客发起的SQL注入攻击。
|
||||
- 行为分析:除了针对单次请求的分析之外,WAF还可以针对连续的访问请求特征进行提取和分析。为什么要这么做呢?这是因为,很多时候,我们无法准确判断单次请求是不是攻击请求,但是如果疑似的攻击请求频繁出现,我们就基本能够确定了。也就是说,一个用户不会频繁地访问同一个页面,而黑客需要对一个漏洞点发起多次尝试,才能够实现攻击的效果。
|
||||
|
||||
在识别到攻击的请求之后,WAF就可以对请求进行拦截,从而避免Web服务受到黑客的攻击了。
|
||||
|
||||
### 3. 审计告警
|
||||
|
||||
WAF还有另外一个重要的功能,就是为Web服务提供安全相关的审计和告警功能。Web安全相关的审计包括:发生攻击的时间、路径、频次等。通过这些信息,开发人员能够知道自己的Web服务面对的攻击威胁是什么样的,也就能够更好地评估威胁,完善Web安全防护机制。
|
||||
|
||||
除此之外,WAF还能提供其他的审计能力。这是因为,WAF能够解析出HTTP请求的全部内容,提供审计所需要的全部日志字段。这些日志可以是各个页面的访问次数、用户的访问行为和接口的响应性能等。尽管这些指标和安全没有太多关系,但是它们对于产品设计和服务质量来说都很常见,那么WAF就可以作为一个统计分析工具,来为你提供服务。
|
||||
|
||||
### 4. 数据保护和虚拟补丁
|
||||
|
||||
反向代理或者插件模式的WAF,还能够对HTTP请求中的数据进行一定的处理,提供额外的数据保护功能。
|
||||
|
||||
最简单的,WAF可以加密HTTP响应中的Cookie内容,使得Cookie以保密的形式存储在浏览器中。当浏览器将加密后的Cookie附加到HTTP请求中的时候,WAF又可以进行解密。这样一来,服务端接收到的始终是明文的信息,而实际上,WAF通过加解密为Cookie提供了额外的保护。另外,WAF还可以对返回内容中的手机号、身份证号等敏感字段进行统一的打码处理,避免因为开发的疏忽,导致这些敏感信息的泄露。
|
||||
|
||||
在介绍插件漏洞的时候,我们提到了防火墙可以提供虚拟补丁的功能,来临时对插件漏洞进行修复。如果插件是Web相关的服务,那么WAF是不是也可以提供虚拟补丁的功能呢?当然是可以的。那WAF是如何提供虚拟补丁的呢?我来举个简单的例子。
|
||||
|
||||
在经典的Structs 2漏洞中,黑客是通过Structs 2中包含的漏洞接口发起攻击的。所以,WAF只需要将这些包含漏洞的接口进行封禁,或者对请求内容中的Structs 2攻击特征(特定接口的异常序列化数据)进行分析拦截,就能够临时避免Structs 2受到已公开的漏洞攻击。之后,我们只需要对Structs 2进行升级再打上补丁,这样就可以下线虚拟补丁了。
|
||||
|
||||
## 总结
|
||||
|
||||
好了,今天的内容讲完了。我们来一起总结回顾一下,你需要掌握的重点内容。
|
||||
|
||||
在今天的课程中,我们主要介绍了WAF的工作模式和主要功能。简单来说,WAF就是专注于Web安全的防火墙,它能够以透明代理、反向代理和插件的模式,运行在网络和系统的各个环节中。从功能上来说,WAF能够解决绝大部分的Web安全问题,对于黑客针对Web的攻击进行分析和拦截,同时提供额外的审计告警、数据保护等能力。
|
||||
|
||||
同样地,在选取WAF的时候,我们首先需要考虑功能的完整性和易用性。公司能够以较低的成本部署WAF,并解决大部分的Web安全问题,这是WAF最关键的效果。其次,就是可配置和可维护性,对于漏过的攻击请求如何进行补充完善,对于误判的请求如何进行放行,这是我们在使用WAF过程中必然会遇到的问题。一个好的WAF产品应该提供友好的入口,供开发和运维人员对漏过和误判的规则进行维护。<br>
|
||||
<img src="https://static001.geekbang.org/resource/image/37/29/3765e8983fd74023b6ab839a7e5b1b29.jpg" alt="">
|
||||
|
||||
## 思考题
|
||||
|
||||
最后,给你留一道思考题。
|
||||
|
||||
任何安全产品都不可能达到100%的安全。你可以思考一下,在Web安全中,黑客能够通过哪些方式绕过WAF的检测和过滤呢?
|
||||
|
||||
欢迎留言和我分享你的思考和疑惑,也欢迎你把文章分享给你的朋友。我们下一讲再见!
|
||||
133
极客时间专栏/安全攻防技能30讲/安全防御工具/21 | IDS:当黑客绕过了防火墙,你该如何发现?.md
Normal file
133
极客时间专栏/安全攻防技能30讲/安全防御工具/21 | IDS:当黑客绕过了防火墙,你该如何发现?.md
Normal file
@@ -0,0 +1,133 @@
|
||||
<audio id="audio" title="21 | IDS:当黑客绕过了防火墙,你该如何发现?" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/5d/dd/5dd02912f466529d94792f0ada20dedd.mp3"></audio>
|
||||
|
||||
你好,我是何为舟。
|
||||
|
||||
在前面两节课中,我们讲了防火墙和WAF的工作模式,以及它们是如何作为内外网的隔离设备,在网络边界进行安全防护的。
|
||||
|
||||
但是,无论是防火墙还是WAF,都无法达到100%的防护效果。黑客总是能有很多其他的办法,来隐藏自己或者直接绕过这些保护机制。因此,我们仍然需要对内网中的行为进行检测,及时发现已经入侵到内网中的黑客。这就需要用到IDS(Intrusion Detection System,入侵检测系统)了。
|
||||
|
||||
那么,IDS的工作模式有哪些呢?它能够实现哪些功能呢?今天,我们就一起来学习,如何通过IDS进行安全防护。
|
||||
|
||||
## 什么是IDS?
|
||||
|
||||
IDS的最终目的是检测黑客的攻击行为。那我们应该在哪里进行检测呢?首先是在网络流量中:黑客在控制了一台服务器之后,需要进行权限提升,而权限提升需要黑客在内网中挖掘各个服务器存在的漏洞。因此,黑客会发起很多探测和攻击的网络请求。其次就是在服务器系统中,黑客也可以利用服务器系统或应用本身的漏洞进行权限提升,同时,黑客也会尝试在系统中留下后门,这些行为都是通过系统操作来完成的。
|
||||
|
||||
因此,根据检测内容的不同,IDS可以分成两种类型:NIDS(Network Intrusion Detection System,网络入侵检测系统)和HIDS(Host-based Intrusion Detection System,基于主机型入侵检测系统)。
|
||||
|
||||
**第一种类型:NIDS。**
|
||||
|
||||
在讲防火墙的时候,我们提到防火墙存在盲区:防火墙只能够检测穿越网络边界的流量,如果黑客已经进入到了内网,那防火墙就没办法提供任何的安全防护了。这个时候,我们就需要使用NIDS了。
|
||||
|
||||
NIDS主要检测网络流量中的攻击行为。区别于部署在网络边界的防火墙,NIDS一般部署在内网的网络节点(路由器或交换机)中,所有的网络请求都会流经这些网络节点,所以,NIDS基本可以获取到对应网络节点下全部的网络行为。
|
||||
|
||||
另外,和防火墙不同的是,NIDS一般不具备拦截网络请求的能力。这也让NIDS能够很好地隐蔽自己,让黑客很难发现。对于防火墙和WAF来说,黑客总是会不断尝试各种方式来绕过这些安全产品,原因就是黑客知道自己被拦截了。因此,这些安全产品需要不断地更新规则策略对抗黑客。如果黑客都不知道NIDS的存在,就不会刻意地去绕过NIDS的检测,这也使得NIDS的检测能力比较稳定,不需要频繁地更新规则策略。
|
||||
|
||||
NIDS是一个比较经典的安全产品,你可以直接使用市面上的开源工具,比如:[Snort](https://www.snort.org/#get-started)、[Suricata](https://suricata-ids.org)等。这些工具也依据CVE库开发了完整的入侵检测规则。以Snort的一条检测规则为例:
|
||||
|
||||
```
|
||||
Rule Header Message alert tcp $EXTERNAL_NET $HTTP_PORTS -> $HOME_NET any
|
||||
Message msg: “BROWSER-IE Microsoft Internet Explorer CacheSize exploit attempt”;
|
||||
Flow flow: to_client,established;
|
||||
Detection file_data;
|
||||
content:"recordset"; offset:14; depth:9;
|
||||
content:".CacheSize"; distance:0; width:100;
|
||||
pcre:"/CacheSize\s*=\s*/";
|
||||
byte_test:10,>,0x3ffffffe,0,relative,string;
|
||||
Metadata policy max-detect-ips drop, service http;
|
||||
Reference reference:cve,2016-8077;
|
||||
|
||||
```
|
||||
|
||||
这个规则是用来检测CVE 2016-8077的。CVE 2016-8077的攻击原理就是,黑客先构建一个恶意网站,如果用户使用IE浏览器访问了这个网站,就会被黑客控制。因此,在第一行的Rule Header中,定义了NIDS需要检测从外网HTTP服务返回给本地的TCP请求,也就是检测用户访问了一个网页并收到的返回请求。然后再Detection这个部分,对该漏洞的关键词进行正则匹配,也就是"/CacheSize\s*=\s*/"。这样一来,我们就能够发现,黑客通过这个CVE漏洞控制用户IE浏览器的攻击行为了。
|
||||
|
||||
所以,我们在使用NIDS的时候,只要注意及时对规则进行维护即可。从Snort的规则中,我们也可以看出,NIDS的检测逻辑就是对请求的内容进行正则匹配,不具备分析上下文的能力。因此,NIDS一般只能够对单次的攻击请求进行检测。
|
||||
|
||||
**第二种类型:HIDS。**
|
||||
|
||||
精明的黑客在控制了服务器之后,会尽可能避免发送大量的网络请求,以此来隐藏自己。那么,我们是不是就没办法发现黑客了呢?当然不是。无论多么精明的黑客也一定会在服务器上留下各种痕迹。不管是入侵的时候,通过各种Web漏洞执行了系统命令,还是入侵成功之后,在系统中埋下了后门,又或者是直接利用系统漏洞进行权限提升,这些操作最终都会在服务器系统上执行。因此,我们可以通过监控各个用户在服务器系统上的行为来检测黑客的存在。这就是HIDS的功能了。
|
||||
|
||||
HIDS主要检测服务器系统中的攻击行为。NIDS运行在某个网络节点之上,相当于集中式地对网络流量进行检测,但是**HIDS运行于每一个服务器中**,也就相当于对系统行为进行分布式检测。那分布式的行为处理有什么好处呢?在NIDS中,我们是基于少量的网络节点检测全部的网络流量。而在HIDS中,只需要每个服务器检测各自内部的行为,也就相当于将资源消耗分散到了每一台服务器中,这就对硬件的性能要求比较低,也就节约了公司的防护成本。
|
||||
|
||||
另外,HIDS一般以ROOT权限运行在操作系统中。因此,HIDS能够监控的行为更丰富,比如:
|
||||
|
||||
- 执行的系统命令
|
||||
- 发起和接受的网络请求
|
||||
- 运行的进程、监听的端口号等
|
||||
- 系统关键文件的完整性
|
||||
- 其他黑客可能留下痕迹的地方
|
||||
|
||||
对比于NIDS,HIDS的开发难度会高很多。主要是因为NIDS只需要部署在关键的网络节点上,一个公司可能也就有几百个这样的节点,而HIDS需要部署在公司所有的服务器中,一个公司有上万个服务器是很常见的事情。而且,我们会在日常使用中频繁改动服务器,这也使得服务器的系统环境很不统一。所以,很多公司都需要基于自己的情况自行开发HIDS。
|
||||
|
||||
据我了解,很多公司都会基于[Osquery](https://osquery.io)来开发HIDS。Osquery提供的信息采集功能可以满足大部分的HIDS需求,我们只需要运行一句简单的SQL语句,就能够拿到系统的关键信息了。比如:
|
||||
|
||||
```
|
||||
SELECT name, path, pid FROM processes
|
||||
|
||||
```
|
||||
|
||||
通过这段代码,我们可以从Osquery中获取到当前的全部进程信息。但是,我之前在测试Osquery的时候,发现它没办法在Centos 5版本的系统中运行,也就不适用于我公司的环境。最终,我只能选择基于Go和C语言,去一项一项实现各类信息采集的工作。
|
||||
|
||||
**第三种类型:IPS。**
|
||||
|
||||
在HIDS和NIDS中,我们分别通过网络行为和服务器系统行为对黑客入侵进行检测。但是,你需要注意,它们都只是检测而已。也就是说,如果你不进行人工干预的话,黑客的入侵行为并不会受到任何影响,仍然可以持续进行。精明的黑客一定会选择夜半三更的时候发起攻击,等你睡觉起来,黑客早已经拿到它们想要的数据了,而你只能看着HIDS和NIDS给出的一堆报警无可奈何。
|
||||
|
||||
这显然不是我们希望的结果。因此,我们在NIDS和HIDS中加入了拦截的能力,就成了NIPS和HIPS,统称为IPS(Intrusion Prevention System,入侵防御系统)。IDS和IPS是相辅相成的,它们唯一的区别在于,IDS强调的是检测,IPS强调的是拦截。当发现了黑客的攻击行为后,IDS会产生报警,然后公司的安全响应人员会对报警进行人工处理。IPS同样会产生报警,不过报警的同时,IPS会尝试对黑客的行为进行拦截,在第一时间限制攻击产生的影响范围。
|
||||
|
||||
IPS的实现总体和IDS比较类似,只是IDS通常不会去修改网络节点和操作系统,而IPS会实现额外的逻辑,对网络节点和系统内的行为进行封停,从而阻止黑客入侵。
|
||||
|
||||
为了加深你对防火墙、WAF、IDS和IPS这些安全产品的理解,我整理了一个对比表格。<br>
|
||||
<img src="https://static001.geekbang.org/resource/image/e4/43/e4d2293036561175b4ae07f464174443.jpeg" alt="">
|
||||
|
||||
## 什么是蜜罐?
|
||||
|
||||
在IDS的检测机制中,我们主要是基于对系统行为和网络请求的分析,判断是否存在攻击行为。这种检测模式会存在两个主要的问题:第一,分析结果总会出现漏报和误判,而这些漏报和误判,不论是对用户还是对安全人员,都会造成极大的困扰;第二,分析的规则都是人工产出的,会存在滞后性。当某种新型攻击出现时,我们很可能无法及时更新IDS的检测规则,让IDS形同虚设。那么,我们应该如何提升分析的准确性呢?对于未知的攻击,我们又该如何及时发现呢?蜜罐就是一种能满足这两点需求的入侵检测工具。
|
||||
|
||||
所谓“蜜罐”,就是一台部署在内网的服务器。这个服务器没有任何保护措施,并且提供带有漏洞的服务,就是为了吸引黑客来攻击它。蜜罐由安全人员部署在网络的各个节点中,理论上,其他开发人员都不会知道蜜罐的存在,也就不会向蜜罐发起任何请求。而黑客入侵内网后,需要对内网进行探测,如果发现蜜罐中的服务有漏洞,自然就会针对蜜罐发起攻击。因此,**蜜罐内的一切行为,都是黑客产生的**。基于蜜罐的报警和日志,我们就能够及时发现黑客的存在,并且还原出黑客的攻击行为。
|
||||
|
||||
蜜罐的类型主要分为两种:低交互蜜罐和高交互蜜罐。
|
||||
|
||||
所谓低交互蜜罐,就是蜜罐内的所有服务都是模拟的,不能提供真实的服务功能。比如,低交互蜜罐为了模拟一个弱密码的SSH服务,它会监听22端口。而黑客一旦向这个22端口发起SSH登录请求,蜜罐就会返回登录成功的响应。但是,蜜罐并没有提供真实的SSH服务,只是模拟了一个登录成功的响应而已,所以黑客并不能通过SSH连接上服务器。
|
||||
|
||||
高交互蜜罐会提供一个真实的服务,而且不施加任何限制,只是用来做详细的记录而已。还是以上面SSH登录为例,在高交互蜜罐中,蜜罐会开启一个真实的SSH服务,黑客能够通过SSH连入并且控制蜜罐。但是,黑客连入蜜罐后的所有行为都会被记录下来,并产生报警。而我们只需要及时处理报警赶走黑客,就可以降低蜜罐被控制后所产生的影响。
|
||||
|
||||
低交互蜜罐和高交互蜜罐的对比也很明显。低交互蜜罐更安全,因为它不提供真实的带有漏洞的服务,只是模拟服务,所以黑客无法控制蜜罐。但模拟的服务可能被黑客发觉,导致黑客不上钩。这个时候,高交互蜜罐对黑客更有吸引力,让我们能有更大的概率发现入侵攻击的行为。
|
||||
|
||||
对比于IDS,蜜罐提供了额外的入侵检测能力,它的主要优势包括:
|
||||
|
||||
- 蜜罐几乎不会产生误报
|
||||
- 蜜罐内的所有行为都是真实的黑客攻击行为,因此数据量小、价值高
|
||||
- 不需要已知的攻击样本,根据黑客的行为我们甚至能够发现新的攻击方式
|
||||
|
||||
当然,蜜罐也是有缺陷的。它的主要缺陷就是,入侵检测的实现非常依靠运气,实现的前提是必须有黑客找到蜜罐。也就是说,如果黑客进入内网后,首先发现其他带有漏洞的正常服务器,就不会进入到蜜罐中了。
|
||||
|
||||
蜜罐的实现比较复杂,它需要恰到好处地把握提供多少的交互,既能吸引黑客,又不至于产生漏洞。好在你并不需要关心它的具体实现,因为网上已经有不少成熟的开源蜜罐了,你可以直接拿来使用。如果你不知道怎么选择,也有人对这些蜜罐进行了比较系统的[分析比较](https://www.freebuf.com/articles/paper/207739.html),你可以参考一下。
|
||||
|
||||
## 如何构建入侵检测体系?
|
||||
|
||||
在了解了IDS、IPS和蜜罐之后,我们发现这几款入侵检测工具各有其优势和不足。因此,在实际的安全防护中,我们通常会将它们组合起来使用。
|
||||
|
||||
首先,蜜罐具备较高的准确率,并且能够发现未知的攻击。因此,我们可以将蜜罐中黑客的行为特征作为攻击样本的特征,输入到IDS和IPS中去。这样一来,IDS和IPS就具备了根据黑客行为自动学习和升级的能力。
|
||||
|
||||
其次,IPS通常是直接拦截黑客的攻击行为,来及时止损。但这样一来,黑客也会察觉到入侵检测系统的存在。因此,我们可以将IPS的检测拦截行为,调整为一旦检测到攻击行为,就将行为转发到蜜罐中。对于黑客来说,攻击行为看起来仍然是成功的,但实际上不会对系统产生任何影响,且攻击行为都被记录下来了。
|
||||
|
||||
最后,为了提升黑客发现蜜罐的概率,我们通常需要在内网中广泛地部署蜜罐。但是,这又增加了很多额外的硬件部署成本。因此,有的HIDS中会嵌入“微蜜罐”,就是利用服务器本身的资源实现一个小型的蜜罐服务。比如,某个部署HIDS的服务器中本来没有MySQL服务,也没有监听3306端口,我们可以通过设置服务器,让HIDS监听3306端口并模拟一个MySQL服务出来。这个MySQL服务是HIDS模拟的,开发人员不会感知到,所以发起MySQL连接的一定是黑客。这就是“微蜜罐”。
|
||||
|
||||
现在,你应该知道了,一个系统化的入侵检测系统需要依靠各个安全产品之间的相互协作,才能够实现防护能力的最大化。我总结了一个成熟的入侵检测系统的组织结构图。<br>
|
||||
<img src="https://static001.geekbang.org/resource/image/91/8b/91c14c7958e8f47091615f687ef7f58b.jpg" alt=""><br>
|
||||
在这个入侵检测系统中,NIDS负责对网络节点进行检测,网络中会包含部署了HIDS的系统和蜜罐系统。最终,我们需要通过ELK来统一收集各个安全产品的检测日志,实现信息同步。所有IDS或者IPS的信息都是相互关联的,我们就能够基于这个完整的信息进行全盘的综合分析了。
|
||||
|
||||
## 总结
|
||||
|
||||
好了,今天的内容讲完了。我们来一起总结回顾一下,你需要掌握的重点内容。
|
||||
|
||||
我们详细讲解了入侵检测相关的安全产品,主要包括IDS、IPS和蜜罐。其中,IDS主要基于网络或者主机行为对攻击特征进行检测;IPS则是在IDS的基础之上增加了拦截攻击,限制黑客的能力;而蜜罐则是一个专门为黑客提供的陷阱,任何进入蜜罐的行为都会被当成攻击行为,供我们进行监控和分析。
|
||||
|
||||
基于纵深防御的原则,入侵检测同样需要各个安全产品相互补充、协同工作,来起到一个更全面的安全防护作用。比如,我们可以将蜜罐中的数据作为分析样本,供IDS和IPS提取签名和行为特征,或者将蜜罐作为IPS的一种拦截手段,使其具备更大的迷惑性等。
|
||||
|
||||
## 思考题
|
||||
|
||||
最后,我们来看一道思考题。
|
||||
|
||||
今天我们提到,入侵检测的几款安全产品可以协同工作。你可以思考一下,我们讲过的几种安全产品(比如:防火墙、WAF和入侵检测系统等)之间,是否也有协同工作的方式呢?
|
||||
|
||||
欢迎留言和我分享你的思考和疑惑,也欢迎你把文章分享给你的朋友。我们下一讲再见!
|
||||
102
极客时间专栏/安全攻防技能30讲/安全防御工具/22 | RASP:写规则写得烦了?尝试一下更底层的IDS.md
Normal file
102
极客时间专栏/安全攻防技能30讲/安全防御工具/22 | RASP:写规则写得烦了?尝试一下更底层的IDS.md
Normal file
@@ -0,0 +1,102 @@
|
||||
<audio id="audio" title="22 | RASP:写规则写得烦了?尝试一下更底层的IDS" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/3f/9a/3fcf9045ffa62b2b268ba0512ce6729a.mp3"></audio>
|
||||
|
||||
你好,我是何为舟。
|
||||
|
||||
在前面的课程中,我们已经介绍了防火墙、WAF和入侵检测。这些产品都有一个共同的特性,就是基于网络请求或者系统行为对攻击的特征进行检测,然后再采取相应的防控手段。这些安全产品基本都和应用本身解耦。也就是说,基本上我们不需要对应用做任何开发和改动,就能够部署这些安全产品。
|
||||
|
||||
尽管解耦在部署上能够节省很大的成本,但解耦同样意味着,安全产品和应用本身是通过接口、请求等形式来进行数据交换的。换一句话说,安全产品只能够看到应用输入和输出的数据,并不知道数据在应用内的流动情况。因此,这种工作模式不可避免会产生一定的误判和漏报。
|
||||
|
||||
我们来看一个关于WAF检测SQL注入的例子。下面是请求代码:
|
||||
|
||||
```
|
||||
http://server.com/login?username=test&password=" or ""="
|
||||
|
||||
```
|
||||
|
||||
WAF可能会检测到password参数中的SQL注入痕迹进行拦截。如果应用采用的是安全的PreparedStatement方法,那这个SQL注入就不会生效,也就不需要拦截。但是WAF和应用解耦,让WAF不知道应用的逻辑,从而产生了误报。
|
||||
|
||||
所以,对于任何安全产品来说,能获取到的数据和信息越多,检测的能力就越强,误判和漏报的概率也就越低。因此,2012年,Gartner提出了RASP(Runtime Application Self Protection)的概念,就是希望将安全产品部署在应用的底层,完全站在应用的视角去发现攻击行为,从而实现更加完善的安全防护。
|
||||
|
||||
## RASP的原理
|
||||
|
||||
想要利用RASP实现更完善的安全防护,首先我们要知道,什么是RASP?以及如何实现RASP?
|
||||
|
||||
RASP的设计思路是通过监控应用的底层,来从根本上发现攻击行为的产生。
|
||||
|
||||
以Java为例,Java应用运行在JVM之上。因此,JVM就是一个底层,它能够看到所有的应用信息。我们可以通过[JavaAgent](https://www.jianshu.com/p/63c328ca208d)的形式将RASP运行在JVM上,然后借助[Instrumentation](https://www.ibm.com/developerworks/cn/java/j-lo-jse61/index.html)技术Hook关键的类和方法。关键类和方法具体有哪些,你可以参照OpenRASP的[Hook列表](https://rasp.baidu.com/doc/hacking/architect/hook.html)。这样一来,RASP就能关注到应用安全相关的信息和调用了。<br>
|
||||
<img src="https://static001.geekbang.org/resource/image/b5/b7/b5634e94b5607221dee2ed3680c0efb7.jpg" alt="">
|
||||
|
||||
同样的原理,在PHP中,我们可以通过PHP扩展库来实现RASP;在.Net中,我们可以通过HostingStartup来实现RASP。
|
||||
|
||||
如果你想要研究RASP产品,那我推荐你使用百度的[OpenRASP](https://rasp.baidu.com/#section-intro)。因为OpenRASP在开源市场中认可度比较高,也是目前各个公司用来研究RASP产品的一个主要对象。
|
||||
|
||||
## RASP的优势和劣势
|
||||
|
||||
我们经常会将RASP和WAF拿来做比较,因为它们主要关注的都是应用相关的Web安全问题。那么对比WAF,RASP有哪些优势和劣势呢?
|
||||
|
||||
首先我们来看优势。在开头我们就提到了,RASP对比于WAF最大的优势在于RASP运行在应用的底层,从而能够知道应用运行时的上下文(比如:用户、代码逻辑、SQL语句等)。在Web安全中,我们针对Web安全的攻击原理进行过总结:SQL注入、反序列化等漏洞其实都是通过输入数据,篡改应用的正常逻辑实现的攻击。
|
||||
|
||||
对于WAF来说,它只能够判断出输入的数据“可能”会篡改应用的正常逻辑,因此WAF的拦截决策都来源于这个可能性。而对于RASP来说,它知道应用的正常逻辑是什么,也知道应用接收输入后实际的逻辑是什么,如果实际逻辑和正常逻辑不一致,就必然发生了攻击。基于这种检测方式,RASP基本不会产生误报或者漏报。
|
||||
|
||||
我们以OpenRASP防止SQL注入的[检测逻辑](https://github.com/baidu/openrasp/blob/master/plugins/official/plugin.js)为例,来看一下RASP是如何进行检测的。算法描述如下:<br>
|
||||
<img src="https://static001.geekbang.org/resource/image/a2/19/a2230de2106ad352ef33bb838b0cf719.jpg" alt=""><br>
|
||||
第1步和第2步很好理解,都是SQL注入的基本特征。那第3步中的“导致SQL语句逻辑发生变化”,OpenRASP要如何去识别呢?假设用户的输入是万能密码"or""=",那么,应用实际执行的SQL语句就是:
|
||||
|
||||
SELECT * FROM Users WHERE Username = “” AND Password = ““or””=""
|
||||
|
||||
在这个SQL语句中,最后的几个字符都是用户的输入。为了检测语句逻辑的变化,OpenRASP将这个SQL语句进行了Token化。所谓“Token化”,就是对SQL语句中的关键词进行拆解,拆解后分别是:SELECT、 *、FROM、Users、WHER、Username、=、""、AND、Password、=、""、or、""、=、""。我们能够清楚地看到,用户的输入“"“or “”=”"”占据了5个Token。而正常情况下,用户的输入应该只占据1个Token。因此,只要用户的输入大于1个Token,就说明SQL语句逻辑存在变化,我们就可以断定存在SQL注入了。
|
||||
|
||||
其次,RASP能够防范未知的攻击。对于SQL注入来说,它的注入点可以是某个GET参数、某个POST的Body、某个Header字段等,具体的攻击方式也多种多样:盲注、基于Insert的注入等。
|
||||
|
||||
WAF的检测规则是一个一个去覆盖这些攻击点和攻击方式。如果黑客发现了某个新的攻击点或者使用了新的攻击方式,WAF根本无法检测出来。
|
||||
|
||||
对于RASP来说,它实际上不关注具体的攻击点和攻击方式是什么,因为SQL注入攻击,最终都会使SQL语句Token化后的长度发生改变。因此,RASP只需要判断执行的SQL语句Token化后的长度即可。所以我才说,RASP能够有效地防御未知的攻击。
|
||||
|
||||
最后,我认为RASP还有一个比较特别的好处,就是基本不用维护规则。我前面讲过的各类安全产品:防火墙、WAF和入侵检测,它们的本质都是检测攻击行为。而这些安全产品的检测方式不论是签名匹配、正则匹配还是行为分析,都包含了大量的规则和算法。这些规则和算法带来的最大问题,就是针对每一家公司我们都需要制定一套单独的规则和算法。因为每家公司的应用和网络环境都不一样,面临的攻击也不一样。
|
||||
|
||||
随着公司的发展以及黑客的对抗升级,我们还需要不停地更新和维护这套规则和算法,这就带来了极大的运营成本。而对于RASP来说,它当然也需要规则和算法来支持,但是它的规则和算法相对统一。
|
||||
|
||||
比如,在Java中,不论你是使用的哪种开发框架,最终执行SQL语句的都是底层的JDBC插件,在这个层次上,攻击的特征都是一致的。因此,RASP基本只需要维护一套统一的规则和策略,就能够适用于所有的公司和应用了。所以,百度在OpenRASP[覆盖面说明](https://rasp.baidu.com/doc/usage/web.html)中敢说“若发现不能拦截的攻击或者误报的情况,请联系我们”,就是这个原因。开源的WAF只会提供一个维护规则的入口,而不会帮助你进行维护。
|
||||
|
||||
尽管RASP存在许多明显的优势,但是目前来看,国内对于RASP的实际落地,普遍还在试验阶段,我很少见到RASP在公司范围内大规模推广落地案例。这是为什么呢?要搞清楚这个问题,就不得不提到RASP的劣势了。RASP的劣势主要有三方面,下面,我们一一来看。
|
||||
|
||||
我认为最大的劣势在于推广难度上。尽管我们一直在提安全,但是事实上,大部分的开发人员并不认可安全,他们也不接受任何可能对应用产生影响的安全产品。这是因为,这些安全产品增加了检测的逻辑,就必然会影响应用的正常运行。而且,WAF等拦截性安全产品产生的误报,会让正常的业务请求受到影响。
|
||||
|
||||
但是,防火墙、WAF和入侵检测,实际上都已经在各个公司很好地落地了。我认为这都归功于安全人员或者运维人员的“强推”。
|
||||
|
||||
在部署一款WAF的过程中,实际上是不需要开发人员参与的,运维人员在网关上直接部署就可以了。而RASP不一样,RASP和应用强耦合,它需要由开发人员去部署。比如,Java中需要通过命令java -javaagent:rasp.jar -jar app.jar来启动RASP,其中的参数javaagent只能由开发人员进行配置。因此,RASP的推广实际上是安全意识的推广,所以难度也比较高。
|
||||
|
||||
其次,RASP的解决方案并不通用。从语言支持上来看,目前RASP只在Java、PHP和.Net语言中具备成熟的产品。其他高级语言,如Python等,可能是因为没有很好的Hook方案,所以目前仍然局限于研究阶段。这也是RASP强耦合所带来的弊端:每一种开发语言,甚至是语言下不同的开发框架,都可能会需要一套独立的RASP产品。而WAF等安全产品,因为网络和系统都比较统一,则不受此限制。
|
||||
|
||||
最后,RASP在性能问题上也备受争议。尽管目前成熟的RASP产品宣称它的性能影响已经低于5%,甚至更低了,但在实际落地的过程中,确实会出现因为系统和应用的差异,而导致性能恶化比较严重的情况。这也是RASP在兼容性不足上所表现出来的缺陷。
|
||||
|
||||
## RASP的其他功能
|
||||
|
||||
除了针对应用的攻击行为进行检测和拦截,和WAF一样,RASP也能够提供很多额外的安全防护功能。
|
||||
|
||||
毫不夸张地说,WAF能实现的功能,RASP都能够实现。因此,WAF中的数据保护、虚拟补丁等功能,RASP也都能够提供,原理也是一致的:都是通过拦截并修改HTTP请求和响应,在HTTP内容中加入额外的安全特性,比如Cookie加密。
|
||||
|
||||
除此之外,因为RASP部署于应用的底层,知道应用的全部信息,所以它本身可以对应用的安全性进行评估。最简单的评估问题如下:
|
||||
|
||||
- 是否使用ROOT权限运行了应用;
|
||||
- 在连接数据库的时候,是否使用了弱密码;
|
||||
- 使用了哪些插件,插件是否包含漏洞。
|
||||
|
||||
RASP可以在应用运行的过程中对这些高危的进程操作进行检测,从而提醒你采取更安全的实现方式。
|
||||
|
||||
## 总结
|
||||
|
||||
好了,今天的内容差不多了,我们一起来总结一下,你需要掌握的重点内容。
|
||||
|
||||
RASP的功能确实能给应用的安全性带来一个质的提升。对比低耦合的WAF等安全产品,RASP的准确率、覆盖度都有较大优势。但是,正因为耦合度过高,RASP部署起来比较麻烦,实际推广落地的时候,经常出现开发人员不配合的情况。总的来说,推广的难度属于管理上的问题,需要你想办法说服开发人员。单纯从安全角度上来说,我认为RASP是一款提升应用安全性的最佳安全产品。
|
||||
|
||||
另外,我认为在实际工作中,我们也可以将RASP和其他安全产品进行适当 组合,以达到取长补短的目的。比如说,RASP推广比较难,我们可以只做局部的部署。这些局部的部署可以当作WAF的样本数据来源,只要RASP在底层发现了攻击行为,就将相应的表层特征输出到WAF。这样一来,我们就可以将RASP在局部上的防御能力拓展到整体的WAF上,从而实现全面的安全防护提升。<br>
|
||||
<img src="https://static001.geekbang.org/resource/image/7f/06/7fb30045c6ee01b1b281187e92d4dc06.jpg" alt="">
|
||||
|
||||
## 思考题
|
||||
|
||||
最后,给你留一道思考题。
|
||||
|
||||
在这一讲中,我们只是以SQL注入为例,讲述了RASP是如何进行攻击检测的。你可以思考一下,对于其他的攻击方式,如反序列化漏洞、命令执行和SSRF等,RASP又该如何防护呢?你可以先学习一下OpenRASP的说明文档,之后再来思考这个问题。
|
||||
|
||||
欢迎留言和我分享你的思考和疑惑,也欢迎你把文章分享给你的朋友。我们下一讲再见!
|
||||
132
极客时间专栏/安全攻防技能30讲/安全防御工具/23 | SIEM:一个人管理好几个安全工具,如何高效运营?.md
Normal file
132
极客时间专栏/安全攻防技能30讲/安全防御工具/23 | SIEM:一个人管理好几个安全工具,如何高效运营?.md
Normal file
@@ -0,0 +1,132 @@
|
||||
<audio id="audio" title="23 | SIEM:一个人管理好几个安全工具,如何高效运营?" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/70/b8/701f4aac820352e5b6e5b6305576f8b8.mp3"></audio>
|
||||
|
||||
你好,我是何为舟。
|
||||
|
||||
在前面的课程中,我们介绍了一些常见的安全产品。但实际上,解决公司的安全问题,并不是部署了这些安全产品就万事大吉了。安全防护的过程是一个与黑客持续进行攻防对抗的过程,黑客总是能够发现新的方法,绕过安全产品的防护,实施攻击。
|
||||
|
||||
如果黑客绕过安全产品,我们应该如何及时发现黑客的攻击呢?具体来说,我们应该如何对黑客的攻击路径和攻击产生的影响进行统计分析?以及在发现黑客的攻击之后,我们要如何提取攻击特征,补充安全产品的检测规则呢?这些都是我们需要持续关注的事情。因此,我们常说“建立一个安全体系很简单,运营好一个安全体系却很复杂”。
|
||||
|
||||
我们经常会使用SIEM(Security Information and Event Management,安全信息和事件管理),来帮助我们运营一个安全体系。通过SIEM,我们可以将散落于各个系统、设备和安全产品中的日志进行汇总和梳理,快速串联出黑客的完整攻击路径,更高效地完成安全体系运营的工作。
|
||||
|
||||
那SIEM究竟是如何高效运营安全体系的呢?下面,我们一起来看。
|
||||
|
||||
## SIEM有哪些功能?
|
||||
|
||||
我们先来说一下SIEM是什么。简单来说,SIEM就是一个基于各类日志,提供安全运营和管理能力的统一平台。基于这个定义,我们来总结一下SIEM的功能。
|
||||
|
||||
首先是收集日志。对SIEM来说,需要收集的日志来源于操作系统、路由器、数据库等业务设备,防火墙、WAF、IDS等安全产品,以及业务前后端本身。
|
||||
|
||||
在收集到大量的日志之后,SIEM会对数据进行分析统计,将海量的日志进行筛选和总结,给予安全运营人员最精简的结果,提高分析效率。经过数据分析之后,安全运营人员就能够快速发现并处理各类安全事件了。
|
||||
|
||||
最后,SIEM还需要提供完整的运营流程。比如,通过工单功能完成安全事件的管理,通过报表追踪各安全产品产生的报警、发起的安全事件、数据的流动情况等,清晰地表现出公司的安全现状和能力。
|
||||
|
||||
没有SIEM平台之前,安全运营人员需要对这些安全事件和报警进行人工处理和记录,不仅效率较低而且容易出现纰漏。有了SIEM平台之后,我们就可以将整个运营工作线上化,大大提升运营的效率和质量。
|
||||
|
||||
## SIEM是如何落地的?
|
||||
|
||||
不知道你有没有发现,我一直强调“运营”这个词。相比我们之前讲过的安全产品,SIEM更加注重运营。因此,落地SIEM可不仅仅是部署一款安全产品这么简单。
|
||||
|
||||
我们之前提到的安全产品(防火墙、WAF、IDS等)都是以技术为导向的。换一句话说,这些安全产品效果好不好,实际上取决于技术和检测规则。只要技术实现上能够满足性能要求,规则上能够尽可能多地覆盖攻击特征、检测黑客行为、减少误伤,就很容易落地并产生收益。
|
||||
|
||||
但是SIEM不一样。我在说SIEM的核心功能的时候,你可能很快联想到,可以使用经典的日志分析组件ELK,去实现SIEM的各个功能。所以你看,SIEM其实不存在特别明显的技术挑战。
|
||||
|
||||
那为什么很多公司在规划做一个SIEM的时候,最终都“虎头蛇尾”、不了了之了呢?原因就是我们一直强调的“运营”能力不足。运营能力不足让这些公司做出来的SIEM空有一个架子,无法实际落地,也就无法产生应有的价值。
|
||||
|
||||
那么问题来了,SIEM究竟该如何落地呢?下面,我就结合SIEM落地的流程图,带你一起分析。<br>
|
||||
<img src="https://static001.geekbang.org/resource/image/56/42/5686ab8e335a54e2ada6fd7568b02542.jpeg" alt="">
|
||||
|
||||
### 1. 制定计划
|
||||
|
||||
首先,当我们决定要做SIEM的时候,需要制定一个长期的计划。依据公司的安全情况,这个长期可能意味着1-3年的持续投入。
|
||||
|
||||
在部署一些成熟的安全产品(比如,防火墙、WAF等)时,公司只需要在采购和研发时进行一次性投入,之后再花费少量的资源运维就可以了。所以,这些安全产品的落地就是发现问题、解决问题的过程。
|
||||
|
||||
但是,SIEM并不是一个通用的安全产品,每个公司都需要花费大量时间磨合SIEM的设计、部署和运转。因此,我们需要制定长期的、体系化的落地计划。通常这个计划分三个阶段:设计阶段、建设阶段和运营阶段。在SIEM启动之前,我们就要预估:每个阶段投入的人力、时间、成本;每个阶段的需求和预期产出;每个阶段按月或者按季度的时间节点等。这些确定下来之后,还要公司同步确认才行。
|
||||
|
||||
### 2. 设计阶段
|
||||
|
||||
计划制定完成之后,就进入设计阶段了。在设计阶段,我们首先需要明确公司对SIEM的需求,或者说,我们希望SIEM能够解决哪些问题。这些问题和需求都是从哪里产生的呢?
|
||||
|
||||
其实,在建设安全体系,引入了部分的安全产品之后,我们在安全运营上会感受到很多痛点。比较常见的,由于安全设备过多,我们在实际分析日志的时候,需要一个一个登录这些设备查找日志,这大大降低了我们的工作效率。
|
||||
|
||||
这个时候,很多人会提出搭建一个SIEM平台来解决这些痛点。但实际上,这些痛点都是很宽泛的需求。这些需求没有很清晰地定位出,SIEM平台究竟需要收集哪些设备上的哪些日志,我们又应该以什么样的格式存储和整合这些日志。
|
||||
|
||||
所以,为了给SIEM一个清晰的定位,我们需要总结出一份详细的需求列表。我认为可以从三方面来总结。
|
||||
|
||||
**第一方面:SIEM需要管理哪些设备,收集哪些数据。**
|
||||
|
||||
这个列表需要根据我们的实际运营工作来进行总结。一般来说,我们可以根据黑客的攻击路径来进行梳理。
|
||||
|
||||
比如,在Web攻击中,黑客首先需要发起HTTP请求。那么黑客会先在前端进行操作,然后HTTP请求经过防火墙、WAF,最终到达服务端。因此,前端、防火墙、WAF和服务端对应的请求日志,我们都需要收集。
|
||||
|
||||
如果涉及进一步的权限提升,那黑客需要在服务器内进行操作,或者通过路由器、交换机访问其他服务器。所以,这些服务器、网络设备和IDS中的行为日志,同样需要收集。
|
||||
|
||||
**第二方面:安全运营目前遇到的痛点的典型场景是什么,预期的解决方案又是怎么样的。**
|
||||
|
||||
安全运营最大的痛点有两个,一是日志分散,二是日志无法关联。通过日志收集功能,我们已经将日志进行了汇总,解决了日志分散问题。那日志间的关联问题该怎么解决呢?
|
||||
|
||||
我们来看一个例子。
|
||||
|
||||
一次Web攻击要收集的日志有很多:网关上记录的一次HTTP请求,WAF上对应的一次判定记录,服务端可能记录的具体请求参数。如果黑客攻击成功,那么系统上还可能留下一次命令执行的记录。如果我们想要将这些日志进行串联,还原完整的攻击链路,就必须要求SIEM在各个日志中能记录特殊的标记。在Web请求中,这些特殊的标记通常是用户ID、IP或者设备ID等。
|
||||
|
||||
更复杂一些的,当HIDS发现了一起攻击时,你可能需要回溯黑客是怎么进入系统的,那我们就需要将HIDS中的日志,和NIDS、WAF等其他日志进行关联。但是,这些日志类型不同,没有能够贯穿始终的标记。这个时候,就需要SIEM能够通过额外的信息进行关联。比如,通过登录日志中的用户和IP关联HIDS和NIDS日志等。对这些关联关系的梳理和定义,决定了SIEM需要以什么形式存储日志。
|
||||
|
||||
**第三方面:完整的安全运营流程是什么。**
|
||||
|
||||
我们最终设计出来的SIEM,肯定不只是简单地堆砌一些功能。对于运营工作来说,工具和标准化流程同样重要。如果在实际工作中,运营人员使用线上工具,执行的却是线下流程。这种状态切换导致的时间消耗,对于运营工作来说反而得不偿失。因此,在数据分析完成之后,我们需要依据运营工作的需求,整合出SIEM需要的管理功能(比如。工单、报表),形成一个完整的运营流程。
|
||||
|
||||
通过对这些需求的分析和整理,我相信你已经能够清晰地预估SIEM的完整形态了。那么,不管是你自己设计、研发,还是采购商业的SIEM平台,你都能够进行合理地功能分析和收益评估了。
|
||||
|
||||
### 3. 建设阶段
|
||||
|
||||
在完成需求设计之后,就进入SIEM平台的建设阶段了。首先,SIEM要收集各种设备和应用的日志,每个公司的设备和应用都有很多,我们没有能够取巧的方式,只能一个一个进行对接。可想而知,SIEM的建设一定是一个十分漫长的过程。SIEM的实施周期长、成本大,所以我们的预期常常很高,很容易产生达不到预期的失落感。
|
||||
|
||||
那么,我们应该如何去建立正确的预期呢?最简单有效的方法就是**建立短期预期,并且快速迭代**。比如,在最开始的建设阶段,SIEM只需要满足日志管理,也就是满足我们在一个统一的平台查看各个日志即可,至于如何去分析数据、产出报表,我们可以放到下一个迭代周期去规划。在明确了这些可实现的预期之后,我们就能理清每个迭代周期的工作,也能够增强公司对SIEM这个长期项目的信心,从而获得更好地支持。
|
||||
|
||||
### 4. 运营阶段
|
||||
|
||||
在收集到部分常用日志,有了基础的数据分析能力之后,安全运营人员就可以使用SIEM平台进行运营分析工作了。
|
||||
|
||||
但是,SIEM平台的运营和建设阶段并不是完全独立的。因为,SIEM平台的建设需要通过不断的短期迭代进行推进。SIEM平台建设迭代周期主要参考的,就是运营阶段SIEM平台的使用情况和产生的需求。
|
||||
|
||||
这样一来,SIEM平台就能够以不断满足安全运营需求为导向,持续完善自身功能,最终大大提升安全运营人员的工作效率。
|
||||
|
||||
## SIEM落地中有哪些常见问题?
|
||||
|
||||
现在,相信你已经知道SIEM平台落地的几个主要步骤了。除此之外,我还想强调SIEM落地中几个常见的问题。
|
||||
|
||||
**第一个:垃圾数据太多。**
|
||||
|
||||
如果你接触过大数据分析,你应该听说过“Garbage in,garbage out”。SIEM的本质其实也是一个大数据分析的平台,它同样对数据的质量有着极高的要求。
|
||||
|
||||
因此,在考虑SIEM的数据收集需求时,我们需要思考清楚哪些日志对SIEM有用,基于这些日志,你是否能够解决安全运营问题。这样一来,SIEM就不会变成一个只用来存储大量无用数据的“垃圾场”了。
|
||||
|
||||
**第二个:数据维度缺失。**
|
||||
|
||||
数据维度缺失对SIEM来说,同样是一个致命伤。为什么这么说呢?SIEM中的数据都是需要长期积累的,某些历史数据一旦缺失就很难有办法补充。因此,经常会出现在使用SIEM的过程中,我们突然发现某些关键字段缺失,导致事件排查中断。
|
||||
|
||||
比如,对于一次网络请求,我们可能会记录的日志字段包括:时间、源IP、目标IP等。但是,当出现一起安全事件时,你除了要知道是哪个IP发起的请求,可能还需要进一步挖掘是哪个用户或者哪个进程发起的这次请求。这个时候,如果数据维度缺失了,就会出现没有日志可以进行关联的情况,分析运营工作也就无法继续下去了。
|
||||
|
||||
**第三个:人员投入不足。**
|
||||
|
||||
SIEM平台实际上是对安全运营工作的一个线上化呈现,而运营工作始终是需要依靠人来进行主导的。很多公司乐观地认为有了SIEM平台,就不需要专门的人员来维持安全运营工作了。
|
||||
|
||||
事实上,SIEM只是一个管理的工具,它无法自己运行,需要有人去使用它。除此之外,随着安全的对抗升级,运营工作的需求也会不断更新,SIEM自身的迭代升级会一直持续。因此,SIEM需要有一个完整的安全团队来进行长期的维护。
|
||||
|
||||
## 总结
|
||||
|
||||
好了,今天的内容讲完了。我们来一起总结回顾一下,你需要掌握的重点内容。
|
||||
|
||||
**安全的发展,前期在于技术建设,长期在于运营升级。**SIEM就是在安全运营升级过程中,为公司提升效率、加强管理的一个工具。SIEM通过收集各个系统和设备的日志,能够为我们提供安全统一管理的基础数据。然后,通过对常见的数据分析和报表展示,SIEM可以帮助我们快速排查安全事件、进行事件管理,同时满足数据报表甚至合规审查的需求。
|
||||
|
||||
你可能听说过这样一句话“技术总是短期内被高估,在长期内又被低估”。SIEM也是一样。SIEM的落地和生效是一个长期发展的过程,很难在短期内有十分明显的收益。所以,我们需要做好长期规划、明确需求,同时拆解目标,一步一个脚印去迭代发展,才能最终将SIEM长期稳定地运营和使用起来。
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/87/e3/87e2e89dbdcbea3ceefee27dbf237ee3.jpg" alt="">
|
||||
|
||||
## 思考题
|
||||
|
||||
最后,我们来看一道思考题。
|
||||
|
||||
如果你的公司使用了很多安全产品,你想要对这些产品进行统一的管理和运营。那么,你需要SIEM收集哪些日志、提供哪些数据分析的能力,来帮助你进行高效运营呢?
|
||||
|
||||
欢迎留言和我分享你的思考和疑惑,也欢迎你把文章分享给你的朋友。我们下一讲再见!
|
||||
134
极客时间专栏/安全攻防技能30讲/安全防御工具/24 | SDL:怎样才能写出更“安全”的代码?.md
Normal file
134
极客时间专栏/安全攻防技能30讲/安全防御工具/24 | SDL:怎样才能写出更“安全”的代码?.md
Normal file
@@ -0,0 +1,134 @@
|
||||
<audio id="audio" title="24 | SDL:怎样才能写出更“安全”的代码?" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/8b/2f/8bae7692a36e7188be71cf7376eecc2f.mp3"></audio>
|
||||
|
||||
你好,我是何为舟。
|
||||
|
||||
安全漏洞的源头是开发,只有当开发人员写出了包含安全漏洞的代码,黑客才有可乘之机。因此,如何保障开发写出更“安全”的代码,是安全防护工作中最关键的一环。
|
||||
|
||||
2004年,微软提出了SDL(Security Development Lifecycle,安全开发生命周期)。因为对安全和隐私的考虑贯穿了整个软件的开发进程,SDL能够帮助开发人员写出更“安全”的代码,在解决安全合规需求的同时,也能减少由安全问题带来的损失。
|
||||
|
||||
和安全标准一样,SDL本质上是一个宏观指导性质的框架。但是,它确实成为了很多公司建设安全开发体系的参照标准。各个公司依据微软的SDL标准,结合自身的实际情况,衍生出了适合公司自身发展的SDL。今天,我们就一起来学习,到底什么是SDL,以及SDL是如何让开发写出更安全的代码的。
|
||||
|
||||
## SDL中的基础概念
|
||||
|
||||
我们先来看一个软件开发中的经典概念:软件开发生命周期DLC(Software Development Life Cycle)(这个概念的英文缩写种类比较多,为了和SDL区分,我们用DLC代表软件开发生命周期)。SDL是以软件开发生命周期为基础发展成的安全框架,所以,了解DLC能够帮助我们更好地认识SDL。
|
||||
|
||||
DLC将软件开发过程分为5个阶段:需求分析、设计、开发、测试和部署。DLC对[5个阶段](https://blog.csdn.net/chktsang/article/details/87007831)的具体描述,都是以业务功能为核心进行展开的,并没有涵盖安全的工作。这显然不安全。
|
||||
|
||||
而且我们都知道,安全问题对公司的威胁是客观存在的。因此,很多公司将安全纳入到测试的工作中。但是,这种做法会导致两个问题:第一,安全问题要等到软件开发完成后才能发现。这个时候,因为一个安全隐患(不是BUG),让开发人员重启开发流程,推动上会遇到较大的阻力;第二,只能关注到最终完成的软件,往往会导致安全人员因为对业务了解不足,漏过一些安全隐患。这些问题的出现,让业内亟需一个能够更好地满足安全需求的软件开发流程,SDL也就应运而生了。
|
||||
|
||||
## 什么是SDL?
|
||||
|
||||
SDL的出现不是为了颠覆传统的DLC框架,而是希望在DLC中加入足够清晰的安全需求,以此来为软件开发的过程提供完整的安全防护。SDL的[标准执行流程](https://www.microsoft.com/en-us/securityengineering/sdl/practices)有7个步骤:安全培训、需求分析、设计、开发、测试、部署和响应。流程如下图:
|
||||
|
||||
<img src="https://static001.geekbang.org/resource/image/e7/88/e7318aeeafb718cd225f5e8fedb26488.png" alt="">
|
||||
|
||||
接下来,我们就一起来看一下,这些步骤中都包含哪些安全工作。
|
||||
|
||||
### 1. 培训
|
||||
|
||||
在SDL中,安全培训是第一步。之所以会这么设计,就是因为很多公司都对安全人员给予了过高的期望,认为他们能够解决一切的安全问题,而忽略了对开发、测试、运维等人员的安全意识培训。这就导致安全人员一直处于一个“救火”的状态,无法从根本上杜绝安全问题的产生。
|
||||
|
||||
因此,SDL中明确提出:开发、测试、运维和产品经理每年至少进行一次安全培训。培训的内容包括安全概念和框架、威胁评估、Web安全、安全测试以及隐私保护等。
|
||||
|
||||
### 2. 需求分析
|
||||
|
||||
SDL要求在需求分析的过程中,我们必须把安全防护的需求考虑进来。在需求分析阶段,安全人员提出的防护需求主要包括三个方面。
|
||||
|
||||
- **安全标准**:为软件制定对应的安全标准。比如,需要对敏感数据进行加密存储、需要进行二次认证等。
|
||||
- **安全指标**:定义软件在上线时需要满足的安全指标。比如,在上线时,软件必须经过安全测试,且不允许存在任何高危漏洞。
|
||||
- **风险点评估**:安全人员会对整体需求进行评估,找出需要对安全性重点关注的部分,也就是风险点。比如某个需求会使用到用户的隐私数据,那么风险点就是这些隐私数据。
|
||||
|
||||
这三个方面的安全需求,能够为软件开发划定最低的安全保障,也能够时刻提醒软件开发环节的各个人员保持对安全的关注。
|
||||
|
||||
### 3. 设计
|
||||
|
||||
对需求进行分析整理之后,我们就需要对软件的功能和架构进行设计了。那我们都需要设计些什么呢?其实就是为后续的开发、测试和部署环节制定响应的方案和计划。针对上面整理出的三个方面的安全需求,我们也需要在设计环节中,给出具体的实现方案。
|
||||
|
||||
- 为安全标准确定具体的实施方案。比如,对敏感数据做加密存储,那么,具体的加密算法是什么,密钥怎么生成和存储,都需要在设计阶段确定方案细节。
|
||||
- 安全指标的响应方案则是在软件开发方案中,尽可能地考虑安全问题,降低可能出现风险的概率。比如,依据最小权限原则,明确软件每个用户和角色能够进行的操作。或者确定审计需求,明确各个阶段需要记录的日志及时发现攻击行为。
|
||||
- 对于需求阶段定义的风险点进行完整的风险评估。依据识别数据、攻击和漏洞的方式,明确需要采取的安全防护机制,提升这些关键风险点的安全性。
|
||||
|
||||
在设计的过程中,我们需要对安全和开发成本进行平衡考量,使得最终的安全设计方案能够被所有项目人员认可。
|
||||
|
||||
### 4. 开发
|
||||
|
||||
在开发阶段,安全人员的工作则是尽可能地避免开发人员的代码出现安全问题。那究竟应该怎么做呢?其实,我们可以通过限制工具和方法、定期审查代码来实现。
|
||||
|
||||
首先,我们可以限制开发人员使用的工具和方法。比如:为了避免插件漏洞,我们可以只允许开发人员使用通过我们验证的插件和工具;为了避免SQL注入漏洞的出现,我们可以限制开发人员使用字符串拼接的方式执行SQL等。
|
||||
|
||||
其次,我们也需要对开发人员产出的代码进行定期的安全审查,通过人工或者工具分析,发现一些没有得到限制的安全漏洞。比如,没有对用户的输入进行验证等。
|
||||
|
||||
### 5. 测试
|
||||
|
||||
在测试阶段,测试人员会对软件的功能进行测试,安全人员需要对软件的安全性进行测试。测试的内容主要包括两个方面。
|
||||
|
||||
一方面,我们需要评估软件是否符合当初的安全设计方案,是否存在不一致的地方。有的时候,虽然我们在设计的时候考虑了最小权限原则,但是在实际开发的过程中,也可能由于开发人员的理解偏差或者BUG,导致权限滥用的出现。因此,在测试阶段我们需要依据当初的安全设计方案,一项一项去确认是否符合要求。
|
||||
|
||||
另一方面,我们要进行动态的安全测试。动态测试的方法有两种,执行漏洞扫描和进行模糊测试。漏洞扫描很好理解,我们可以通过向软件发起一些测试性的攻击脚本,来验证是否存在漏洞。模糊测试就是不断向软件发起随机或者异常的请求,然后看软件是否出现报错等情况,以此来检测可能存在的漏洞。
|
||||
|
||||
### 6. 部署
|
||||
|
||||
在测试完成之后,软件就可以准备部署上线了。
|
||||
|
||||
到这一步,可以说安全人员已经把安全漏洞出现的可能性降到最低了。但是,我经常说“没有100%的安全,安全人员需要随时为可能发生的安全事件做好防护准备”,所以,在软件上线前,我们需要做好安全预案。
|
||||
|
||||
我来举个例子。一旦出现数据泄露事件,运维人员必须第一时间对数据库进行隔离,开发人员需要下线软件相关功能,产品人员需要做好用户的安抚工作,安全人员需要立即对相关日志进行保存,然后分析事件产生的原因。这就是一个安全预案的基本框架,但是每一步的具体操作,还需要我们根据实际情况来细化。
|
||||
|
||||
预案准备完成之后,我们还需要再一次进行安全确认工作。这个过程主要是来确定,软件的整个开发流程是否有严格按照既定的SDL流程进行,以及最终的软件是否满足我们开始提出的三个安全需求。
|
||||
|
||||
在各项事情都确认完毕之后,我们就需要对整个项目进行归档了。归档之后,包括代码、需求列表、设计方案和应急预案在内的所有的内容都不允许改动。
|
||||
|
||||
完成了安全预案、安全确认和归档之后,我们就可以进行软件的最终部署上线了。
|
||||
|
||||
### 7. 响应
|
||||
|
||||
软件上线之后,安全人员所需要做的,就是及时响应和处理安全事件。这就需要用到我们在部署阶段制定的安全预案了,为了执行这个安全预案,我们需要成立安全应急响应小组。这个小组的工作就是对安全事件以及外界的漏洞情报进行监控,一旦发现安全事件立即对事件进行评估,决定需要启动的安全预案。通过安全应急响应小组,我们可以保持对线上软件安全的时刻监控,保障软件的安全和稳定。
|
||||
|
||||
现在,相信你已经能够理解SDL是如何从根源上解决安全问题的了。我来简单总结一下:SDL通过安全培训来解决人的问题,然后在需求和设计阶段提出安全需求,在开发和测试阶段发现安全漏洞,最终在部署和响应阶段处理安全问题。
|
||||
|
||||
## 如何推动SDL落地?
|
||||
|
||||
尽管SDL能够从根本上解决安全问题,但是SDL的落地却依然存在较大挑战。最主要的原因就在于,SDL更像一个规章制度,它必须获得开发人员的认可,而大部分的开发人员很排斥安全制度。
|
||||
|
||||
尽管如此,为了提升公司的整体安全性,我们要尽力推动它落地。那究竟该怎么做呢?我们可以从三方面入手,降低推动SDL落地的难度。
|
||||
|
||||
**1. 我们要基于现有的制度拓展SDL。**
|
||||
|
||||
如果公司已经比较成功地实施了DLC,那SDL的成功落地就已经实现一半了。因为这说明,开发人员已经在一定程度上认可或者接受了这种制度化,我们只需要在此基础上再加入一部分安全内容,就能实现SDL的落地了。这对开发人员的影响不大,也就更容易接受。
|
||||
|
||||
因此,我个人建议不要从零开始强推SDL,应该循序渐进,先定义好普通软件开发的制度,再加入安全元素。
|
||||
|
||||
**2. 我们在落地SDL的时候要灵活变通,不要生搬硬套。**
|
||||
|
||||
SDL的执行流程非常厚重,如果我们严格按照SDL的标准流程执行,在软件开发的每个步骤中加入一定的安全工作,这无论对谁都是不小的负担。所以,我们要根据公司的实际情况灵活变通。
|
||||
|
||||
变通的方法有很多,实现方式上的变通是最常见的一种。我来说几个常见的例子。
|
||||
|
||||
- 将安全培训加入到公司定期举办的内部技术交流分享会中。这样一来,既不会因为强制培训的要求引发开发人员的不满,又能提升培训的效果。
|
||||
- 在制定安全方案的时候,将安全扫描加入到开发提交代码、检测代码质量的过程中,这样就能避免开发人员更改开发流程。
|
||||
|
||||
总之,实现方式上的变通就是将SDL的各个环节按照开发人员最认可的形式,进行灵活的设计和运转,提升SDL的落地效率。
|
||||
|
||||
**3. 在SDL的覆盖面上,我们也可以有所取舍。**
|
||||
|
||||
每个公司都有大大小小的多个业务线,让每个业务线都严格遵守这个SDL流程,是很难实现的。因此,对于一些量级小、敏感数据少的业务,我们可以适当降低安全标准。
|
||||
|
||||
以开发设计环节为例,我们可以不需要根据具体业务提出具体的安全需求,而是梳理出一份包含常见的安全设计方法的通用列表(包含认证规范、加密标准等)。然后,直接将这个列表发放到开发人员手上,让他们自评。这样既提升了开发人员的工作效率,又降低了我们的工作量。
|
||||
|
||||
## 总结
|
||||
|
||||
好了,今天的内容讲完了。我们来一起总结回顾一下,你需要掌握的重点内容。
|
||||
|
||||
SDL可以从根源上解决安全问题:通过加入安全的角色和职责,SDL让安全贯穿软件开发的整个生命周期;通过事前的培训和事后的应急响应,SDL为软件提供了额外的安全防护保障。
|
||||
|
||||
尽管SDL非常实用,但是它的落地仍然面临很多问题。为了推动SDL落地,我们要基于公司已有的开发流程和机制,灵活部署SDL。这样我们才能在做出最小改变的情况下,仍然将安全贯穿于软件开发的各个流程之中,提升公司整体的安全性。
|
||||
|
||||
目前,安全仍然是一个比较特殊的工作,并没有纳入到软件开发的必备工作中去,这也是SDL在国内成功案例并不多的一个主要原因。但是我相信,正如微软等老牌企业的发展历程一样,随着IT行业的不断发展,安全工作会和测试工作一样,逐渐变成一个必备环节。SDL也会成为各个公司的核心规则制度,被大部分人接受。
|
||||
|
||||
## 思考题
|
||||
|
||||
最后,我们来看一道思考题。
|
||||
|
||||
SDL的成功落地需要开发人员的支持和安全人员的高效率工作。你可以思考一下,在SDL落地的开发和测试中,有哪些工作是可以通过工具来自动或者半自动化地完成的呢?这些工具的工作原理又是怎么样的呢?
|
||||
|
||||
欢迎留言和我分享你的思考和疑惑,也欢迎你把文章分享给你的朋友。我们下一讲再见!
|
||||
Reference in New Issue
Block a user