20. 通过Unix套接字交互¶
20.1. 介绍¶
Suricata可以监听unix套接字并接受用户的命令。交换协议是基于JSON的,消息的格式是通用的。
一个名为 suricatasc
在源代码中提供,并在安装/更新Suricata时自动安装。
默认情况下,unix套接字始终处于启用状态。
您需要在Python中支持JSON:
python simple json-用于python的简单、快速、可扩展的json编码器/解码器
Debian/Ubuntu::
apt-get install python-simplejson
套接字的创建是通过在Suricata YAML配置文件中的unix命令下将enabled设置为“yes”或“auto”来管理的:
unix-command:
enabled: yes
#filename: custom.socket # use this to specify an alternate file
这个 filename
变量可用于设置备用套接字文件名。文件名始终相对于本地状态基目录。
客户机是为一些编程语言实现的,可以用作编写自定义脚本的代码示例:
python:https://github.com/OISF/suricata/blob/master/python/suricata/sc/suricatasc.py(随Suricata提供并在本文中使用)
Perl:https://github.com/aflab/suricac(一个具有交互模式的简单Perl客户机)
C:https://github.com/regit/suricac(C中的Unix Socket模式客户端,无交互模式)
20.2. 标准运行模式下的命令¶
您可能需要安装 suricatasc
如果您还没有这样做,请从python/suricatasc运行以下命令
sudo python setup.py install
现有命令集如下:
命令列表:列出可用命令
停机:停机Suricata
iface list:列出Suricata嗅探数据包的接口
iface stat:列出接口的统计信息
帮助:命令列表的别名
版本:显示Suricata的版本
正常运行时间:显示Suricata的正常运行时间
运行模式:显示运行模式(Workers、Autopp、Simple)
捕获模式:使用显示捕获系统
conf get:get配置项(参见下面的示例)
转储计数器:转储Suricata的性能计数器
重新打开日志文件:重新打开日志文件(在外部日志旋转后运行)
规则集重新加载规则:重新加载规则集并等待完成
规则集重新加载非阻塞:重新加载规则集并继续而不等待
规则集重新加载时间:上次重新加载的返回时间
规则集状态:显示已加载和失败的规则数
规则集失败规则:显示失败规则的列表
memcap set:更新指定项的memcap值
memcap show:显示指定项的memcap值
memcap list:列出所有可用的memcap值
重新加载规则:规则集的别名重新加载规则
注册租户处理程序:使用指定的映射注册租户处理程序
注销租户处理程序:使用指定的映射注销租户处理程序
注册租户:使用特定的ID和文件名注册租户
注销租户:使用特定ID注销租户
重新加载租户:使用指定的ID和文件名重新加载租户
添加host bit:在具有特定位名称和到期时间的主机IP上添加hostbit
删除host bit:删除具有指定位名称的主机IP上的hostbit
列出主机位:列出特定主机IP的主机位
您可以使用提供的示例访问这些命令 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"
20.3. 命令在命令提示下¶
你可以使用 suricatasc
直接在命令提示符下:
root@debian64:~# suricatasc -c version
{'message': '5.0.3 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:~#
20.4. PCAP处理模式¶
这种模式是这种代码背后的主要动机之一。这个想法是能够提供不同的pcap文件给Suricata,而不必为每个文件重新启动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"
20.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 是必需的。 tenant 是可选的,应该是一个数字,指示文件或目录应该在哪个租户下运行。 continuous 是可选的,应为true/false,指示文件或目录应在 pcap-interrupt 发送或调用ctrl-c。 delete-when-done 是可选的,应为true/false,指示由指定目录下的一个或多个文件 filename 处理完成后应删除。 delete-when-done 默认值为false,表示文件将在处理后保留。