This commit is contained in:
louzefeng
2024-07-11 05:50:32 +00:00
parent bf99793fd0
commit d3828a7aee
6071 changed files with 0 additions and 0 deletions

View 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&amp;fromid=2104129&amp;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="">
## 思考题
最后,我们还是来看一道思考题。
你还接触过哪些安全标准和框架,它们又包括了哪些内容和思想?你认为该如何依靠这些思想,去推动公司的安全建设?
欢迎留言和我分享你的思考和疑惑,也欢迎你把文章分享给你的朋友。我们下一讲再见!

View 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端口也能拦截爆破的请求。所以防火墙是面对外部入侵的第一道防线。
当然,这只是个简单的例子,现实中黑客的攻击手段更多,攻击场景也更加复杂。那这个时候,防火墙是如何为系统和网络提供保护的呢?具体来说,防火墙能够拦截哪些攻击呢?它的盲区又是什么呢?今天,我们就一起来学习,如何通过防火墙进行安全防护。
## 防火墙如何为网络提供保护?
你对防火墙应该不陌生。为了咱们统一一下思想,方便学习后面的内容,这里我还是再和你啰嗦几句。
防火墙是部署在网络边界上的一种安全设备其概念比较宽泛根据需求不同可以工作在OSIOpen 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等对这些端口进行限制呢
欢迎留言和我分享你的思考和疑惑,也欢迎你把文章分享给你的朋友。我们下一讲再见!

View 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安全的防御能力相对欠缺。因此WAFWeb Application FirewallWeb应用防护系统的概念也就被提了出来。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的检测和过滤呢
欢迎留言和我分享你的思考和疑惑,也欢迎你把文章分享给你的朋友。我们下一讲再见!

View 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%的防护效果。黑客总是能有很多其他的办法来隐藏自己或者直接绕过这些保护机制。因此我们仍然需要对内网中的行为进行检测及时发现已经入侵到内网中的黑客。这就需要用到IDSIntrusion Detection System入侵检测系统了。
那么IDS的工作模式有哪些呢它能够实现哪些功能呢今天我们就一起来学习如何通过IDS进行安全防护。
## 什么是IDS
IDS的最终目的是检测黑客的攻击行为。那我们应该在哪里进行检测呢首先是在网络流量中黑客在控制了一台服务器之后需要进行权限提升而权限提升需要黑客在内网中挖掘各个服务器存在的漏洞。因此黑客会发起很多探测和攻击的网络请求。其次就是在服务器系统中黑客也可以利用服务器系统或应用本身的漏洞进行权限提升同时黑客也会尝试在系统中留下后门这些行为都是通过系统操作来完成的。
因此根据检测内容的不同IDS可以分成两种类型NIDSNetwork Intrusion Detection System网络入侵检测系统和HIDSHost-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 -&gt; $HOME_NET any
Message msg: “BROWSER-IE Microsoft Internet Explorer CacheSize exploit attempt”;
Flow flow: to_client,established;
Detection file_data;
content:&quot;recordset&quot;; offset:14; depth:9;
content:&quot;.CacheSize&quot;; distance:0; width:100;
pcre:&quot;/CacheSize\s*=\s*/&quot;;
byte_test:10,&gt;,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能够监控的行为更丰富比如
- 执行的系统命令
- 发起和接受的网络请求
- 运行的进程、监听的端口号等
- 系统关键文件的完整性
- 其他黑客可能留下痕迹的地方
对比于NIDSHIDS的开发难度会高很多。主要是因为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统称为IPSIntrusion 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和入侵检测系统等之间是否也有协同工作的方式呢
欢迎留言和我分享你的思考和疑惑,也欢迎你把文章分享给你的朋友。我们下一讲再见!

View 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&amp;password=&quot; or &quot;&quot;=&quot;
```
WAF可能会检测到password参数中的SQL注入痕迹进行拦截。如果应用采用的是安全的PreparedStatement方法那这个SQL注入就不会生效也就不需要拦截。但是WAF和应用解耦让WAF不知道应用的逻辑从而产生了误报。
所以对于任何安全产品来说能获取到的数据和信息越多检测的能力就越强误判和漏报的概率也就越低。因此2012年Gartner提出了RASPRuntime 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安全问题。那么对比WAFRASP有哪些优势和劣势呢
首先我们来看优势。在开头我们就提到了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的说明文档之后再来思考这个问题。
欢迎留言和我分享你的思考和疑惑,也欢迎你把文章分享给你的朋友。我们下一讲再见!

View 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>
你好,我是何为舟。
在前面的课程中,我们介绍了一些常见的安全产品。但实际上,解决公司的安全问题,并不是部署了这些安全产品就万事大吉了。安全防护的过程是一个与黑客持续进行攻防对抗的过程,黑客总是能够发现新的方法,绕过安全产品的防护,实施攻击。
如果黑客绕过安全产品,我们应该如何及时发现黑客的攻击呢?具体来说,我们应该如何对黑客的攻击路径和攻击产生的影响进行统计分析?以及在发现黑客的攻击之后,我们要如何提取攻击特征,补充安全产品的检测规则呢?这些都是我们需要持续关注的事情。因此,我们常说“建立一个安全体系很简单,运营好一个安全体系却很复杂”。
我们经常会使用SIEMSecurity 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 ingarbage 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收集哪些日志、提供哪些数据分析的能力来帮助你进行高效运营呢
欢迎留言和我分享你的思考和疑惑,也欢迎你把文章分享给你的朋友。我们下一讲再见!

View 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年微软提出了SDLSecurity Development Lifecycle安全开发生命周期。因为对安全和隐私的考虑贯穿了整个软件的开发进程SDL能够帮助开发人员写出更“安全”的代码在解决安全合规需求的同时也能减少由安全问题带来的损失。
和安全标准一样SDL本质上是一个宏观指导性质的框架。但是它确实成为了很多公司建设安全开发体系的参照标准。各个公司依据微软的SDL标准结合自身的实际情况衍生出了适合公司自身发展的SDL。今天我们就一起来学习到底什么是SDL以及SDL是如何让开发写出更安全的代码的。
## SDL中的基础概念
我们先来看一个软件开发中的经典概念软件开发生命周期DLCSoftware 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落地的开发和测试中有哪些工作是可以通过工具来自动或者半自动化地完成的呢这些工具的工作原理又是怎么样的呢
欢迎留言和我分享你的思考和疑惑,也欢迎你把文章分享给你的朋友。我们下一讲再见!