使用Suricata进行IDS/IPS

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
2
3
4
git clone https://github.com/ironbee/libhtp.git
./autogen.sh
./configure
make install

如果怕弄脏系统可以在./configure时加上--prefix=$HOME/.local,INCLUDE文件会在~/.local/include/下。我现在的想法是装到ldconfig -v列出来的目录里比较好,免去CFLAGS-I$HOME/.local/includeLDLIBS-l$HOME/.local/lib64的麻烦。

我是Gentoo用户就写了个简易的.ebuild装到/usr/下了。另外可以考虑用stowxstow来管理这些源码安装的包。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
2
3
4
5
git clone git://phalanx.openinfosecfoundation.org/oisf.git
cd oisf
./autogen.sh
/configure --prefix=$HOME/.local --enable-nfqueue --enable-geoip --enable-non-bundled-htp
make install-full

如果没有--enable-nfqueue的话,就无法使用IPS功能(相当于Snort的inline模式),开启这项功能需要用到这两个包libnetfilter_queuelibnfnetlink。一些二进制发行版注意需要安装相应的-dev开发包。

--enable-non-bundled-htp使用已经装好的libhtpmake install-full会安装一些配置文件和rules。

霜刃初试

IDS模式

如果之前执行过make install-confmake 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
2
3
4
5
6
7
8
9
10
11
12
13
default-log-dir: /tmp/suricata/
rule-files:
- /tmp/a.rules
outputs:
- fast:
enabled: yes
filename: fast.log
append: yes
- unified2-alert:
enabled: yes
filename: unified2.alert

执行:

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模式。不过还需要设置一下iptablesNFQUEUE,让Suricata能访问到相应的数据包,最简单的方法是:

1
2
sudo iptables -I INPUT -p tcp -j NFQUEUE
sudo iptables -I OUTPUT -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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
config reference_file: /home/ray/.local/etc/suricata/reference.config
config classification_file: /home/ray/.local/etc/suricata/classification.config
config gen_file: /home/ray/.local/etc/suricata/rules/gen-msg.map
config sid_file: /home/ray/.local/etc/suricata/rules/sid-msg.map
config interface: eth0
config set_gid: 1000
config set_uid: 1000
config waldo_file: /tmp/suricata/suricata.waldo
input unified2
output alert_fast

开头几行reference_filesid_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
2
3
Opened spool file '/tmp/suricata/unified2.alert.1374809319'
Closing spool file '/tmp/suricata/unified2.alert.1374809319'. Read 0 records
Waiting for new data

最后一句”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
2
u2boat unified2.alert.1374814463 a.pcap
wireshark a.pcap