1. 介紹
Suricata可以監(jiān)聽(tīng)unix套接字并接受來(lái)自用戶(hù)的命令。交換協(xié)議是基于JSON的,并且消息的格式已經(jīng)完成。
源代碼中提供了一個(gè)名為suricatasc的示例腳本,并在安裝/更新Suricata時(shí)自動(dòng)安裝。
如果libjansson可用,則默認(rèn)啟用unix套接字。
您需要安裝libjansson:
libjansson4 - 用于編碼,解碼和操作JSON數(shù)據(jù)的C庫(kù)
libjansson-dev - 用于編碼,解碼和操作JSON數(shù)據(jù)(dev)的C庫(kù)
python-simplejson - 用于Python的簡(jiǎn)單,快速,可擴(kuò)展的JSON編碼器/解碼器
Debian/Ubuntu:
apt-get install libjansson4 libjansson-dev python-simplejson
如果系統(tǒng)中存在libjansson,則將自動(dòng)編譯unix套接字。
通過(guò)在Suricata YAML配置文件中的unix-command下將enabled設(shè)置為“yes”或“auto”來(lái)管理套接字的創(chuàng)建:
unix-command:
????enabled:yes?
????#filename: custom.socket # use this to specify an alternate file
該filename變量可用于設(shè)置備用套接字文件名。文件名始終相對(duì)于本地狀態(tài)基目錄。
客戶(hù)端是針對(duì)某種語(yǔ)言實(shí)現(xiàn)的,可以用作編寫(xiě)自定義腳本的代碼示例:
Python:https://github.com/inliniac/suricata/blob/master/scripts/suricatasc/suricatasc.in(提供suricata并在本文檔中使用)
Perl:https://github.com/aflab/suricatac(一個(gè)簡(jiǎn)單的Perl客戶(hù)端,具有交互模式)
C:https://github.com/regit/SuricataC?(C語(yǔ)言中沒(méi)有交互模式的Unix套接字模式客戶(hù)端)
2. 標(biāo)準(zhǔn)運(yùn)行模式下的命令
如果尚未安裝suricatasc,則可能需要安裝suricatasc,從scripts / suricatasc運(yùn)行以下命令
sudo python setup.py install
現(xiàn)有命令集如下:
command-list:列出可用命令
shutdown:關(guān)閉Suricata
iface-list:列出Suricata嗅探數(shù)據(jù)包的接口
iface-stat:接口的列表統(tǒng)計(jì)信息
help:命令列表的別名
version:顯示Suricata的版本
uptime:顯示Suricata的正常運(yùn)行時(shí)間
running-mode:顯示運(yùn)行模式(workers,autofp,simple)
capture-mode:使用的顯示捕獲系統(tǒng)
conf-get:獲取配置項(xiàng)(參見(jiàn)下面的示例)
dump-counters:dump Suricata的性能指標(biāo)
reopen-log-files:重新打開(kāi)日志文件(在外部日志輪換后運(yùn)行)
ruleset-reload-rules:重新加載規(guī)則集并等待完成
ruleset-reload-nonblocking:重新加載規(guī)則集,無(wú)需等待即可繼續(xù)
ruleset-reload-time:上次重新加載的返回時(shí)間
ruleset-stats:顯示已加載和失敗的規(guī)則數(shù)
ruleset-failed-rules:顯示失敗規(guī)則列表
memcap-set:更新指定項(xiàng)的memcap值
memcap-show:顯示指定項(xiàng)目的memcap值
memcap-list:列出所有可用的memcap值
您可以使用提供的命名示例腳本訪(fǎng)問(wèn)這些命令suricatasc。典型的會(huì)話(huà)suricatasc將看起來(lái)像:
# 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:~#
注意:?您需要引用涉及多個(gè)參數(shù)的命令:
root@debian64:~# suricatasc -c "iface-stat eth0"
{'message': {'pkts': 5110429, 'drop': 0, 'invalid-checksums': 0}, 'return': 'OK'}
root@debian64:~#
4.Pcap處理模式
此模式是此代碼背后的主要?jiǎng)訖C(jī)之一。我們的想法是能夠要求Suricata處理不同的pcap文件,而無(wú)需在文件之間重新啟動(dòng)Suricata。這為您提供了巨大的時(shí)間收益,因?yàn)槟鸁o(wú)需等待簽名引擎進(jìn)行初始化。
要使用此模式,請(qǐng)使用您首選的YAML文件啟動(dòng)suricata并提供選項(xiàng)--unix-socket作為參數(shù):
suricata -c /etc/suricata-full-sigs.yaml --unix-socket
也可以將套接字文件名指定為參數(shù):
suricata --unix-socket=custom.socket
在最后一種情況下,您需要提供套接字的完整路徑suricatasc。為此,您需要將文件名作為第一個(gè)參數(shù)傳遞suricatasc:
suricatasc custom.socket
啟動(dòng)Suricata后,您可以使用提供的腳本?suricatasc連接到命令套接字并請(qǐng)求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
您可以在不等待結(jié)果的情況下添加多個(gè)文件:它們將被順序處理,生成的日志/警報(bào)文件將被放入指定為pcap-file命令的第二個(gè)參數(shù)的目錄中。您需要提供文件和目錄的絕對(duì)路徑,因?yàn)镾uricata不知道腳本的運(yùn)行位置。如果傳遞目錄而不是文件,則將處理目錄中的所有文件。如果使用pcap-file-continuous并傳入目錄,則將監(jiān)視目錄以查找要添加的新文件,直到您使用pcap-interrupt或刪除/移動(dòng)目錄為止。
要知道等待處理的文件數(shù)量,您可以:
>>> pcap-file-number
Success: 3
要獲取排隊(duì)文件列表,請(qǐng)執(zhí)行以下操作:
>>> pcap-file-list
Success: {'count': 2, 'files': ['/home/benches/file1.pcap', '/home/benches/file2.pcap']}
要獲取當(dāng)前處理的文件:
>>> pcap-current
Success:
"/tmp/test.pcap"
傳入目錄時(shí),您可以看到自epoch以來(lái)的上一個(gè)處理時(shí)間(最后一個(gè)文件的修改時(shí)間),以毫秒為單位:
>>> pcap-last-processed
Success:
1509138964000
要中斷終止當(dāng)前狀態(tài)的目錄處理:
>>> pcap-interrupt
Success:"Interrupted"
5.建立主機(jī)的客戶(hù)端
該協(xié)議記錄在以下頁(yè)面
https://redmine.openinfosecfoundation.org/projects/suricata/wiki/Unix_Socket#Protocol
以下會(huì)話(huà)顯示服務(wù)器發(fā)送(SND)和接收(RCV)的內(nèi)容。初步協(xié)商如下:
# suricatasc
SND: {"version": "0.1"}
RCV: {"return": "OK"}
完成后,可以發(fā)出命令:
>>> 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
有一點(diǎn)需要注意:Suricata消息是在多個(gè)發(fā)送操作中發(fā)送的。這導(dǎo)致客戶(hù)端可能不完整的讀取。更糟糕的解決方法是在嘗試接收recv之前先睡一會(huì)兒。另一種解決方案是使用非阻塞套接字,并在前一個(gè)失敗時(shí)重試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是必需的。租戶(hù)是可選的,應(yīng)該是一個(gè)數(shù)字,表示文件或目錄應(yīng)在哪個(gè)租戶(hù)下運(yùn)行。continuous?是可選的,應(yīng)該是true / false,表示應(yīng)該運(yùn)行文件或目錄,直到發(fā)送pcap-interrupt或調(diào)用ctrl-c。delete-when-done是可選的,應(yīng)該是true / false,表示在處理完成時(shí)應(yīng)該刪除filename指定的目錄下的文件。?delete-when-done默認(rèn)為false,表示文件將在處理后保留。