1. 介绍
Suricata可以监听unix套接字并接受来自用户的命令。交换协议是基于JSON的,并且消息的格式已经完成。
源代码中提供了一个名为suricatasc的示例脚本,并在安装/更新Suricata时自动安装。
如果libjansson可用,则默认启用unix套接字。
您需要安装libjansson:
libjansson4 - 用于编码,解码和操作JSON数据的C库
libjansson-dev - 用于编码,解码和操作JSON数据(dev)的C库
python-simplejson - 用于Python的简单,快速,可扩展的JSON编码器/解码器
Debian/Ubuntu:
apt-get install libjansson4 libjansson-dev python-simplejson
如果系统中存在libjansson,则将自动编译unix套接字。
通过在Suricata YAML配置文件中的unix-command下将enabled设置为“yes”或“auto”来管理套接字的创建:
unix-command:
enabled:yes
#filename: custom.socket # use this to specify an alternate file
该filename变量可用于设置备用套接字文件名。文件名始终相对于本地状态基目录。
客户端是针对某种语言实现的,可以用作编写自定义脚本的代码示例:
Python:https://github.com/inliniac/suricata/blob/master/scripts/suricatasc/suricatasc.in(提供suricata并在本文档中使用)
Perl:https://github.com/aflab/suricatac(一个简单的Perl客户端,具有交互模式)
C:https://github.com/regit/SuricataC (C语言中没有交互模式的Unix套接字模式客户端)
2. 标准运行模式下的命令
如果尚未安装suricatasc,则可能需要安装suricatasc,从scripts / suricatasc运行以下命令
sudo python setup.py install
现有命令集如下:
command-list:列出可用命令
shutdown:关闭Suricata
iface-list:列出Suricata嗅探数据包的接口
iface-stat:接口的列表统计信息
help:命令列表的别名
version:显示Suricata的版本
uptime:显示Suricata的正常运行时间
running-mode:显示运行模式(workers,autofp,simple)
capture-mode:使用的显示捕获系统
conf-get:获取配置项(参见下面的示例)
dump-counters:dump Suricata的性能指标
reopen-log-files:重新打开日志文件(在外部日志轮换后运行)
ruleset-reload-rules:重新加载规则集并等待完成
ruleset-reload-nonblocking:重新加载规则集,无需等待即可继续
ruleset-reload-time:上次重新加载的返回时间
ruleset-stats:显示已加载和失败的规则数
ruleset-failed-rules:显示失败规则列表
memcap-set:更新指定项的memcap值
memcap-show:显示指定项目的memcap值
memcap-list:列出所有可用的memcap值
您可以使用提供的命名示例脚本访问这些命令suricatasc。典型的会话suricatasc将看起来像:
# suricatasc
Command list: shutdown, command-list, help, version, uptime, running-mode, capture-mode, conf-get, dump-counters, iface-stat, iface-list, quit
>>> iface-list
Success: {'count': 2, 'ifaces': ['eth0', 'eth1']}
>>> iface-stat eth0
Success: {'pkts': 378, 'drop': 0, 'invalid-checksums': 0}
>>> conf-get unix-command.enabled
Success:
"yes"
3.cmd提示符上的命令
您可以直接在命令提示符下使用suricatasc
root@debian64:~# suricatasc -c version
{'message': '2.1beta2 RELEASE', 'return': 'OK'}
root@debian64:~#
root@debian64:~# suricatasc -c uptime
{'message': 35264, 'return': 'OK'}
root@debian64:~#
注意: 您需要引用涉及多个参数的命令:
root@debian64:~# suricatasc -c "iface-stat eth0"
{'message': {'pkts': 5110429, 'drop': 0, 'invalid-checksums': 0}, 'return': 'OK'}
root@debian64:~#
4.Pcap处理模式
此模式是此代码背后的主要动机之一。我们的想法是能够要求Suricata处理不同的pcap文件,而无需在文件之间重新启动Suricata。这为您提供了巨大的时间收益,因为您无需等待签名引擎进行初始化。
要使用此模式,请使用您首选的YAML文件启动suricata并提供选项--unix-socket作为参数:
suricata -c /etc/suricata-full-sigs.yaml --unix-socket
也可以将套接字文件名指定为参数:
suricata --unix-socket=custom.socket
在最后一种情况下,您需要提供套接字的完整路径suricatasc。为此,您需要将文件名作为第一个参数传递suricatasc:
suricatasc custom.socket
启动Suricata后,您可以使用提供的脚本 suricatasc连接到命令套接字并请求pcap处理
root@tiger:~# suricatasc
>>> pcap-file /home/benches/file1.pcap /tmp/file1
Success: Successfully added file to list
>>> pcap-file /home/benches/file2.pcap /tmp/file2
Success: Successfully added file to list
>>> pcap-file-continuous /home/pcaps /tmp/dirout
Success: Successfully added file to list
您可以在不等待结果的情况下添加多个文件:它们将被顺序处理,生成的日志/警报文件将被放入指定为pcap-file命令的第二个参数的目录中。您需要提供文件和目录的绝对路径,因为Suricata不知道脚本的运行位置。如果传递目录而不是文件,则将处理目录中的所有文件。如果使用pcap-file-continuous并传入目录,则将监视目录以查找要添加的新文件,直到您使用pcap-interrupt或删除/移动目录为止。
要知道等待处理的文件数量,您可以:
>>> pcap-file-number
Success: 3
要获取排队文件列表,请执行以下操作:
>>> pcap-file-list
Success: {'count': 2, 'files': ['/home/benches/file1.pcap', '/home/benches/file2.pcap']}
要获取当前处理的文件:
>>> pcap-current
Success:
"/tmp/test.pcap"
传入目录时,您可以看到自epoch以来的上一个处理时间(最后一个文件的修改时间),以毫秒为单位:
>>> pcap-last-processed
Success:
1509138964000
要中断终止当前状态的目录处理:
>>> pcap-interrupt
Success:"Interrupted"
5.建立主机的客户端
该协议记录在以下页面
https://redmine.openinfosecfoundation.org/projects/suricata/wiki/Unix_Socket#Protocol
以下会话显示服务器发送(SND)和接收(RCV)的内容。初步协商如下:
# suricatasc
SND: {"version": "0.1"}
RCV: {"return": "OK"}
完成后,可以发出命令:
>>> iface-list
SND: {"command": "iface-list"}
RCV: {"message": {"count": 1, "ifaces": ["wlan0"]}, "return": "OK"}
Success: {'count': 1, 'ifaces': ['wlan0']}
>>> iface-stat wlan0
SND: {"command": "iface-stat", "arguments": {"iface": "wlan0"}}
RCV: {"message": {"pkts": 41508, "drop": 0, "invalid-checksums": 0}, "return": "OK"}
Success: {'pkts': 41508, 'drop': 0, 'invalid-checksums': 0}
在pcap文件模式下,这给出:
>>> pcap-file /home/eric/git/oisf/benches/sandnet.pcap /tmp/bench
SND: {"command": "pcap-file", "arguments": {"output-dir": "/tmp/bench", "filename": "/home/eric/git/oisf/benches/sandnet.pcap"}}
RCV: {"message": "Successfully added file to list", "return": "OK"}
Success: Successfully added file to list
>>> pcap-file-number
SND: {"command": "pcap-file-number"}
RCV: {"message": 1, "return": "OK"}
>>> pcap-file-list
SND: {"command": "pcap-file-list"}
RCV: {"message": {"count": 1, "files": ["/home/eric/git/oisf/benches/sandnet.pcap"]}, "return": "OK"}
Success: {'count': 1, 'files': ['/home/eric/git/oisf/benches/sandnet.pcap']}
>>> pcap-file-continuous /home/eric/git/oisf/benches /tmp/bench 0 true
SND: {"command": "pcap-file", "arguments": {"output-dir": "/tmp/bench", "filename": "/home/eric/git/oisf/benches/sandnet.pcap", "tenant": 0, "delete-when-done": true}}
RCV: {"message": "Successfully added file to list", "return": "OK"}
Success: Successfully added file to list
有一点需要注意:Suricata消息是在多个发送操作中发送的。这导致客户端可能不完整的读取。更糟糕的解决方法是在尝试接收recv之前先睡一会儿。另一种解决方案是使用非阻塞套接字,并在前一个失败时重试recv。
Pcap文件json格式是:
{
"command": "pcap-file",
"arguments": {
"output-dir": "path to output dir",
"filename": "path to file or directory to run",
"tenant": 0,
"continuous": false,
"delete-when-done": false
}
}
output-dir和filename是必需的。租户是可选的,应该是一个数字,表示文件或目录应在哪个租户下运行。continuous 是可选的,应该是true / false,表示应该运行文件或目录,直到发送pcap-interrupt或调用ctrl-c。delete-when-done是可选的,应该是true / false,表示在处理完成时应该删除filename指定的目录下的文件。 delete-when-done默认为false,表示文件将在处理后保留。