安全产品的核心逻辑-IPS/IDS

概述

《软件定义安全》中介绍了,所有的安全产品本质上就是对安全业务的软件开发,在《安全产品的核心逻辑-防火墙》中介绍了防火墙的核心点和核心逻辑。本文介绍ips/ids的核心内容和核心逻辑。

一、IPS/IDS作用

IPS(Intrusion Prevention System)入侵防御系统,部署在网络入口,一般放在防火墙后面,通过分析网络流量,检测攻击行为,并实时阻断攻击行为,保护企业信息系统不受侵害。IDS(Intrusion Detection System)入侵检测系统,和IPS的主要差异是只检测不阻断。所以在讨论产品的时候,这两个产品基本上放在一起讨论,技术原理功能都比较类似。IPS也有配置项,可以做到只检测不阻断,这个时候就当IDS来使用。

图片

二、IPS/IDS技术

因为IPS/IDS要检测攻击异常数据,所以应当部署在需要关注流量的位置。IPS是串联在网络里面,这样可以做阻断,IDS串联或者旁路在网络上都可以。

2.1 流量采集

第一个要用的核心技术是采集流量,流量从网卡获取,采集流量目前主要的技术有三类:libpcap,PF_RING,DPDK

2.2 libpcap

libpcap(Packet Capture Library),即数据包捕获函数库,是Unix/Linux平台下的网络数据包捕获函数库。它是一个独立于系统的用户层包捕获的API接口,为底层网络监测提供了一个可移植的框架。

libpcap主要从网络设备驱动程序中收集流量数据,然后判断是否接收该数据包。Libpcap利用BSD Packet Filter(BPF)算法对网卡接收到的链路层数据包进行过滤。libpcap的包捕获机制就是在数据链路层加一个旁路处理。当一个数据包到达网络接口时,libpcap首先利用已经创建的Socket从链路层驱动程序中获得该数据包的拷贝,再通过函数将数据包发给BPF过滤器。BPF过滤器根据用户已经定义好的过滤规则对数据包进行逐一匹配,匹配成功则放入内核缓冲区,并传递给用户缓冲区,匹配失败则直接丢弃。如果没有设置过滤规则,所有数据包都将放入内核缓冲区,并传递给用户层缓冲区。

性能问题:在 libpcap 中,当网卡接收到一个数据包之后,网卡驱动程序调用系统函数将数据包从网卡拷贝到核心态内存,应用程序想访问位于核心态内存的数据时,就必须将数据包从核心态内存中拷贝到用户态内存中(即两次拷贝),这种方式会占用了很多系统资源,所以libpcap性能不是特别高

2.3 PF_RING

PF_RING针对libpcap的性能问题进行了改进:将网卡接收到的数据包存储在一个环状缓存中,这个环状缓存有两个接口,一个供网卡向其中写数据,另一个为应用层程序提供读取数据包的接口,从而减少了内存的拷贝次数,若将收到的数据包分发给多个环形缓冲区则可以实现多线程应用程序的读取。

每创建一个PF_RING套接字便分配一个环形缓冲区,当套接字结束时释放缓冲区,不同套接字拥有不同缓冲区,将PF_RING套接字绑定到某网卡上,当数据包到达网卡时,将其放入环形缓冲区,若缓冲区已满,则丢弃该数据包。当有新的数据包到达时,直接覆盖掉已经被用户空间读取过的数据包空间。

网卡接收到新的数据包后,直接写入环形缓冲区,以便应用程序直接读,若应用程序需要向外发送数据包,也可以直接将数据包写入环形缓冲区,以便网卡驱动程序将该数据包发送到相应接口上。

pfring分了两个版本,一个版本是兼容libpcap接口的版本。另一个版本是零拷贝版本叫做pf-ring zc,这个版本接口完全独立,需要重新开发,需要注意的是这个版本是收费的。从性能看pf-ring zc做到了真正的零拷贝,pf-ring还会有一次拷贝,所以pf-ring zc的性能好很多。

2.4 DPDK

DPDK全称Intel Data Plane Development Kit,是由6WIND,Intel等多家公司开发,主要基于Linux系统运行,用于快速数据包处理的函数库与驱动集合,可以极大提高数据处理性能和吞吐量,提高数据应用程序的工作效率。通俗地说,就是一个用来进行包数据处理加速的软件库。

DPDK使用了轮询(polling)而不是中断来处理数据包。在收到数据包时,经DPDK重载的网卡 驱动不会通过中断通知CPU,而是直接将数据包存入内存,交付应用层软件通过DPDK提供的接口来直接处理,这样节省了大量的CPU中断时间和内存拷贝时间。

目前用DPDK的最广泛,不过这个技术的开发周期比较长。

三、包重组

数据在网络上传输由于长度限制需要拆分成一个报文一个报文的传输,在到达目标系统中进行重组还原数据。这一过程称为分片(fragmentation)。每一种物理网络都会规定网络数据帧的最大长度,称为链路层MTU(Maximum Transmission Unit)。IP协议在传输数据包时,若IP数据包加上数据帧头部后长度大于MTU,则将数据报文分为若干分片进行传输,并在目标系统中进行重组。比如说,在以太网环境中可传输最大IP报文大小(MTU)为1500字节。如果要传输的数据帧大小超过1500字节,即IP数据报长度大于1472(1500-20-8=1472,普通数据报)字节,则需要分片之后进行传输。

IPS/IDS如果需要进行攻击检测分析首先就需要对包进行重组,只有这样才能拿到完整数据进行分析,如果不重组单个包进行分析,效果会大打折扣。所以对采集过来的数据流量后,第一步需要做的事情就是包根据会话进行重组,确保应用层数据的连续性

可选的技术有libnids,他主要功能包括捕获网络数据包、IP碎片重组、TCP数据流重组以及端口扫描攻击检测和异常数据包检测等。IP碎片重组是libnids的一个重要内容,是仿照linux内核中的IP重组而实现的,所以可靠性还可以。libnids提供了TCP数据流重组功能,这是libpcap所不具备的,利用TCP数据流重组,可以分析基于TCP协议的各种应用层协议。但这个框架开源的时间比较长后面更新比较慢,有很多场景不一定能满足,所以更多的公司是自己写代码从头做这个事情。

四、协议识别和协议解析

下一步需要根据内容识别出多种应用层协议识别出应用层协议后,根据具体协议进行精细的解码并深入提取报文特征进行入侵检测。

目前采用的技术一般统称是DPI(Deep packet inspection,深度数据包检测,本质是一种数据报文过滤技术。所谓“深度”是相对“普通的报文解析”而言的。普通报文检测仅会分析数据报文的 IP 五元组(源地址、目的地址、源端口、目的端口以及协议类型)进行检测。而DPI 除了支持上述的报文首部解析之外,还增加了对内容的解析,可以识别各种应用类型及其内容。当 IP 数据包、TCP/UDP 数据流通过基于 DPI 技术的报文解析系统时,该系统通过深入读取 IP 报文内容来对应用层信息进行分析,从而得到分析应用程序的上层协议,但内容分析也会存在很多问题,有很多协议的特征不是很明显,也有很多协议的特性很类似,所以这个识别会有一定的误差。所以如何准确高效的识别出协议是这类产品的核心能力之一。

五、检测技术

当正确的收集数据并重组还原协议后,下一步就要做威胁检测了,威胁检测技术主要有两种:基于特征的检测基于异常的检测。两种技术各有优缺点,大多数产品都实现了两种技术,有的公司还宣称可以实现基于机器学习的检测技术,了解他们的长处和短处能更好地了解产品。

5.1 基于签名的检测

使用基于签名的检测,是基于知识库的检测,可以对已知恶意流量进行标记,形成规则或模式。一旦发现流量中有与签名匹配的流量时候,就会发送警报通知管理员。这些警报可以发现已知的恶意软件、网络扫描活动和针对服务器的攻击等问题。

5.2 基于异常的检测

使用基于异常的检测,是基于行为分析的,生成流量的行为比其他事件的负载要大很多。基于异常的检测依赖的是基线而不是签名。系统将实时或者定时根据已经定义的几个指标统计流量信息,当前流量的统计信息偏离历史上统计信息的值比较大的时候。例如,如果一个用户总是从一个地方访问网络,如果相同的用户从另外一个地方登录并访问网络,这种行为就偏离了之前的统计信息,这个时候系统就会产生一条告警让管理员来确认是否是异常。

大多数产品都同时支持基于签名和基于异常的检测技术,但网络流量的结构非常复杂,当策略很多的时候,很难检测得很准确,就会产生大量的误报,这类产品最大的挑战就是如何减少误报,提高报警的准确性。

六、开源产品

经典的开源产品包括Snort,Suricata,Bro。

6.1 Snort

Snort是一个免费的开源网络入侵检测系统。它是由Martin Roesch于1998年创建的。使用Snort的主要优点是能够在网络上执行实时流量分析和数据包记录。凭借协议分析、内容搜索和各种预处理器的功能,Snort被广泛接受为检测各种蠕虫、攻击、端口扫描和其他恶意威胁的工具。它可以配置三种主要模式-嗅探器,数据包记录器和网络入侵检测。在嗅探器模式下,程序将只读取数据包并在控制台上显示信息。在数据包记录器模式下,数据包将被记录在磁盘上。在入侵检测模式下,程序将监控实时流量并将其与用户定义的规则进行比较。Snort可以检测到诸如缓冲区溢出,隐形端口扫描,CGI攻击,SMB探测,操作系统指纹尝试等各种攻击。它灵活支持许多硬件平台和操作系统,如Linux、OpenBSD、FreeBSD、Solaris、HP-UX、MacOS、Windows等。

6.2 Suricata

Suricata是开源信息安全基金会(Open Information Security Foundation)开发的一个开源、快速、高度稳定的网络入侵检测系统。Suricata引擎能够实时入侵检测,内联入侵防御和网络安全监控。Suricata由几个模块组成,如捕捉、采集、解码、检测和输出。它捕获在解码之前在一个流中传递的流量,这是非常优化的。但是与Snort不同的是,它在捕获并指定流程如何在处理器之间分离之后配置单独的流程。Suricata的规则兼容Snort的规则。

6.3 Bro

Bro在2018年底更名为Zeek,有时也被称为bro-ids或现在的Zeek-ids,与Snort和Suricata 略有不同。在某种程度上,Bro既是签名又是基于异常的id。它的分析引擎将捕获的流量转换为一系列事件。一个事件可以是一个用户登录到FTP,一个网站的连接或几乎任何东西。系统的强大之处在于事件引擎和策略脚本解释器。这个策略引擎有自己的语言(Bro-Script),它可以执行一些非常强大和通用的任务。

Zeek的脚本语言是事件驱动的,Zeek中的脚本编写取决于Zeek在处理网络流量时生成的事件,通过这些事件更改数据结构的状态以及对所提供信息进行决策。Zeek的核心作用是将事件放入有序的“事件队列”中,从而使事件处理程序可以按照“先到先得”的方式处理事件。实际上,这是Zeek的核心功能,因为如果没有编写脚本来对事件执行离散操作,则几乎没有可用的输出。对事件队列、生成的事件以及事件处理程序处理这些事件的方式的基本了解不仅是学习Zeek编写脚本的基础,而且还是了解Zeek本身的基础。

它包含一组日志文件,用于记录网络活动,如HTTP会话,包括URI,密钥标头,MIME类型,服务器响应,DNS请求,SSL证书,SMTP会话等。此外,它提供了复杂的功能,用于分析和检测威胁,从HTTP会话中提取文件,复杂的恶意软件检测,软件漏洞,SSH暴力攻击和验证SSL证书链。

七、规则分析

7.1 Suricata

IPS/IDS最核心的是分析引擎的效率和分析规则的灵活性,Suricata规则分析是在Snort基础上发展起来的,兼容Snort的规则,下面对Suricata进行简单的分析。

Suricata规则包括以下三部分:

  • action决定当规则匹配的时候会发生什么。

  • header:定义了协议,IP地址,端口和规则的位置等包头信息。

  • rule options:定义规则的细节。

例如这条规则将提取HTTP流量中的后缀为txt的文件,并进行告警

alert http any any → any any (msg:"File txt save";fileext:"txt";filestore;sid:2;rev:1;) 

action-header---------------- rule options----------------------------------------

7.2 Action

Action包括

  • Pass:如果匹配到规则,Suricata停止扫描数据包并且跳过当前规则。

  • Drop:如果程序匹配到了这类规则,这个数据包被阻断将不会被发送到目标。

  • Reject:不同于 Drop 直接丢弃数据包,Reject 在匹配到规则时会主动进行拒绝数据包。当数据包为TCP时,会返回一个 RST 数据包重置连接。

  • Alert:当匹配到规则时,Suricata 不会对数据包进行任何操作,会像对正常数据包一样进行放行,除了会记录一条只有管理员能够看到的警报。

以上四种操作也是有优先级的,默认的优先级为:Pass > Drop > Reject > Alert。也就是规则在匹配时会优先考虑包含 Pass 的规则,其次才是 Drop,再然后是 Reject,最后再考虑包含 Alert 的规则。

7.3 Header

头部中包含如下几项:

  • 协议(Protocol):这个字段用来告诉 Suricata 当前规则所包含的协议。其取值可以为:tcp,udp,icmp,ip,http,ftp,tls(包含ssl),smb,dns等等。

  • 源/目的地址(Source and destination):源/目的地址可以设置为 IP 地址或者在配置文件(Suricata.yaml)里定义的变量。

  • 端口号(Ports):不同的协议使用不同的端口号,例如 HTTP 使用 80 端口,而 HTTPS则使用 443。通常情况下端口号会设置为 any,这样会影响所有的协议。

  • 流向(Direction)流向告诉规则匹配哪些流量数据,是匹配从外部网络进来的,还是匹配从内部网络出去的,亦或者两种同时匹配。其中,每条规则都必须有一个向右的箭头如示:→

7.4 Rule options

规则的每一条都遵循固定的格式:name: settings;

每条规则也包含如下设置:

  • 元信息(meta-information)包括:msg (message),Sid (signature id),Rev(Revision),Gid (group id),Classtype,Reference,Priority,metadata信息。

  • 头部(Header-Keyword)包括:ttl,ipopts,sameip,ip_proto,id,geoip,TCP关键字,ICMP关键字等等

  • 有效载荷(payloads)包括:content,pcre,nocase,depth,offset,distance,within,isdataat,dsize等。

  • 流信息关键字包括:flow, stream_size信息。

  • 文件关键字:filename,fileext,filemagic,filestore,filesize等。

  • 阈值

具体的规则内容比较复杂,详见官方手册。从中可以看出每条规则的编写都是非常复杂的,而且还包括很多流量协议底层相关的知识。

7.5 Bro

bro/zeek提供了自己的一个专门的语言来分析入侵行为叫Bro-Scrip。扩展名为.zeek,默认 目录:share/zeek中。

语言一般包括类库,常量,变量,关键字,运算符,函数,命名空间等。比如:为http协议签名样例:


signature dpd_http_client {
 ip-proto == tcp
payload /^ (GET|HEAD|POST) / 
tcp-state originator
}

signature dpd_http_server { 
ip-proto == tcp
payload /^HTTP/[0-9]/ 
tcp-state responder
requires-reverse-signature dpd_http_client 
enable "http"
}

具体详细的语法参见官方手册https://docs.zeek.org/en/current/script-  reference/index.html

总结

本文简单介绍了IPS/IDS的核心技术部分,从中可以看出要想研发一款有竞争力的产品是非常难的,里面牵扯到非常多的技术点,小到一个按钮的设计,大到框架技术的选择,产品性能稳定性可用性等方方面面。但了解的产品的基本原理对产品的选型,理解,使用等都有帮助。


相关分享:

软件定义安全

安全产品的核心逻辑-防火墙

猜你喜欢

转载自blog.csdn.net/ducc20180301/article/details/119383876