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 变量可用于设置备用套接字文件名。文件名始终相对于本地状态基目录。

客户机是为一些编程语言实现的,可以用作编写自定义脚本的代码示例:

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-dirfilename 是必需的。 tenant 是可选的,应该是一个数字,指示文件或目录应该在哪个租户下运行。 continuous 是可选的,应为true/false,指示文件或目录应在 pcap-interrupt 发送或调用ctrl-c。 delete-when-done 是可选的,应为true/false,指示由指定目录下的一个或多个文件 filename 处理完成后应删除。 delete-when-done 默认值为false,表示文件将在处理后保留。