基于Snort 和OpenWrt 的网络入侵检测与防御系统
2019-03-04高亮郑荣锋
高亮,郑荣锋
(四川大学网络空间安全学院,成都610065)
0 引言
随着信息化水平的不断提升,电子信息成为了信息的主要存储介质。金融、社交、文化、生产力的信息化发展,在网络上存放的个人数据和企业数据甚至是政府职能部门的数据也越来越多,而信息存放的安全和设备的安全成为了信息储存首要考虑的问题。
本文主要研究网络入侵检测和反制技术,利用OpenWrt 平台的和编程特性和Snort 的入侵报文检测系统,结合网络入侵手段和其反制方法,设计了一个入侵检测和反制系统,最后以OpenWrt 平台和Python 编程语言实现该系统。
1 网络入侵特征
1.1 漏洞入侵的网络特征
计算机漏洞的产生方式主要有两种:第一种是相关编程人员或者网络协议标准制定小组出现纰漏,设计的程序、协议中出现了明显的逻辑漏洞,这些漏洞一旦被利用起来,可以达成绕过系统验证、强行插入修改删除数据、造成系统崩溃而拒绝服务等效果。第二种漏洞属于编程内部的漏洞,这种漏洞表现的最为明显的就是堆栈溢出攻击,利用了冯·洛伊曼计算机结构的特点,数据程序一起存储,而且在一定条件下可以进行相互转换。该种类型的入侵往往可以造成目标计算机系统决绝服务,甚至是夺取目标计算机系统控制权,并于目标计算机上安装持续化控制后门[7-8]。
1.2 计算机病毒作为后门的网络特征
计算机病毒作为后门安装时,存在的行为如下:
(1)收集目标系统的信息。对于服务器而言,主要收集日志,服务器登录账户密码,服务器上部署的主要系统配置,数据库内容,管理员操作记录等信息。对于普通用户而言,主要收集文档、图片、视频、以及各种对计算机输入的文本信息[6]。
(2)加深对系统的控制和持久化控制。病毒往往会将自身替换为正常的系统程序或者用户程序,以达到伪装,并将自己加入开机项,保证在重启后仍然可以对系统进行控制。
(3)Shell 后门。病毒制作者为了进行快捷的病毒升级、扩展、并访问受害者的机器,往往会在后门中加入直接可以操作的Shell 接口,可以提供远程的命令访问[1]。
对于计算机病毒的后门特征而言,第一点和第三点可以作为网络特征而进行检测,而第一点实现较为复杂,且需要大量时间进行信息收集所需要守护的系统中存在的内容特征。所以本设计选择以第三点作为网络特征的检测的主要出发点,检测成功率会比较大[9-11]。
2 Snort和OpenWrt平台
2.1 Snort的基本架构和原理
Snort 是由Martin Roesch 在1998 年用C 语言开发的入侵检测系统,并且Snort 代码开源,属于开源项目。Snort 经常被用于部署在各种网络中的关键位置,其基本架构如图1 所示。
图1 Snort基本框架
图1 中指出,Snort 的体系结构由四个基本部分组成:
嗅探器:网络嗅探器将网卡设置为监听模式,使得Snort 可以监听所有到达该网卡的网络流量。
●预处理器:预处理器接收嗅探器传入的数据包,并分析数据包中的网络层次和数据内容,再交由相关的插件处理,这些插件是针对数据包中的网络层次和特征行为的。一旦数据包具有“特征行为”,那么该数据包将被发送到检测引擎。
●检测引擎。检测引擎是Snort 中基于特征的入侵检测系统的主体。检测引擎接收来自预处理器的数据,这些数据会通过配置规则中的配置所进行检测。检测的方法是先读入配置规则,再解析内容中的字符串和偏移信息,最后对内容字符串进行正则匹配。如果正则表达式匹配返回成功,则表明规则与数据包中的内容匹配,产生一个警报事件。
●输出插件。网络流量数据如果与引擎内的某规则相匹配则触发警报。警报将通过网络连接、UNIX 套接字、E-mail、MySQL 数据库写入等方式发出,并记录日志,这些通讯接口即为Snort 系统本身与外部系统进行通讯的主要接口,通过对Snort 输出进行检测和编程,即可进行防御操作。
2.2 OpenWrt平台特征与编程特性
OpenWrt 在产生之初是作为一个嵌入式的Linux发行版而出现的,提供了一个完全可写的文件系统,并且也具有分支软件仓库和管理工具opkg,OpenWrt 仓库中包含了大量的常用软件,这使得在OpenWrt 上进行系统部署更加高效。
OpenWrt 基于Linux 内核,所以其内部的网络转发由iptables 防火墙和router 路由表项完成。netfilter/iptables 进行源地址伪装、目的地址修改等数据转发的最大优点是它可以配置有动态的、有状态的防火墙,这是许多其他防火墙所不能提供的。在这种防火墙系统下,能够记住发送或接收信息包所建立的连接的状态,并给上级内核组件进行通讯[2]。
对于netfilter/iptables 的内部系统而言,其内置表有raw、mangle、nat、filter 四张,如图2 所示[3]。内置规则链有PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD 五条规则链[4]。规则链是主要的处理数据包流向和执行DNAT、SNAT、过滤的规则,所有经过路由的流量都需要进行规则判断,并进行一定的规则操作,使得网络通讯能够正常、高效地完成。
图2 iptables的四个表
而数据包进入系统后,iptables 防火墙对数据包转发的主要流程如图3 所示,通过该机制与router 路由条例所配合,可以将数据包发送到对应的网络接口[5]。
图3 数据包在Linux内部的传递过程
3 系统实现
首先使用VMware 搭建系统实现所需的网络环境,再部署OpenWrt 系统与网络环境进行联通,于Open-Wrt 上配置Python 与Snort 的运行环境与检测规则,搭建Windows XP 客户端虚拟机和病毒特征库Ubuntu 远程数据库系统。最后通过Python 在OpenWrt 上进行编程,解析Snort 的报警文件日志作为主要的消息源,检测到消息源中产生了报警后,调用邮件客户端进行邮件预警,并调动iptables 防火墙进行主动防御。
3.1 网络环境的搭建
整个实验环境由VMware 虚拟机进行部署,大致的网络构思如图4 和图5 所示,其中图4 主要作为正常用户网络模拟,图5 作为模拟各入侵防御系统连入VPN 进而使用病毒特征库的内部网络。
图4 实验中的网络架构
图5 仿VPN的虚拟网络架构
首先在VMware 中设置两个虚拟网络,打开VMware 的虚拟网络编辑器,设置5 个虚拟网络,并分别进行网络设置。其设置罗列如下:
VMnet0,用于接入整个实验系统的外部Internet,为实验系统提供SMTP 邮件发送的网络接口和通过opkg 从源部署Python3、Python 数据库、邮件服务接口模块、Snort 系统等。该网络设置为NAT 模式,通过宿主机进行SNAT 接入外部网络。
VMnet1,作为接入Router1 与Router2 之间的虚拟网络,以模拟两个网络互访的情况。该网络设置为仅主机模式,并取消勾选将主机适配器连接到该虚拟网络。
VMnet2,作为Router2 给其内部局域网通讯的虚拟网络,以实现基本的DHCP-client 到路由的通讯功能。该网络设置为仅主机模式,并取消勾选将主机适配器连接到该虚拟网络。
VMnet3,作为Router1 给其内部局域网通讯的虚拟网络,以实现基本的DHCP-client 到路由的通讯功能。该网络设置为仅主机模式,并取消勾选将主机适配器连接到该虚拟网络。
VMnet4,作为Router1-1 给其内部局域网通讯的虚拟网络,以实现一个第三层交换机基本的通讯链路。
VMnet5,提供网络入侵防御系统一个内部通讯局域网,可以快速的进行调试和给网络入侵防御系统互相通讯与访问病毒特征流量数据库一个安全的链路。
3.2 数据库的设计与实现
在整个系统中具有两种数据库,一个是本地数据库,使用Python 自带的SQLite 数据库作为实现系统,另一个是搭建在Ubuntu 上的网络MySQL 数据库,该数据库上设定了root 用户的网络权限和MySQL 的网络访问配置,而且在Linux 防火墙上放行了MySQL 的网络接口,这样的设计可以让系统更具有灵活性。
储存系统信息的有Filter_IP 表、Filter_MAC 表、Warning 表。对于远程病毒数据库而言,储存系统信息的有IDS_Rule 表和Virus_Data 表。
Filter_IP 表如表1 所示,用来储存被过滤的IP 地址列表,该表中存放的信息有:IP 地址、被加入该表的原因(INFO)、事件的编号UID。
表1 Filter_IP 表
Filter_MAC 表如表2 所示,用来储存被过滤的MAC 地址列表,该表中存放的信息有:MAC 地址、被加入该表的原因(INFO)、事件的编号UID。
表2 Filter_MAC 表
Warning 表如表3 所示,该表中存放的信息有:入侵者的IP 地址,入侵IP 的源端口、入侵事件中被害者的IP 地址,入侵事件中被害者IP 的源端口、入侵事件的时间、事件的编号UID、病毒编号SID、触发事件额外信息INFO。
表3 Warning 表
Virus_Data 表如表4 所示,用来储存病毒的信息,该表中存放的信息有:病毒的编号UID、病毒的名称Name、病毒的版本Ver、病毒的危害等级Level、病毒的额外说明信息INFO。
表4 Virus_Data 表
IDS_Rule 表如5 所示,用来存储IDS 规则信息,在该表中存放的信息有:IDS 额外规则、IDS 额外规则编号。
表5 IDS_Rule 表
3.3 邮件预警客户端POP3/SMTP算法与微信Server酱通知
邮件客户端是通过Python 的SMTP 库实现的,使用163 的邮箱账户作为系统的邮件发送者账号,使用QQ 邮箱作为管理员邮箱,并进行消息推送。
SMTP/POP3 邮件客户端的核心代码如下:
email_client=smtplib.SMTP("smtp.163.com")
email_client.login(from_account,from_passwd)
msg=MIMEText(content,'plain','utf-8')
msg['Subject']=Header(subject,'utf-8')
msg['From']=from_account
msg['To']=to_account
email_client.sendmail(from_account, to_account, msg.as_string())
email_client.quit()
其中content 是消息内容,subject 键值是邮件的标题,From 是邮件中发信人的账户名称,To 是邮件中接收人的账户名称。通过设置邮件消息编码、邮件服务器通讯地址、邮件内容,最后调用发送邮件函数和退出发信函数,即可完成邮件的发送。
Server 酱的API 接口代码如下:
url='https://sc.ftqq.com/
SCU46567T452503e152853ef807fa65ebe08ce1eb5c8dbac14d2f
d.send'
data['text']='IDS Warning From%s'%Router_name
data['desp']=Message
req=requests.post(url,data=data)
其中,url 是Server 酱的API 通讯地址,data 作为HTTP 请求中POST 方法的传递参数进行数据传输,包含了微信消息的标题和内容,requests.post 向指定URL发送带POST 参数的数据,使用Server 酱的微信通讯API 进行微信推送,所以管理员也能很快得知网络内发生的安全事件。
4 实验与结果分析
运行虚拟机,开启OpenWrt 路由系统和Windows XP 操作系统,如图6、图7 所示,并开启OpenWrt 中的Python 程序和Snort 系统,并确认网络通路正常和系统正常运行,记录其IP 地址。
图6 开启虚拟环境
图7 测试通讯程序
在xshell 中连入OpenWrt 路由器,并输入指令
snort-c"snort.conf"-i"eth0"--daq-dir/usr/lib/daq-l./
和指令python3 main_program.py 来执行程序
命令结果如图8 所示。
图8 Snort运行图
分别在两台系统上执行测试程序,代码和运行截图如图9、图10 所示。
图9 通讯程序运行截图
可以看到通讯程序已经可以成功连接了服务器,收到了来自服务器端的消息提示,这表明各虚拟网络之间可以相互通信,网络路由协议配置无误,可以开始进行下一步操作。
图10 服务端通讯程序响应图
在OpenWrt 路由器的IPS 防御系统中,也出现了警报数据,并输出了病毒ID 为10000001,警告信息warning report,警告时间,还有源和目的IP 信息,以及流量中的报文特征,如图11 所示。
图11 Python代码输出获取到Snort的输出日志
防御系统也已经对其进行了网络封锁,使得三层通讯中断,数据会在经过路由时被丢弃,无法继续进行网络通讯,如图12 所示。微信客户端收到了通知信息,如图13 所示。
5 结语
本文主要针对入侵检测与入侵防御进行研究,在研究了相关技术之后使用开源的Snort 入侵检测系统作为整个系统的检测引擎,配合开源的OpenWrt 路由系统作为整个入侵防御系统的基本运行平台,实现了一个安全的网络系统,并且通过实验证明该系统的有效性。
图12 连接被截断图
图13 邮件通知图