16.1.介绍
Suricata可以监听unix套接字并接受来自用户的命令。 交换协议是基于JSON的,消息的格式是通用的。
源代码中提供了一个名为suricatasc的示例脚本,并在安装/更新Suricata时自动安装。
如果libjansson可用,则默认启用unix套接字。
你需要安装libjansson:
- libjansson4 - C library for encoding, decoding and manipulating JSON data
- libjansson-dev - C library for encoding, decoding and manipulating JSON data (dev)
- python-simplejson - simple, fast, extensible JSON encoder/decoder for Python
Debian/Ubuntu:
apt-get install libjansson4 libjansson-dev python-simplejson
如果系统上存在libjansson,则会自动编译unix套接字。
在Suricata YAML配置文件中,通过在unix-command下启用“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(provided with suricata and used in this document) - Perl:
https://github.com/aflab/suricatac
(a simple Perl client with interactive mode) - C:
https://github.com/regit/SuricataC
(a unix socket mode client in C without interactive mode)
16.2.在标准运行模式下的命令
he set of existing commands is the following:
- command-list: list available commands
- shutdown: this shutdown suricata
- iface-list: list interfaces where Suricata is sniffing packets
- iface-stat: list statistic for an interface
- help: alias of command-list
- version: display Suricata’s version
- uptime: display Suricata’s uptime
- running-mode: display running mode (workers, autofp, simple)
- capture-mode: display capture system used
- conf-get: get configuration item (see example below)
- dump-counters: dump Suricata’s performance counter
您可以使用提供的名为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"
16.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:~#
16.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命令的第二个参数指定的目录中。 您需要提供文件和目录的绝对路径,因为suricata不知道脚本的运行位置。
要知道有多少文件正在等待处理,您可以执行以下操作:
>>> pcap-file-number
Success: 3
要获得排队文件列表,请执行以下操作:
>>> pcap-file-list
Success: {'count': 2, 'files': ['/home/benches/file1.pcap', '/home/benches/file2.pcap']}
To get current processed file:
>>> pcap-current
Success:
"/tmp/test.pcap"
16.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}
In pcap-file mode, this gives:
>>> 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']}
有一点需要注意:在多个发送操作中发送一个suricata消息。 这导致客户端可能不完整的读取。 更糟的解决方法是在尝试recv呼叫之前睡一会儿。 另一种解决方案是使用非阻塞套接字,如果前一个失败,则重试一个recv。 这里使用这个方法:source:scripts / suricatasc / suricatasc.in#L43