Snort一款开源的网络入侵防御系统(IPS),可以实时分析和记录网络数据包。由Cisco在2013年将其收购,收购后对其源代码进行了重写,发布了Snort3或称Snort++版,带来很多新的特性。Cisco于2014年发布了OpenAppID,作为一个Snort中用于应用识别的组件。根据官方教程,对Snort3源码进行编译较为繁琐,本文介绍使用Docker快速运行Snort3和OpenAppID的方法。

获取镜像

可通过如下命令下载Snort3 with OpenAppID的容器镜像:

$ docker pull traceflight/snort3-with-openappid-docker

其中的镜像为根据我的Github项目中编写的Dockerfile文件构造而来,其中的组件和版本见下表。

组件 版本
snort 3.0.0
daq 2.2.2
snort extra 1.0.0
openappid 8373
rules community

监听主机网卡

首先获取待监听网卡名称:

$ ip a

使用docker的host模式监听指定网卡(假设为eth0),挂载本地路径(/var/log/snort)存放日志信息:

$ docker run -it --name snort --net=host \
    --cap-add=NET_ADMIN \
    -v /var/log/snort/:/var/log/snort/ \
    traceflight/snort3-with-openappid-docker \
    snort -c /usr/local/etc/snort/snort.lua \
    -A fast \
    -l /var/log/snort \
    -i eth0

分析Pcap数据

假设待分析的数据位于本机的/home/snort/data/文件夹中,运行snort挂载待分析文件,并对其进行分析。

$ docker run -it --rm -v /home/snort/data:/data \     
    -v /var/log/snort/:/var/log/snort/ \
    traceflight/snort3-with-openappid-docker \
    snort -c /usr/local/etc/snort/snort.lua \
    -A fast \ 
    -l /var/log/snort \
    -r /data/pcapfile.pcap

修改配置和规则

对规则和配置进行修改,需要挂载相应文件到镜像中,规则和配置文件的结构可参考我的Github项目。首先clone项目代码,获取文件夹结构,并在此基础上进行后续修改。

$ git clone https://github.com/traceflight/snort3-with-openappid-docker.git

自定义应用检测器

将自定义检测脚本放置在custom/lua文件夹中,然后重新build容器或挂载custom文件夹到/usr/local/etc/snort/appid/文件夹中。

使用自定义规则

配置文件和规则文件分别放置在项目中etc和rules文件夹内,添加自定义规则步骤如下:

  • 创建规则

在rules/rules文件夹内创建规则文件local.rules。

  • 修改配置

在etc/snort.lua配置文件中第6个部分(6. configure detection)中的rules变量内添加一行规则包含语句。

include $RULE_PATH/local.rules
  • 挂载文件

运行时挂载

$ docker run -it -v `pwd`/etc/snort.lua:/usr/local/etc/snort/snort.lua \
    -v `pwd`/rules/:/usr/local/etc/snort/rules/ \
    traceflight/snort3-with-openappid-docker /bin/bash

或创建Dockerfile生成新的镜像

FROM traceflight/snort3-with-openappid-docker:latest
MAINTAINER yourname
ADD etc/snort.lua /usr/local/etc/snort/
ADD rules /usr/local/etc/snort/rules
RUN snort -V

使用snort注册版规则

在snort官方注册后,可下载注册版规则。将规则文件解压缩后,放在本项目对应文件夹中,然后修改etc/snort.lua文件中的appid变量值,指定appid路径。最后将文件夹挂载到路径下即可。

appid =
{
    -- appid requires this to use appids in rules
    app_detector_dir = '/usr/local/snort/appid',
}

使用中可能出现错误提示

ERROR: Cannot decode data link type 113

原因:libpcap在对Linux进行抓包时,若对any接口进行抓包,使用的格式为Linux cooked-mode capture (SLL),snort不支持该格式。

解决方法:不对any接口进行抓包,对指定接口如eth0抓包即可。

SIOETHTOOL(ETHTOOL_GUFO) ioctl failed: Operation not permitted

原因:容器对监听本地网卡的权限不足。

解决方法:在docker运行时,添加参数`--cap-add=NET_ADMIN`。