Suricata
Intrusion detection System(IDS)监控网络或系统,寻找各类违反安全方针的行为。Suricata是Open Information Security Foundation和其他相关支持协会从2009年开始开发的一套用于网路入侵检测(IDS)、入侵防护(IPS)及网络监控的系统。这方面最著名的产品是Sourcefire的Snort。那么为什么要选择Suricata呢?我在这方面的知识还几近空白,无法在架构之类的方面作出判断,想的到的用Suricata的理由只有这三点:
- 支持多线程,而Snort没有。
- 配置文件是YAML的,而Snort的是基于行的一种比较简单的格式。
- Suricata也使用Snort的规则。
Suricata的文档在起步阶段,目前有一个wiki。看到Redmine又感慨万分,此中有真意,欲辩已忘言。诗中的“真意”以前会和“深意”混淆,也确实很应景,闲话还是不说了。好在Suricata规则和Snort一致,看Snort User Manual就好了。
安装
先下载Suricata的依赖libhtp
:
1 | git clone https://github.com/ironbee/libhtp.git |
如果怕弄脏系统可以在./configure
时加上--prefix=$HOME/.local
,INCLUDE文件会在~/.local/include/
下。我现在的想法是装到ldconfig -v
列出来的目录里比较好,免去CFLAGS
里-I$HOME/.local/include
,LDLIBS
里-l$HOME/.local/lib64
的麻烦。
我是Gentoo用户就写了个简易的.ebuild
装到/usr/
下了。另外可以考虑用stow
或xstow
来管理这些源码安装的包。stow
是Perl脚本,没记错的话是Perl 4
时代的产物了,修修补补似乎能支持Perl 5
了,但是用Perl
新版本运行似乎会有warning。xstow
是C写的,看上去跟牢靠一些。以后有空还想尝试Nix和基于Nix的GNU
Guix。
1 | Nix packages are configured using a lazy, pure-functional language especially designed for this purpose |
能说出"lazy, pure-functional"就很不简单了,不是吗?
1 | git clone git://phalanx.openinfosecfoundation.org/oisf.git |
如果没有--enable-nfqueue
的话,就无法使用IPS功能(相当于Snort的inline模式),开启这项功能需要用到这两个包libnetfilter_queue
、libnfnetlink
。一些二进制发行版注意需要安装相应的-dev
开发包。
--enable-non-bundled-htp
使用已经装好的libhtp
。make install-full
会安装一些配置文件和rules。
霜刃初试
IDS模式
如果之前执行过make install-conf
或make install-full
,就会有这个文件:$PREFIX/etc/suricata/suricata.yaml
。使用
创建目录/tmp/suricata/
用于存放Suricata的日志。另外新建一个规则文件/tmp/a.rules
:
1 | alert tcp $EXTERNAL_NET any -> $HOME_NET 8888 (msg: "meow"; content: "meow"; ) |
然后修改suricata.yaml
中的这几行:
1 | default-log-dir: /tmp/suricata/ |
执行:
1 | sudo suricata -c ~/.local/etc/suricata/suricata.yaml -i eth0 |
-i
让Suricata以IDS模式运行,抓eth0
网络接口的包进行分析,这个相当于Snort的passive模式。
执行nc -l -p 8888
,在另外一台机器上用nc IP 8888
连接本机,键入meow
并回车。观察/tmp/suricata/
目录,会发现文件fast.log
里多了条记录,这个就是Suricata检测到的可疑数据包(规则文件/tmp/a.rules
定义的)。而目录下还会有个文件名形如unified2.alert.$timestamp
的文件,使用了unified2格式,包含可以数据包的具体信息,可以转化为pcap格式供Wireshark分析。
IPS模式
修改之前的规则文件/tmp/a.rules
:
1 | alert tcp $EXTERNAL_NET any -> $HOME_NET 8888 (msg: "meow"; content: "meow"; replace: "wow "; ) |
和之前的区别是多了replace
用来修改数据包,要求是替换前后的字串长度相同。
1 | sudo suricata -c ~/.local/etc/suricata/suricata.yaml -q 0 |
-q
让Suricata以IPS模式运行,相当于snort
的inline模式。不过还需要设置一下iptables
的NFQUEUE
,让Suricata能访问到相应的数据包,最简单的方法是:
1 | sudo iptables -I INPUT -p tcp -j NFQUEUE |
Suricata退出后别忘了用sudo iptables -F
删除这两条规则,否则就无法使用TCP了。
参见https://redmine.openinfosecfoundation.org/projects/suricata/wiki/Setting_up_IPSinline_for_Linux。
Misc
Rules和Oinkmaster
有了检测系统还不够,我们还需要规则集。根据1的说法,这方面的权威是Snort VRT Rules,但它个价格不菲,不过还在一段时间后就免费提供给公众了。另外Emerging Threats ETPro提供了一些免费的rules。
oinkmaster
可以用来自动化下载、管理这些rules。我用下面的脚本同步:
1 | oinkmaster.pl -C /etc/oinkmaster.conf -o ~/.local/etc/suricata/rules -i |
Barnyard2
Barnyard2是个"open
source interpreter for Snort unified2 binary output
files"。那么什么是spool
呢?Simultaneous peripheral
operations
on-line。这个词不算陌生,看看你的系统里是不是有个叫/var/spool/
的目录?
对于spooler,我的理解是一个给某程序提供了output backend的外部程序。
Suricata配置文件suricata.yaml
中的outputs2 > unified2-alert
可以设定在产生alert时dump出可疑数据包的信息,这个格式的好处是:
- 方便归档管理
- 生成速度快。
Barnyard2
就是个类似Syslog
的东西,从Snort/Suricata处取得unified2格式的输入,产生其他格式的输出,比如给Prelude
Hybrid IDS system、Syslog、MySQL。
Barnyard2的源码包里提供了一份配置文件etc/barnyard2.conf
,我把它复制到了~/.local/etc/suricata/barnyard2.conf
并修改了下面这几行:
1 | config reference_file: /home/ray/.local/etc/suricata/reference.config |
开头几行reference_file
、sid_file
之类的约定的一些状态吗之类的东西,如果之前用make install-full
了,就省去了手动创建这些文件的麻烦。
创建目录/tmp/barnyard2/
放置Barnyard2的输出。执行:
1 | barnyard2 -c ~/.local/etc/suricata/barnyard2.conf -l /tmp/barnyard2 -f unified2.alert -d /tmp/suricata |
Barnyard2会处理/tmp/suricata/
下文件名以unified2.alert
开头的文件,并监控这个目录等候新的unified2格式的alert文件。
Barnyard2处理完文件后会留下这样的信息:
1 | Opened spool file '/tmp/suricata/unified2.alert.1374809319' |
最后一句"Waiting for new data"就是告诉你它已经处理完所有的已有unified2 alert文件,开始监控目录等待新的alert文件了。
第一次运行Barnyard2,因为/tmp/suricata/suricata.waldo
不存在,Barnyard2会输出警告:
1 | WARNING: Unable to open waldo file '/tmp/suricata/suricata.waldo' (No such file or directory) |
但是不影响Barnyard2的使用。waldo_file
文件的作用就是记录Barnyard2已经处理过了哪些文件,Barnyard2会自动创建这个文件。如果把waldo_file
删掉,重启Barnyard2,会发现/tmp/barnyard2/alert
里又多了一份和之前一样的alert。
U2boat
U2boat是Snort附带的工具,用来把unified2格式的文件转换成pcap格式,这样就可以使用Wireshark分析数据包了。
1 | u2boat unified2.alert.1374814463 a.pcap |