Provided by: stenographer_0.0~git20190917.0.3545c54-1ubuntu0.2_amd64 bug

NAME

       stenographer - Stenographer packet capture daemon

SYNOPSIS

       stenographer [-config FILE] [-syslog] [-v INT]

DESCRIPTION

       Stenographer  is a full-packet-capture utility for buffering packets to disk for intrusion
       detection and incident response purposes. It provides a high-performance implementation of
       NIC-to-disk  packet  writing,  handles deleting those files as disk fills up, and provides
       methods for reading back specific sets of packets quickly and easily.

       This is the main executable for Stenographer. It is recommended to interact  with  it  via
       the provided init scripts.

OPTIONS

       -config FILE
              File location to read configuration from (default "/etc/stenographer/config")

       -syslog
              If true, log to syslog.  Otherwise, log to stderr (default true)

       -v int log many verbose logs (default -1)

USER AND GROUPS

       A  single  system  group  `stenographer`, and a system user `stenographer` are used to run
       Stenographer.

       The `stenographer` group is used to control access to locally stored  packet  data.  Users
       are added to this group to allow them to query stenographer (via the `stenoread` command).

       The `stenographer` user is used to run the `stenographer` and `stenotype` binaries. We use
       the `stenographer` user to protect the system from `stenographer` and `stenotype`...  this
       user  has  no  special privileges except the ability to read/write packet data and run the
       (setcap'd) stenotype binary. So if either is compromised, the system as a whole won't be.

CONFIGURATION FILE

       The `/etc/stenographer/config` file tells Stenographer what  packets  to  read,  where  to
       write  them,  how  to  serve  them,  etc. It also tells the clients where the Stenographer
       server is running and how to query it.

       Here's an example config (note: it's JSON):

           {
             "Threads": [
                 { "PacketsDirectory": "/disk1/stenopkt", "IndexDirectory": "/disk3/stenoidx/disk1"}
               , { "PacketsDirectory": "/disk2/stenopkt", "IndexDirectory": "/disk3/stenoidx/disk2", "DiskFreePercentage": 25}
             ]
             , "StenotypePath": "/usr/local/bin/stenotype"
             , "Interface": "em1"
             , "Port": 1234
             , "Flags": []
             , "CertPath": "/etc/stenographer/certs"
           }

       Let's look at each part of this in detail:

              * `StenotypePath`:
                     Where `stenographer` can find the `stenotype` binary, which  it  runs  as  a
                     subprocess

              * `Interface`:
                     Network interface to read packets from

              * `Port`:
                     Port `stenographer` will bind to in order to serve `stenoread` requests.

              * `CertPath`:
                     Where  `stenographer`  will  write certificates for client verification, and
                     where the clients will read certificates when issuing queries.

       The `Threads` section is one of the most  important.  It  tells  `stenotype`,  the  packet
       capturing  subprocess, a number of things: how many threads to read packets with, where to
       store those packets, and how to clean them up.

       For each packet reading thread you'd like to run (IE: for each core you'd  like  to  use),
       you must specify:

              * `PacketsDirectory`:
                     Where  to write packet files. We recommend mounting a separate disk for each
                     thread... we've found that at least for spinning disks, a  single  core  can
                     easily fill a disk's entire write throughput with room to spare.

              * `IndexDirectory`:
                     Where to write index files. We've had good luck with using a single separate
                     disk to write all index files, writing each thread's  index  to  a  separate
                     subdirectory. This directory gets FAR fewer writes, and they're FAR smaller.
                     We've found that even with up to 8 threads, the all 8 index directories take
                     up less than 20% of the space of a single thread's packets.

              * `DiskFreePercentage`:
                     The  amount  of  space to keep free in the packets directory. `stenographer`
                     will delete files in this thread's packets directory when  free  disk  space
                     decreases  below  this  percentage.  Note  that  we  don't  currently do any
                     automated cleanup of the index directory.  When a packet file is cleaned up,
                     its  index file is cleaned up, and because index files take so little space,
                     we  haven't  ever  needed   to   clean   them   up   directly.   Note   that
                     `DiskFreePercentage` is optional, it defaults to 10%.

              * `MaxDirectoryFiles`:
                     The  maximum number of packet/index files to create before cleaning old ones
                     up. Defaults to 30K  files,  to  avoid  issues  with  ext3's  32K  file-per-
                     directory  maximums. For ext4 you should be able to go higher without issue.
                     Note that since we create at least one file every minute, this defaults to a
                     maximum limit of 8 1/3 days before we drop old packets.

       The  `Flags`  section  allows you to specify flags to pass to the `stenotype` binary. Here
       are some flags which may prove particularly useful:

              * `-v`:
                     Add verbosity to logging. Logs by default are written  to  syslog,  and  are
                     relatively  quiet.  Adding  one  `-v`  will  have stenotype write per-thread
                     capture statistics every minute or 100MB of packets, whichever comes  first.
                     Adding more `-v` flags will provide you with reams of debugging information.

              * `--blocks=NUM`:
                     The  number  of  1MB  packet  blocks  used  by AF_PACKET to store packets in
                     memory, *per thread*. This flag basically allows you to control how much RAM
                     the  `stenotype`  binary  uses:  `blocks  * threads * 1MB`. More blocks will
                     allow a thread to handle traffic  spikes:  if  you  have  2048  blocks  (the
                     default),  then a thread can hold 2GB of traffic in memory while waiting for
                     it to hit disk. If you have slow links  and  you  want  to  decrease  memory
                     usage, you can probably decrease this a LOT. :)

              * `--fanout_type=NUM`:
                     This  sets  the  AF_PACKET fanout type to the passed-in value. See AF_PACKET
                     documentation for details on options here. The default  should  probably  be
                     fine.

              * `--filter=HEX`:
                     Allows  users to specify a BPF filter for packet capture, only packets which
                     match this filter will be written by  `stenotype`.  This  is  NOT  a  human-
                     readable  BPF  filter, it's a hex-encoded compiled filter.  Use the supplied
                     `compile_bpf.sh` script to generate  this  encoding  from  a  human-readable
                     filter.

              * `--seccomp=none|trace|kill`:
                     We  use  seccomp  to  sandbox  stenotype,  but  we've found that this can be
                     fragile as we switch between  different  machine  configurations.  Some  VMs
                     appear  to  freeze  while  trying  to  set  up  seccomp sandboxes: for those
                     environments, you can pass `--seccomp=none` in (note that this will turn off
                     some  sandboxing). If you're trying to debug a `stenotype` failure you think
                     is caused by overzealous sandboxing, you can pass in `--seccomp=trace`, then
                     run stenotype with `strace` to figure out why things are misbehaving.

              * `--preallocate_file_mb=NUM`:
                     Certain  file  systems  handle  writes  faster  if the file has already been
                     allocated to its eventual size.  If  you  set  this  flag  to  `4096`,  then
                     stenotype  will  preallocate each new packet file to this size while opening
                     it. The file will be truncated to its actual size when closed.  This  should
                     not  be necessary unless you're really trying to eak out some extra speed on
                     a file system that supports extents.

       If you are using xfs on 4.1+ kernel, setting "--preallocate_file_mb"  becomes  crucial  to
       performance.  This is in that when appending to the end of file (i.e. EOF updates), kernel
       will serialize all operations. Please refer to upstream commit  (b9d5984  xfs:  DIO  write
       completion size updates race).