概述
在《软件定义安全》中介绍了,所有的安全产品本质上就是对安全业务的软件开发,在《安全产品的核心逻辑-防火墙》中介绍了防火墙的核心点和核心逻辑。本文介绍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套接字绑定到某网卡上,当数据包到达网卡时,将其放入环形缓冲区,若缓冲区已满,则丢弃该数据包。当有新的数据包到达时,直接覆盖掉已经被用户空间读取过的数据包空间。
网卡接收到新的数据包后,直接写入环形缓冲区,以便应用程序直接读,若应用程序需要向外发送数据包,也可以直接将数据包写入环形