防火墙
当前主流防火墙在基本的基于五元组(源目IP、源目端口、协议号)检查的基础上引入了状态检测,即对于接受的报文顺序有所要求,比如需要先接受到某个5元组的IMCP request(type 8 code 0)报文,然后再从反向接受到对应5元组的ICMP replay(type 0 code 0)报文,才认为这是一个正常状态的报文,并将其放过。如果首包接受到一个ICMP replay报文则会认为其状态不合法并将其丢弃。这样实现的好处在于引入了更为严格的访问控制,能够极大减小伪造源地址攻击的危害。因此,如果业务(主要是TCP这种有状态的)只是单向过墙,需要在防火墙上关闭状态检查。
将部分具有相似属性的接口划分安全域,为不同安全域分配优先级,各个安全域之间按照优先级互访的方法过于不安全。安全域只应该是一个名称,用于对防火墙连接的业务区域做逻辑划分,本身不该有优先级概念。隐式拒绝,按需放通,最小权限才是防火墙策略部署的正确做法。尤其在零信任愈发为各大公司所接受的当下,防火墙更为主要的作用在于拦截不必要的、非预期的访问流量。
防火墙的性能瓶颈主要在新建、并发和吞吐。由于其特性,新建会话需要上送到CPU进行安全过程的处理,进入稳态后才会通过硬件转发,高新建会极大消耗CPU处理能力,比如漏扫多线程对大目的地址段进行扫描、用zmap等扫描工具穿过防火墙进行扫描等很容易就将防火墙打挂,这种状态下由于探测完后就拆链所以并发不大,探测报文基本都是小包所以吞吐也不会成为瓶颈,唯一的瓶颈就行新建,这在防火墙作为出口网关的场景下比较常见。
由于防火墙的状态检查机制,不同状态的连接有不同的老化时间,一旦连接老化后对应五元组的报文经过防火墙时会由于状态非法而被丢弃,部分业务基于其特性要求使用长连接(即对应五元组老化时间变长甚至不老化),如果并发过大而连接不老化会消耗设备内存。
对于多核多线程的防火墙,如果逐流转发,一旦由于五元组hash问题导致流量集中到某几个核处理,将单核打满,即使未达整机吞吐也会出现部分业务丢包的情况。
IPS/IDS
IPS(入侵防御系统)和IDS(入侵检测系统)的区别在于部署位置的不同。IDS主要用于旁路部署在网络中接收镜像流量基于流量特征生成对应的告警日志,优点在于只需接收到镜像就来即可,不会由于增加IDS而影响现有网络或造成业务故障,缺点在于IDS仅检测上报,不对检测到的威胁进行阻断。IPS则是侵入式的部署到网络中,可以实现对检测到的威胁进行拦截阻断,但同时也引入了导致业务故障的风险。
在网络中引入IPS需要考虑如何避免IPS故障导致业务中断。对于IPS可靠性,可以通过双机热备实现故障切换,或者对于透明二层部署的IPS可以通过监控CPU和内存利用率在触发阈值时实现软件bypass,如果IPS有硬件bypass接口,在部署的时候应该考虑优先使用bypass接口对,这样在设备掉电时可以实现硬件bypass。此外,IPS作为7层设备,如果串联进网络中需要在部署前对网络吞吐进行详细评估,避免IPS成为性能瓶颈。
IPS/IDS需要保持特征库和官方最新才能有最好的防护效果。任何一款IPS/IDS都不可避免的存在漏报(false pasitive)和误报(false negative),漏报需要在有对比的情况下才能评估判断,而误报需要及时排除,避免由于频繁的误报掩盖了真实的攻击信息。在设备上线初期可以开启所有规则,然后动作设置为放行并记录日志,定期和业务侧就日志进行沟通,将确认是误报的规则关闭或者放行,一段时间后在基于前期整理的误报规则重新配置IPS规则。对于IPS误阻断业务从业务侧的定位方法可参考我之前写的文章:为什么服务器突然回复RST——小心网络中的安全设备
以上描述的都是网络侧的入侵检测和入侵防御(NIPS、NIDS),HIDS(Host-based Intrusion Detection System)也是防护中不可缺少的一环,尤其是当终端和服务器之间建立的是HTTPS连接时,NIPS和NIDS基本没有检测效果,此时HIDS可以对服务器上的文件进行扫描,并对主机上的操作进行监控,可以及时发现webshell、后门等威胁。关于HIDS更多的信息可见保障IDC安全:分布式HIDS集群架构设计
WAF
WAF常见的部署方式有:透明部署、旁路监听、反向代理。
透明部署的优点和IPS一样,无需改动上下游网络,设备出现异常时可以通过bypass跳过设备保障业务。
旁路监听模式用于对镜像流量进行审计,和IDS功能类似,不过更专注于Web层的防御,部分旁路监听模式的WAF可以通过伪造服务器地址发给RST报文给终端来实现阻断恶意攻击,这需要WAF的响应包比服务器响应包先到达终端才能实现。
反向代理是WAF部署中最常见的部署方式,无论硬件WAF还是软件WAF都适用,在WAF反向代理的场景下,服务器对终端呈现的地址是WAF的反代地址。反代部署的优点在于一方面可以通过路由控制只将需要防护的流量指向WAF从而减少无关流量对WAF性能的影响;另一方面,反代模式下,终端和WAF的反代地址建立一个TCP连接,WAF和服务器建立一个TCP连接,因此可以通过WAF屏蔽掉终端对服务器的感知。
WAF透明部署的缺点在于所有流量都会经过WAF,WAF会消耗性能对这些流量进行转发,而且一旦WAF挂死且bypass失败会导致所有业务中断,有单点故障风险。
旁路部署模式的WAF一般用于威胁监控,部分攻击需要基于服务器返回值才能进行判断,所以在做流量镜像时需要保证双向流量都被镜像到WAF,否则会导致WAF的检出率下降。
反代模式部署时,对外提供的服务器地址是WAF地址,需要在部署阶段考虑WAF的高可用性,避免在WAF故障后业务无法迁移,常见的做法是在出口防火墙上对WAF监听地址做一次NAT,一旦WAF故障后可以在防火墙上修改映射关系将映射地址指向服务器地址。此外,由于WAF会作为客户端向服务器发起访问,如果业务并发过大,需要在部署初期考虑到WAF反代时候连接服务器的地址是否能池化,如果WAF连接服务器时只有一个地址那么即使把保留端口(1-1024)用上,最大并发(五元组)也只能是65535个。如果出现服务器主动发FIN拆除连接的情况,可用并发数会更低。具体请见之前写的例子:TCP状态机:当服务端主动发FIN进TIME_WAIT,客户端源端口复用会发生什么
作为一个七层设备WAF对Web攻击的敏感度要远高于IPS,因此在部署上线初期必然会出现大量的误报,为了将业务影响降低到最小,可以在上线初期对业务流量仅检测记录日志不阻断,在手工排除误报项后定期和业务侧对无法确定是否为误报的项进行沟通,整理出规则例外列表和误报URL,当规则例外列表中的规则数和误报URL数趋于稳定后,可以将明细的误报URL加白,对于规则例外列表中的规则谨慎禁用,将其他规则启用阻断后WAF完成上线。特征库是WAF识别能力的重要依据,因此需要保持特征库最新。建立和业务侧的沟通机制及时解决误阻断。
虚拟局域网
当前最常见的虚拟局域网技术有IPsec、SSLV P N、L2TP等。基于IPsec流量可以通过ESP进行加密保证传输的安全性,常用于点对点之间建立加密通道保护数据流。SSLV P N基于SSL提供加密传输,可以支持Web接入、TCP接入、IP接入,是远程办公的首选方式。L2TP可以封装2层报文并且能够提供终端身份认证功能,但是其本书不具有加密能力,因此L2TP常常结合IPsec使用,在提供认证的同时对流量进行加密,主要用于移动终端远程接入内网。
IPsec部署最大的困难在于需要一一比对建立IPsec隧道的两端设备的各项参数,基于IKE的IPsec认证中,一阶段主要实现双方互相进行身份认证,以及协商保护二阶段所需要使用的加密和认证算法,二阶段主要用于双方交换IPsec加密相关算法,协商感兴趣流。IPsec建立起来后,对IPSec的维护主要有两方面的工作:一方面是对于新增业务,需要同时修改两端的IPSec感兴趣流,两端协商出来的感兴趣流是各自感兴趣流的交集。另一方面需要防止IPSec隧道异常断开,异常断开一般是由于中间链路不稳定导致报文被丢弃或者长时间没有业务流量经过IPSec隧道自然老化,可以通过配置DPD检测的方式规避此类问题。
SSL VPN有丰富的认证方式,可以在拨号过程中完成多因素身份认证(我是谁、我有什么、我知道什么),常见的认证有:用户名密码认证、证书认证、短信认证等,而用户名和密码认证即可以在设备本地完成,也可以将认证数据摆渡到远端的Radius、LDAP等类型的认证服务器,基于其返回结果对终端进行动态授权。终端通过SSLV P N进行IP接入后会在终端生成虚拟网卡,该网卡会基于网关设备上配置的策略进行路由下发将匹配的流量转发到SSL隧道网关处理。在此种场景中需要注意,如果不是所有流量都强制走SSL隧道网关,终端通过域名方式访问内网资源时,由于终端系统的实现,会轮询进行DNS查询,有可能会通过本机物理网卡设置的DNS地址进行解析,进而出现解析失败或者解析到公网地址的情况。对于此类异常,一般需要强制流量走VPN隧道或者修改终端host来解决。
两种加密隧道还有一个共性问题,由于隧道内部封装的是IP层报文,为了保持一致性,外层隧道报文的IP层一般会复制内层报文IP头中的FLAG置位情况,也就是说,如果内层报文的DF(DONTFRAGMENT)标志位置位,外层隧道报文也会将自己的DF标志位置位。如果内层报文比较大,在经过加密、外层封装后,整个报文的长度可能大于接口MTU,又由于该报文设置了DF位,因此报文到达出出接口时会由于报文长度大于MTU,而又不允许分片导致报文被丢弃造成业务异常。常见的规避办法是在设备连接内网资源的接口上或者全局调小TCP MSS 值,减少封装后报文长度大于MTU的情况出现。但是TCP MSS的值也不宜设置过小,否则会导致文件传输速率明显降低。
漏扫
基于其扫描对象,常见的漏扫系统可以分为主机漏扫、Web漏扫、数据库漏扫。
主机漏扫通过目标主机发现→端口探测→服务枚举的顺序进行扫描,基于获取到的服务信息,读取服务版本号以此作为一个重要的漏洞判断依据,在主机漏扫的扫出漏洞中,最常见的是基于主机OpenSSL或OpenSSH版本号列举出来的相关版本漏洞以及基于交互过程中获取的加密算法、密钥长度、证书等信息得到的协议弱点相关漏洞,基于POC对主机系统进行检测后得到主机操作系统相关漏洞,另一方面也可以使用密码字典对探测出来的服务进行弱口令检测,常见的有RDP登录弱口令、FTP弱口令、SSH弱口令等。
Web漏扫通过url爬取、目录枚举、组件版本探测等进行信息收集,构造请求报文访问爬取的url连接通过对比响应报文判断是否存在Web安全漏洞(诸如SQL注入等),目录枚举获得的信息可能存在敏感信息泄露等问题,而基于组件版本号可以列举出对应组件存在的已知漏洞。
数据库漏扫相较于前两者更专精于数据库弱点的扫描,支持丰富的数据库种类和版本,通过数据库漏扫实现弱口令扫描和老版本已知弱点扫描。
漏扫的使用大同小异,主机漏扫在配置时需要注意两点:主机发现的方式,在对地址段的扫描中,一般会先进行主机发现,通过arp探测、icmp探测、常用端口探测等方式进行主机发现,这样可能会漏掉部分拦截了icmp报文、未监听知名端口的主机,所以如果需要一个完整的扫描结果而不是追求效率的话,可以考虑跳过主机发现;主机漏扫的端口探测缺省一般是常见知名端口,如果应用侧将服务修改成监听在非知名端口时,使用缺省扫描可能错过相关服务的检测。Web漏扫检测的目标url数量直接关系到最终探测到的漏洞数量,漏扫可以通过顺序爬取Web页面或者用户使用漏扫内置浏览器进行访问漏扫记录访问URL的方式进行扫描。
漏扫作为旁路设备,其本身并不承载业务流量,但是在使用漏扫的过程中很可能会影响到生产业务。漏扫在主机发现和端口探测阶段会发送大量的握手报文,如果中间设备通过CPU对这些报文进行转发,很可能导致中间设备由于CPU繁忙而丢包,造成业务不可用。另一方面,对于部分兼容性不好的应用,漏扫发送的非预期接收数据包可能导致应用处理异常,造成业务不可用,因此,在开始进行漏洞扫描前,需要基于网络情况评估合理的并发值、并和业务部门对关键应用的扫描方式进行沟通,在不影响业务的前提下进行扫描。
漏扫不可避免的存在漏报和误报,对于漏报,使用多款工具进行交叉测试可以集各家所长尽可能全面的收集到系统弱点信息;对于误报,最好能从网上找到基于漏洞原理测试的PoC或者测试工具进行二次确认。此外,漏扫在运行过程中会导致被扫描的主机系统产生大量的日志,可能淹没真实的攻击流量和威胁,因此,如果漏扫功能上支持,可以在扫描请求报文中携带特征字段,用于目标系统快速排出漏扫日志。
最后,漏扫本身的安全性常常被忽略,由于其扫描各类资产的需求,为了方便,很可能内网中的安全设备对漏扫都加了白,而且有的环境中漏扫甚至跨区域存在,如果漏扫被攻破,则很可能到内网所有主机可达,因此,需要对漏扫系统本身进行持续的安全加固,并且做到只在使用的时候将漏扫接入网络中,不同隔离区域之间使用不同的漏扫,避免漏扫成为打通各个区域的工具。
抗DDoS
DDoS攻击主要通过消耗目标系统的资源(连接建立能力、请求处理能力)或者带宽来实现攻击的目的。
消耗连接建立能力常见于syn flood攻击,攻击者通过伪造源地址或者控制僵尸主机向目标服务器监听端口发起 tcp syn连接,服务器响应syn + ack并为终端分配TCB,终端不响应服务器发出的syn + ack导致服务器反复重传,大量的syn包会消耗服务器的CPU新建能力,TCB占用内存资源,导致服务器无法处理正常客户端的请求报文。
消耗请求处理能力的攻击常见于应用层攻击,比如HTTP慢速攻击和CC攻击,HTTP慢速攻击利用HTTP的协议特点( 表示header结束, 表示header换行),通过以极慢的速度发送请求头,导致服务端一直在请求状态最终耗尽服务器资源;CC攻击通过发送大量不同的查询请求(等需要消耗性能进行计算的请求),消耗服务器资源,导致服务器无法提供正常服务。
带宽消耗型的攻击常见于反射放大攻击,由于其需要反射的特性(伪造源地址为受害主机),攻击客户端无法和反射源构建稳定的连接状态,所以无连接的UDP承载的上层应用是这类攻击的首选利用对象。常见的反射放大攻击有DNS反射放大攻击、NTP反射放大攻击、以及其他一些基于UDP的应用bug导致的反射放大攻击,如18年memcached爆出的UDP反射放大攻击。DNS反射放大通常会利用EDNS0扩展实现得到更大的UDP响应包借此放大攻击效果,NTP反射放大攻击利用NTP服务器mode 7的monlist功能伪造源地址发起请求,服务器响应最近请求的600个终端IP,触发反射放大攻击。
DDoS攻击的防御和治理需要从整个攻击链条上进行,包括:僵尸网络的治理(从源头阻断DDoS攻击的产生)、反射源的安全加固(减少被用作攻击资源的可能)、终端源地址来源确认(缓解伪造源地址攻击)、使用内容分发网络(CDN,对攻击流量进行稀释)、部署抗DDoS设备(攻击流量的清洗)。
对于被攻击者而言,后两种在服务器端可以比较方便进行部署。通过将业务域名解析到CDN,在CDN缓存静态页面,只有动态操作才通过CDN反代到真实服务器处理,一方面CDN对静态页面的代答减小了服务器端的负载压力,另一方面CDN的反代模式也能对网络层及传输层的攻击流量进行拦截,最大程度上保证了服务器端的安全。
在网络出口部署硬件抗DDoS设备也是一种极为有效的防御方法,适合对资源消耗型的DDoS攻击进行防御,在硬件抗DDoS中常见的拦截方法有:针对ICMP攻击的ICMP限速,针对TCP syn flood的syn cookie、syn首包丢弃,针对UDP flood的UDP限速,针对CC攻击的请求限速、验证码、JS挑战码等。
在部署模式上抗D设备比较灵活,可以串联部署到网络中对所有流量进行转发,对防护主机进行攻击检测和拦截保护,优点在于部署简单,无需上下行设备配合,缺点在于所有流量都会流经设备,影响防护性能。
此外抗D设备也可以使用旁挂出口的方式进行部署,通过在出口设备上将需要防护的流量指向抗D,抗D处理完后再转发给出口或者出口的下行设备,优点在于只专注防护站点的流量处理,没有其他干扰,处理能力更强。缺点在于需要出口设备配合,改动出口。
有的抗DDoS设备为了提升处理能力将检测和控制进行了分离,也就是说其中一个组件负责对镜像流量进行检测,当检测到针对防护主机的攻击后联动清洗设备通过OSPF或者BGP路由注入的方式将防护主机的32位主机路由注入到被旁挂的设备中实现将对应主机流量牵引到清洗设备的目的,清洗完成后再将正常流量发送给防护主机,这种模式使得流量处理能力可以得到极大的增强,两组设备各司其职,正常情况下只检测不处理,一旦触发攻击防范阈值则可以立即将流量牵引到清洗设备,通过联动共同完成对攻击流量的检测清洗,其缺点是部署复杂,需要仔细规划网络拓扑,运行动态路由协议。
对于CDN的部署,一方面需要注意CDN的可靠性,其基于域名解析的方式决定了local DNS server会存在缓存,一旦CDN故障,可能导致终端访问异常无法第一时间恢复;另一方面要避免攻击者绕过CDN直接发起向真实IP的攻击,这种情况下可以考虑开白名单只允许来自CDN的地址访问。
出口硬件抗D需要注意阈值设置,建议在经过几个业务高峰周期后基于服务侧的新建、并发峰值评估一个弹性值后来设置阈值,在现网中较为常见的故障时开启了ack flood攻击,在文件下载或者资源访问中会有大量ack包传递,触发攻击防范后,ack包被丢弃,导致业务访问变慢,实际中ack flood攻击很少见(过不了攻击终端出口的防火墙状态检查)可以考虑不开启,避免误阻断。
此外,应该纠正通过防火墙/IPS等设备来拦截DDoS攻击的想法,这类设备对DDOS攻击的处理常常需要CPU来抗会极大的消耗设备性能,难以防御真正的DDoS攻击。