美文网首页
suricata通过Unix Socket进行交互

suricata通过Unix Socket进行交互

作者: lx_jian | 来源:发表于2019-07-05 17:10 被阅读0次

    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,表示文件将在处理后保留。

    相关文章

      网友评论

          本文标题:suricata通过Unix Socket进行交互

          本文链接:https://www.haomeiwen.com/subject/jyiehctx.html