Suricata基础

问你何时曾看见,这世界为人们而改变。

Suricata简介

Suricata是一款开源高性能的入侵检测系统,并支持IPS(入侵防御)与NSM(网络安全监控)模式,用来替代原有的Snort入侵检测系统,完全兼容Snort规则语法和支持Lua脚本。

Suricata 部署

安装与编译

参考地址: https://redmine.openinfosecfoundation.org/projects/suricata/wiki/Suricata_Installation

安装环境: 本项目测试环境为Ubuntu 17.04 Zesty,其他OS请参考上述网址中的安装说明。

说明:首次安装时推荐使用方式一自动编译,改动源码或自己下载指定版本时必须使用方式二进行手动编译。

  • 安装方式一(自动编译): Personal Package Archives(PPA):
1
2
3
4
5
6
# 下载最新稳定版本的suricata
sudo add-apt-repository ppa:oisf/suricata-stable
# 更新apt-get
sudo apt-get update
# 安装suricata,安装完成后日志文件的默认路径为/var/log/suricata,配置文件的默认路径为/etc/suricata
sudo apt-get install suricata
  • 安装方式二(手动编译):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 预装suricata需要的外部依赖库
sudo apt-get -y install libpcre3 libpcre3-dbg libpcre3-dev \
build-essential autoconf automake libtool libpcap-dev libnet1-dev \
libyaml-0-2 libyaml-dev zlib1g zlib1g-dev libcap-ng-dev libcap-ng0 \
make libmagic-dev libjansson-dev libjansson4 pkg-config

# 如果需要suricata除了用作IDS模式外,也可激活IPS模式,请继续安装
sudo apt-get -y install libnetfilter-queue-dev libnetfilter-queue1 libnfnetlink-dev libnfnetlink0

# 下载suricata,这里使用的版本是4.0.0(latest stable)
VER=4.0.0
wget "http://www.openinfosecfoundation.org/download/suricata-$VER.tar.gz"
tar -xvzf "suricata-$VER.tar.gz"
cd "suricata-$VER"

# 编译
./configure ‐‐enable‐luajit ‐‐enable‐geoip ‐‐prefix=/usr/ ‐‐sysconfdir=/etc/ ‐‐localstatedir=/var/
sudo make clean
sudo make
sudo make install

配置

参考地址: http://suricata.readthedocs.io/en/latest/configuration/suricata-yaml.html#suricata-yaml

配置文件: 默认路径: /etc/suricata/suricata.yaml

注意:此部分仅对每个配置模块做简介,还有很多详细配置没有列出,具体请参考配置文件中的注释说明

  • 网络配置:
1
2
3
4
5
# Step 1: inform Suricata about your network

# more specifc is better for alert accuracy and performance
address-groups: #用于设置检测的网段
port-groups: #用于设置检测的端口
  • 规则配置:
1
2
3
4
5
6
7
8
9
# Step 2: select the rules to enable or disable

# 默认规则文件路径
default-rule-path: /etc/suricata/rules
# 该配置选项下包含了多个规则文件,增加规则文件则必须在此处配置
rule-files:
# 默认配置路径
classification-file: /etc/suricata/classification.config
reference-config-file: /etc/suricata/reference.config
  • 输出配置:

请注意:其中outputs中的子配置项eve-log为关键配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# Step 3: select outputs to enable

# 默认日志生成目录
default-log-dir: /var/log/suricata/

# 是否开启引擎状态记录
stats:

# 日志输出设置,该选项下包含多种输出格式
outputs:
#日志保存至fast.log文件仅记录简单信息
- fast:
#日志保存至eve.json文件使用json格式保存日志数据,本项目中使用的关键配置
- eve-log:
#该模式下可通过types设置记录日志类型:
types:
#告警日志,关键配置
- alert:
#本项目暂时不启用payload以及相关配置
#payload: yes # 在Base64中启用转储有效载荷
#payload-buffer-size: 4mb # max size of payload buffer to output in eve-log
#payload-printable: yes # 在eve-log中输出的有效负载缓冲区的最大大小
#packet: yes # 启用转储数据包(无流段)

#http相关配置
http-body: yes # 允许在Base64中转储http-body报文
http-body-printable: no # 允许以可打印格式转储http-body报文,不开启是因为在logstash里再做转码处理
#metadata: yes # 添加L7/applayer字段,flowbit和其他vars到警报输出
http: yes # 包含在metadata中的子项,本项目暂时只需要http中的data,也可开启metadata关闭此项


# 启用使用“tag”关键字的规则记录标记的数据包。
tagged-packets: yes

#暂不启用,通过添加额外的字段或覆盖他的源或目标IP地址(取决于流向)。
xff:
enabled: no
header: X-Forwarded-For

#http-extended日志
- http:
extended: yes
#可以自定义额外的http信息,本项目无需再添加(已经自动捕获http-headers)
#custom: [Accept-Encoding, Accept-Language, Authorization]
- dns: #dns日志
- tls: #tls日志
- files: #文件日志
- smtp: #smtp日志
- ssh: #ssh日志
- stats: #引擎状态日志

# 二进制日志文件格式
- unified2-alert:

# pcap 网络数据包文件格式
- pcap-log:

# 记录suricata工作日志,例如startup messages, errors,etc
logging:
  • 常用捕获设置
1
2
3
4
5
6
7
8
# Step 4: configure common capture settings

# Linux高速捕获支持
af-packet:
# 跨平台libpcap捕获支持
pcap:
# 读取pcap文件的设置
pcap-file:
  • 应用层协议设置
1
2
3
4
5
6
# Step 5: App Layer Protocol Configuration

# 配置应用层解析器
app-layer:
# 限制要解码的asn1帧的最大数量(默认256)
asn1-max-frames:
  • 高级设置

高级配置项主要有如下七大类,详细设置请参考配置文件里的注释说明

1
2
3
4
5
6
7
8
9
## Advanced settings below ##

## Run Options
## Detection settings
## Advanced Traffic Tracking and Reconstruction Settings
## Performance tuning and profiling
## Netfilter integration
## Advanced Capture Options
## Hardware accelaration

1.3 规则编写

参考地址: http://suricata.readthedocs.io/en/latest/rules/index.html

规则目录: /etc/suricata/rules

  • 编写本地规则文件
1
2
3
# 进入规则文件路径并且创建本地规则
cd /etc/suricata/rules
sudo nano local.rules
1
2
3
# 在文件内写入规则
alert http any any -> any any (msg:"cTs data"; content:"userlogin"; flowbits:set, user; flowbits:noalert; sid:1;)
alert http any any -> any any (msg:"sTc data"; file_data; content:"html"; flowbits:isset, user; sid:2;)

flowbits规则说明: 通过flowset实现标记记录双向流量包。

1
2
3
4
5
6
7
8
9
alert: action
http: protocol
any any -> any any: source_ip port -> dest_ip port
msg: message
content: 检测包中是否含有content字段的值(此例中为userlogin),如果有则触发警报
flowbits:set, user;如果payload含有content字段值,标记这个flow为user;
flowbits:noalert;:此条不触发警报
flowbits:isset, user: 检测之前的包是否有记录flow:user.
file_data: 解决gzip问题,在此字段之后所有用到content的地方,检测的都是有效信息(gzip解码之后的信息)。
  • 在配置中添加文件

每添加一个新的规则文件,都需要在配置中设置。

1
2
3
4
rule-files:
- suricata.rules
- local.rules
#- more rules...
  • 指定配置运行
1
sudo suricata -c /etc/suricata/suricata.yaml -i eth0

1.4 启动引擎

参考地址: http://suricata.readthedocs.io/en/latest/command-line-options.html

所有cmd line指令请参考以上地址,在此仅罗列常用命令

使用预录制的pcap:

1
sudo suricata -r filepath.pcap

使用网卡real-time:

1
sudo suricata -i eth0

使用指定配置文件:

1
sudo suricata -c /etc/suricata/suricata.yaml -i eth0

1.5 输出日志

参考地址: http://suricata.readthedocs.io/en/latest/output/index.html

输出目录: /var/log/suricata

ex: 一条alert警报在eve.json的输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
{
"timestamp": "2017-09-07T18:07:49.083281+0800",
"flow_id": 2057888926574163,
"pcap_cnt": 70,
"event_type": "alert",
"src_ip": "192.168.100.12",
"src_port": 80,
"dest_ip": "192.168.20.136",
"dest_port": 53931,
"proto": "TCP",
"tx_id": 0,
"alert": {
"action": "allowed",
"gid": 1,
"signature_id": 2,
"rev": 0,
"signature": "sTc data",
"category": "",
"severity": 3
},
"http": {
"http_request_headers": {
"Host": "xxx.com",
"Accept": "xxx",
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "zh-cn",
"Content-Type": "application/x-www-form-urlencoded",
"Origin": "xxx",
"User-Agent": "Mozilla/5.0",
"Connection": "keep-alive",
"Upgrade-Insecure-Requests": "1",
"Referer": "xxx/sign_in",
"Content-Length": "215",
"Cookie": "xxx"
},
"http_response_headers": {
"Server": "nginx",
"Date": "Thu, 07 Sep 2017 10:07:48 GMT",
"Content-Type": "text/html; charset=utf-8",
"Transfer-Encoding": "chunked",
"Connection": "keep-alive",
"Cache-Control": "max-age=0, private, must-revalidate",
"Etag": "xxx",
"X-Content-Type-Options": "nosniff",
"X-Frame-Options": "DENY",
"X-Request-Id": "xxx",
"X-Runtime": "0.119753",
"X-Ua-Compatible": "IE=edge",
"X-Xss-Protection": "1; mode=block",
"Strict-Transport-Security": "xxx",
"Content-Encoding": "gzip"
},
"hostname": "xxx.com",
"url": "/users/sign_in",
"http_user_agent": "Mozilla/5.0 xxx",
"http_content_type": "text/html",
"http_refer": "xxx/users/sign_in",
"http_method": "POST",
"protocol": "HTTP/1.1",
"status": 200,
"length": 3652,
"http_request_body": "xxx",
"http_response_body": "xxx"
},
"app_proto": "http"
}

Suricata 架构简图

01