summaryrefslogtreecommitdiffstats
path: root/doc/userguide/unix-socket.rst
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--doc/userguide/unix-socket.rst271
1 files changed, 271 insertions, 0 deletions
diff --git a/doc/userguide/unix-socket.rst b/doc/userguide/unix-socket.rst
new file mode 100644
index 0000000..08ae1c3
--- /dev/null
+++ b/doc/userguide/unix-socket.rst
@@ -0,0 +1,271 @@
+Interacting via Unix Socket
+===========================
+
+Introduction
+------------
+
+Suricata can listen to a unix socket and accept commands from the user. The
+exchange protocol is JSON-based and the format of the message is generic.
+
+An example script called ``suricatasc`` is provided in the source and installed
+automatically when installing/updating Suricata.
+
+The unix socket is always enabled by default.
+
+You'll need to have JSON support in Python:
+
+* python-simplejson - simple, fast, extensible JSON encoder/decoder for Python
+
+Debian/Ubuntu::
+
+ apt-get install python-simplejson
+
+The creation of the socket is managed by setting enabled to 'yes' or 'auto'
+under unix-command in Suricata YAML configuration file: ::
+
+ unix-command:
+ enabled: yes
+ #filename: custom.socket # use this to specify an alternate file
+
+The ``filename`` variable can be used to set an alternate socket
+filename. The filename is always relative to the local state base
+directory.
+
+Clients are implemented for some programming languages and can be used as code
+example to write custom scripts:
+
+* Python: https://github.com/OISF/suricata/blob/master/python/suricata/sc/suricatasc.py (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)
+
+.. _standard-unix-socket-commands:
+
+Commands in standard running mode
+---------------------------------
+Runnable script for suricatasc is available in `python/bin` directory of suricata. You can
+run it with the following commands.
+
+::
+
+ cd python
+ sudo ./bin/suricatasc
+
+The set of existing commands is the following:
+
+* command-list: list available commands
+* shutdown: shutdown Suricata
+* iface-list: list interfaces where Suricata is sniffing packets
+* iface-stat: list statistics 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 counters
+* reopen-log-files: reopen log files (to be run after external log rotation)
+* ruleset-reload-rules: reload ruleset and wait for completion
+* ruleset-reload-nonblocking: reload ruleset and proceed without waiting
+* ruleset-reload-time: return time of last reload
+* ruleset-stats: display the number of rules loaded and failed
+* ruleset-failed-rules: display the list of failed rules
+* memcap-set: update memcap value of the specified item
+* memcap-show: show memcap value of the specified item
+* memcap-list: list all memcap values available
+* reload-rules: alias of ruleset-reload-rules
+* register-tenant-handler: register a tenant handler with the specified mapping
+* unregister-tenant-handler: unregister a tenant handler with the specified mapping
+* register-tenant: register tenant with a particular ID and filename
+* unregister-tenant: unregister tenant with a particular ID
+* reload-tenant: reload a tenant with specified ID and filename
+* add-hostbit: add hostbit on a host IP with a particular bit name and time of expiry
+* remove-hostbit: remove hostbit on a host IP with specified bit name
+* list-hostbit: list hostbit for a particular host IP
+
+You can access these commands with the provided example ``suricatasc`` script.
+A typical session with ``suricatasc`` looks like:
+
+::
+
+ # 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"
+
+Commands on the cmd prompt
+--------------------------
+
+You can use ``suricatasc`` directly on the command prompt:
+
+::
+
+ 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:~#
+
+
+**NOTE:**
+You need to quote commands with more than one argument:
+
+::
+
+ root@debian64:~# suricatasc -c "iface-stat eth0"
+ {'message': {'pkts': 5110429, 'drop': 0, 'invalid-checksums': 0}, 'return': 'OK'}
+ root@debian64:~#
+
+
+PCAP processing mode
+--------------------
+
+This mode is one of main motivations behind this code. The idea is to
+be able to provide different pcap files to Suricata without
+having to restart Suricata for each file. This saves time since
+you don't need to wait for the signature engine to initialize.
+
+To use this mode, start Suricata with your preferred configuration YAML file and
+provide the option ``--unix-socket`` as argument::
+
+ suricata -c /etc/suricata-full-sigs.yaml --unix-socket
+
+It is also possible to specify the socket filename as an argument::
+
+ suricata --unix-socket=custom.socket
+
+In this last case, you will need to provide the complete path to the
+socket to ``suricatasc``. To do so, you need to pass the filename as
+first argument of ``suricatasc``: ::
+
+ suricatasc custom.socket
+
+Once Suricata is started, you can use ``suricatasc`` to connect to the
+command socket and provide different pcap files: ::
+
+ 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
+
+You can add multiple files without waiting for each to be processed; they will be
+sequentially processed and the generated log/alert files will be put
+into the directory specified as second argument of the pcap-file
+command. You need to provide an absolute path to the files and directory
+as Suricata doesn't know from where the script has been run. If you pass
+a directory instead of a file, all files in the directory will be processed. If
+using ``pcap-file-continuous`` and passing in a directory, the directory will
+be monitored for new files being added until you use ``pcap-interrupt`` or
+delete/move the directory.
+
+To display how many files are waiting to get processed, you can do: ::
+
+ >>> pcap-file-number
+ Success: 3
+
+To display the list of queued files, do: ::
+
+ >>> pcap-file-list
+ Success: {'count': 2, 'files': ['/home/benches/file1.pcap', '/home/benches/file2.pcap']}
+
+To display current processed file: ::
+
+ >>> pcap-current
+ Success:
+ "/tmp/test.pcap"
+
+When passing in a directory, you can see last processed time (modified time of last file) in milliseconds since epoch:
+
+::
+
+ >>> pcap-last-processed
+ Success:
+ 1509138964000
+
+To interrupt directory processing which terminates the current state:
+
+::
+
+ >>> pcap-interrupt
+ Success:
+ "Interrupted"
+
+Build your own client
+---------------------
+
+The protocol is documented in the following page
+https://redmine.openinfosecfoundation.org/projects/suricata/wiki/Unix_Socket#Protocol
+
+The following session show what is sent (SND) and received (RCV) by
+the server. Initial negotiation is the following: ::
+
+ # suricatasc
+ SND: {"version": "0.1"}
+ RCV: {"return": "OK"}
+
+Once this is done, commands can be issued: ::
+
+ >>> 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']}
+ >>> 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
+
+There is one thing to be careful about: a Suricata message is sent in
+multiple send operations. This result in possible incomplete read on
+client side. The worse workaround is to sleep a bit before trying a
+recv call. An other solution is to use non blocking socket and retry a
+recv if the previous one has failed.
+
+Pcap-file json format is:
+
+::
+
+ {
+ "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` and `filename` are required. `tenant` is optional and should be a
+number, indicating which tenant the file or directory should run under. `continuous`
+is optional and should be true/false, indicating that file or directory should be
+run until `pcap-interrupt` is sent or ctrl-c is invoked. `delete-when-done` is
+optional and should be true/false, indicating that the file or files under the
+directory specified by `filename` should be deleted when processing is complete.
+`delete-when-done` defaults to false, indicating files will be kept after
+processing.