Provided by: stealth_4.03.03-1_amd64 bug

NAME

       stealth - Stealthy File Integrity Scanner

SYNOPSIS

       `<uds>’ represents the location of the used Unix Domain Socket.

       stealth  --daemon <uds> --dry-run --log <file-spec> --logmail
       --max-size <size>[BKMG] --no-mail --parse-policy-file
       --random-interval <seconds> --repeat <seconds>
       --skip-files <file-spec> --syslog
       --syslog-facility <fac> --syslog-priority <pri> --syslog-tag <tag>
       --verbosity <value> policy

       stealth  --dry-run --log <file-spec> --logmail
       --max-size <size>[BKMG] --no-mail --parse-policy-file
       --random-interval <seconds> --repeat <seconds>
       --run-command <nr> --skip-files <file-spec> --stdout --syslog
       --syslog-facility <fac> --syslog-priority <pri> --syslog-tag <tag>
       --verbosity <value> policy

       stealth {--ping,--reload,--rerun,--resume,--suspend,--terminate} <uds>

       stealth --help --version

DESCRIPTION

       The name of the stealth program is an acronym of:
              SSH-based Trust Enforcement Acquired through a Locally Trusted Host.
       Stealth  is  based  on  an  idea  by  Hans  Gankema  and  Kees Visser, both at the Center for Information
       Technology of the University of Groningen. Hopko Meijering provided valuable suggestions for improvement.

       Stealth’s main task is to perform file integrity  tests.  However,  the  testing  itself  will  leave  no
       sediments  on the tested computer. Therefore, stealth has stealthy characteristics. This is considered an
       important feature, improving the security (integrity) of the software of computers monitored by stealth.

       Please realize that stealth intends to be just  another  security  tool:  other  security  measures  like
       firewalls,  portscanners,  intrusion  detection systems, dropping unencrypted protocols, etc. are usually
       required to improve the security of a group of computers that are connected to the Internet. Stealth is a
       file integrity scanner, and file integrity scanners offer no substitute for those tools (and vv.).

       Stealth uses a policy file to determine the actions to perform. Each policy file is  uniquely  associated
       with  a  host  being  monitored. This host (called the client below) trusts the computer on which stealth
       runs, called the monitor (hence: a Locally Trusted Host).  The  monitor  performs  tasks  (normally  file
       integrity  tests) that Enforce the Trust we have in the client computer. Since almost all integrity tests
       can be run on the client, one monitor can control many clients, even if  the  monitor  itself  uses  aged
       hard- and software components.

       As  the  monitor  and  the client are (i.e., should be) different computers, the monitor must communicate
       with the client in a secure fashion. This is realized through SSH. So, there’s another element of  `local
       trust’ involved here: the client should permit the monitor to set up a secure SSH connection allowing the
       monitor to access sensitive elements in the client’s file system.

       It  is important to ensure that public access to the monitor is prevented. No incoming services should be
       allowed. The only access to the monitor should be via its console and the monitor should be placed  in  a
       physically  secure location. Sensitive information of clients are stored in the monitor’s file system. To
       access the clients stealth in daemon mode can use a passphrase-protected  ssh-key,  allowing  stealth  to
       perform its tasks thereafter. This, too, makes it important to prevent the monitor from being accessed by
       unauthorized persons.

       If,  instead  of  running  stealth  in  daemon  mode  it  is preferred to let stealth perform single, but
       automated integrity scans, then new ssh(1) connections may be difficult to establish if the used  ssh-key
       is  passphrase-protected.  To  implement  this scenario (i.e., automated integrity scans using passphrase
       protected ssh-keys) the program ssh-cron(1) can profitably be used.

       Stealth’s current way of connecting to clients uses a single ssh(1) connection, which results in  only  a
       single  sshd(1) entry in the client’s logfiles, which lasts for the duration of stealth’s run. When using
       stealth in daemon mode this too minimizes the `footprint’ stealth has on the client hosts.

       The  monitor  itself normally only requires two types of outgoing services: SSH to reach its clients, and
       some mail transport agent (e.g., sendmail(1)) to forward its outgoing mail to some mail-hub.

       Here is what happens when stealth running using the first synopsis:

       o      First, the policy file is read. For each client a policy file is defined, specifying  the  actions
              to be performed, and specifying the values of several variables used by stealth.

       o      If  the  command-line  option --daemon <uds> is specified, stealth runs as a daemon process, using
              the Unix Domain Socket (<uds>) for communication with stealth processes running in IPC mode.

              If access to the Unix  Domain  Socket  defined  by  Stealth  running  in  daemon  mode  should  be
              restricted,  it  can be defined in a directory with is only accessible to the user running Stealth
              (this will often be the root-user).

              When running in daemon mode, --repeat <seconds> may be specified to rerun the integrity scan every
              <seconds> seconds. If an integrity scan is being performed when, according to the repeat  interval
              the next integrity scan is due, then the current scan is first completed. Once completed, the next
              integrity scan will be performed after seconds seconds.

       o      Next,  the  monitor  opens  a command shell on the client using ssh(1), and a command shell on the
              monitor computer itself using sh(1).

       o      Once the command shells are available, commands defined in the policy file are executed  in  their
              order of appearance. Examples are given below. Normally, return values of the programs are tested.
              When  return values are to be tested stealth terminates when a non-zero return value is sensed. If
              this happens, a message stating the reason why stealth terminated is written to  the  report  file
              (and  into  the  mail  sent  by  stealth).  In some cases (e.g., when the report file could not be
              written), the message is written to the standard error stream.

       o      Very often integrity  tests  can  be  controlled  using  find(1),  calling  programs  like  ls(1),
              sha256sum(1) or its own -printf method to produce file-integrity related statistics. Most of these
              programs  write  file  names  at the end of generated lines. This characteristic is used by one of
              stealth’s internal routines to detect changes in the generated output. Such changes could indicate
              some harmful intent, like an installed root-kit.

       o      When changes are detected, they are logged in a  report  file,  to  which  information  is  always
              appended.  Stealth never reduces the report file’s size or rewrites its contents. When information
              is added to the report file (beyond a plain time stamp) the newly added information is e-mailed to
              a configurable e-mail address for further (human) processing. Usually the e-mail is  sent  to  the
              systems  manager  of  the  tested client. Stealth follows the `dark cockpit’ approach in the sense
              that no mail is sent when no changes were detected.

       o      Report and other log-files may safely be  rotated  between  a  pair  of  --suppress  and  --resume
              commands (see below at the section `REPORT FILE ROTATION’).

       If  stealth  should  not be run as a daemon process the second synopsis can be used. In this case stealth
       performs one or more integrity scans (the latter when the --repreat option was specified). When a  single
       integrity scan is requested stealth terminates after the scan. When --repeat is specified stealth shows a
       prompt (i.e., `? ’) and terminates after pressing the Enter-key.

       The  third  synopsis  is  used  for communication with a stealth daemon. In this case the the Unix Domain
       Socket defined by the stealth daemon process must be specified after the option specifying the  requested
       command.

OPTIONS

       Short options are provided between parentheses, immediately following their long option equivalents.

       Option  descriptions  showing (C) can only be used on the command-line, and are ignored when specified in
       the second section of the policy file.

       In the overview of  options  `<uds>’  represents  the  name  of  the  Unix  Domain  Socket  to  use,  and
       `<file-spec>’ refers to a (relative or absolute) specification of a file location.

       With  the  first  and  second  synopses  relative  locations  (of  the  Unix  Domain  Socket and of other
       file-specifications) are interpreted relative to the current working directory.

       Command-line options overrule options defined in the policy-file.

       o      --daemon (-d) <uds>: (C) run as background (daemon) process. When the Stealth  daemon  process  is
              started, the Unix Domain Socket (tt<uds>) may not already exist.

       o      --dry-run:  (C)  no  integrity scans or reloads are performed, but are assumed OK. Remaining tasks
              are normally performed;

       o      --help (-h): (C) Display help information and exit;

       o      --log (-L) <file-spec>: log messages are appended to `file-spec’. If file-spec does not exist,  it
              is first created;

       o      --logmail: mail sent by stealth is logged (requires --log or --syslog);

       o      --max-size <size>[BKMG]: files retrieved by GET commands may at most have <size> bytes (B), KBytes
              (K), MBytes (M), GBytes (G). The default size is 10M, the default unit is B.

       o      --no-mail:  mail  is not sent. By default mail is sent as configured in the policy-file (--logmail
              can be specified independently from --no-mail);

       o      --parse-policy-file (-p): (C) parse the policy file, after which stealth ends.
              Specify once to see the numbered commands;
              twice to see the policy file parsing steps as well.
              Results are written to the std. output.

       o      --ping <uds>: (C) performs no actions, but is used to verify that a stealth daemon can be  reached
              via  its  Unix Domain Socket (<uds>). The daemon will respond even if it’s currently performing an
              integrity scan. It is used by the /usr/bin/stealthcron script to verify that a stealth  daemon  is
              alive.

       o      --random-interval  (-i) <interval>[m]>: start the scan a random interval of <interval> seconds (or
              minutes if an `m’ is appended (no blanks) to <interval>) following the delay specified at --repeat
              (see below). This option requires specification of the --repeat and --daemon options;

       o      --reload <uds>: (C) reloads the configuration and skip-files and restarts the scan of the  stealth
              daemon  process.  Options  defined  in  the  policy  file are also reloaded. However, command-line
              options always take priority over options defined in the policy file, so when command-line options
              were used when starting stealth in daemon mode, they cannot be modified by  reloading  the  policy
              file.

       o      --repeat <seconds>: wake up and perform an integrity scan at interrupts or after <seconds> seconds
              (or  minutes  if  an  `m’  is  appended  (no  blanks)  to <seconds>) after completing the previous
              integrity scan. The option --random-interval can be used to add a random delay to <seconds>  until
              the  next  integrity  scan  is  performed.  This option requires specification of the and --daemon
              option;

       o      --rerun <uds>: (C) start executing the integrity scan commands that are specified in  the  stealth
              daemon process’s policy file;

       o      --resume <uds>: (C) resume a suspended stealth process, implies --rerun;

       o      --run-command  (-r)  <nr>: (C) Only execute command number <nr> (natural number).  Command numbers
              are shown by stealth ---parse-policy-file. This option can only  be  specified  using  the  second
              synopsis;

       o      --skip-files  (-s)  <file-spec>:  all  entries  in <file-spec> are skipped. Their integrity is not
              monitored. If an entry is already present in a log file then stealth once  generates  an  IGNORING
              message  in  the  mail  sent  to  the  address  specified  at EMAIL in the policy file. Each entry
              mentioned in file-spec must be on a line of its own and must  be  specified  using  absolute  file
              paths.  Entries  ending  in  a  slash  are  assumed  to be directories whose full contents must be
              skipped. Other entries are interpreted as the names of files to skip. Initial and trailing blanks,
              empty lines and lines having a # as their 1st non blank  character  are  ignored.  Here  are  some
              examples:

                      # skip all files in user’s Mail directory
                  /home/user/Mail/
                      # skip user’s .history file
                  /home/user/.history

       o      --stdout  (-o):  messages  are  (also)  written to the std. output stream (only available with the
              second synopsis);

       o      --suspend <uds>: (C) suspends a currently active stealth process. Following --suspend use --resume
              to re-activate an stealth daemon or --terminate to end an stealth daemon;

       o      --syslog: write syslog messages;

       o      --syslog-facility <facility>:  syslog facility to use. By default facility DAEMON is used;

       o      --syslog-priority <priority>: syslog priority to use. By default priority NOTICE is used;

       o      --syslog-tag <tag>: <tag> specifies the identifier that is prefixed to syslog messages. By default
              the tag `STEALTH’ is used, see also the next section;

       o      --terminate <uds>: (C) terminate a currently active stealth process;

       o      --time-stamp (-t) <type>: the time-stamps to use. By default UTC. To use the  local  time  specify
              --time-stamp  LT.  The  --time-stamp option does not apply to time-stamps generated by syslog (see
              also the next section);

       o      --usage: (C) Display help information and exit;

       o      --verbosity <value>: determines the amount  of  logged  information.  Requires  options  --log  or
              --syslog. Possible values are:
              0: nothing is logged
              1: (default) mode reports and policy commands
              2: also: ipc commands and actions
              3: also: integrity scan informative messages

       o      --version (-v): (C) Display stealth’s version information and terminate;

       o      policy:  file  specification  of  the  policy  file. If a relative location is specified then this
              location is interpreted relative to the current working directory. Stealth converts this  relative
              specification  to  an  absolute  file location, and an option like --reload will reload the policy
              file from the thus determined absolute file path.

       Only one of the options --daemon, --reload, --resume, --suspend or  --terminate  can  be  specified.  The
       options --reload, --rerun, --resume, --suspend, and --terminate ignore any other options.

       The  following options are still recognized for backward compatibility with stealth pre-3.00 versions and
       will be removed in a future stealth version. They generate error messages suggesting alternatives:

       o      --echo-commands (-e): echo commands to std error when they are processed; use --log instead.

       o      --keep-alive: run as a daemon; use --daemon instead.

       o      --only-stdout: scan report is written to stdout; use --stdout instead.

       o      --quiet (-q): suppresses progress messages written to stderr; use --verbosity 0 instead.

       o      --suppress <uds>: suppresses a currently active stealth process; use --suspend instead.

       The following options were discontinued starting since stealth version 3.00.00:

       o      --debug (option --verbosity or --dry-run could be used instead);

       o      --no-child-processes;

       o      --parse-config-file.

       When specifying long options in policy files initial hyphens should be omitted. Here are some examples:
           %%
           log /tmp/stealth.log
           verbosity 3

EXIT STATUS

       When requesting an IPC command or when starting stealth as a daemon 0 is  returned  if  the  command  was
       successfully completed. Otherwise a non-0 value is returned.

OPEN SSH LINK TO CLIENTS

       Once stealth has started as a foreground or daemon process performing file integrity scans ssh(1) is used
       to connect to the client(s) monitored by stealth. While stealth runs only one ssh(1) connection is opened
       to  each  client. This connection remains active during stealth’s lifetime to minimize the number of sshd
       entries in the client’s log files.

THE POLICY FILE

       The policy file consists of two sections, the second section is optional, and starts  at  a  line  merely
       containing %%.

       The  policy  file’s first section consists of two sets of data: use directives (starting with the keyword
       USE) and commands. Blank lines and information beyond hash-marks (#) are ignored, while  lines  following
       lines  terminating  in backslashes (\) are concatenated (en passant removing these trailing backslashes).
       Leading white space on lines of the policy file is ignored.

       The (optional) second section starts at a line merely  containing  %%.  Following  this  separating  line
       several  long  option  specifications can be entered (see below at section OPTIONS). Options specified on
       the command-line take priority over options specified in the policy file. Although  the  --reload  option
       reloads  the  policy file, it will not change option values originally specified as command-line options.
       This section may contain specifications of the skip-files  and  log  options.   Relative  file  locations
       specified  for  these  options  are interpreted relative to the location of the policy file. E.g., if the
       policy file argument is specified as /root/client/policy then the specification log:  client.log  results
       in stealth writing its logs into the file /root/client/client.log.

DEFINE DIRECTIVES

       DEFINE  directives  are used to associate longer strings of text with certain symbols. E.g., after DEFINE
       FINDARGS -xdev -type f -exec /usr/bin/sha256sum {} \; the specification ${FINDARGS} may be  used  in  USE
       DIRECTIVES and commands (see below) to use the text associated with the FINDARGS symbol.

       Note  that  DEFINE  symbols may also be used in the definition of other DEFINE symbols as well. Direct or
       indirect circular definitions should be avoided, as they are either not or incompletely expanded.

USE DIRECTIVES

       The following USE directives may be specified (directives are written  in  capitals,  and  should  appear
       exactly  as  written below: letter casing is preserved). Specifications in angular brackets (like <this>)
       represent specifications to be provided  by stealth’s users:

       o      USE BASE <base-directory>
              BASE  defines  the  directory  from  where  stealth  operates.  All   subsequent   relative   path
              specifications  in  the policy file (including relative path specifications in the policy’s second
              part) are interpreted relative to BASE. By  default  this  is  the  directory  where  stealth  was
              started.
              BASE and other non-existing paths are created automatically by stealth if not yet existing.
              Example:
              USE BASE /root/client

       o      USE DD <dd>
              The  DD specification uses /bin/dd as default, and defines the location of the dd(1) program, both
              on the server and on the client. The DD program is used to copy files between the client  and  the
              monitor  over the existing ssh-connection. The program specified here is only used by stealth when
              executing PUT and GET commands (described below).
              Example showing the default:
              USE DD /bin/dd

       o      USE DIFF <diff>
              The default DIFF specification uses /usr/bin/diff, and defines the location of the diff(1) program
              on the monitor. The diff(1) program is used to compare a formerly created logfile of an  integrity
              check with a newly created logfile.
              Example showing the default:
              USE DIFF /usr/bin/diff

       o      USE DIFFPREFIX <prefix>
              The  DIFFPREFIX  specification  defines  the size of the prefix added by the DIFF command to lines
              produced by commands executed through stealth.

              The default /usr/bin/diff program prefixes lines by either `> ’ or `< ’.  The  default  value  for
              <prefix> is therefore equal to 2.
              Example showing the default:
              USE DIFFPREFIX 2

       o      USE EMAIL <address>
              The  EMAIL  specification defines the email-address to receive the report of the integrity scan of
              the client. The `dark cockpit’ philosophy is followed here: mail is only sent when a  modification
              is detected.
              Example showing the default (apparently an email address on the monitor):
              USE EMAIL root

       o      USE MAILER <mailer>
              The MAILER specification defines the program that to send e-mail to the EMAIL-address. Contrary to
              DIFF and DD and (see below) SH and SSH, MAILER is run as a /bin/sh command, to allow shell-scripts
              to  process the mail too. By default MAILER is defined as /usr/bin/mail. MAILER is called with the
              following arguments:
              ----------------------------------------------------------
              MAILARGS, see below;
              EMAIL, the addressee of the mail.
              ----------------------------------------------------------
              Example showing the default:
              USE MAILER /usr/bin/mail

              As an alternative, the script stealthmail is provided.  It  offers  a  convenient  filter  sorting
              stealth’s  output  and keeping only lines containing the text ADDED, MODIFIED, REMOVED or STEALTH.
              Usually these lines are the ones system managers are interested in. The report and log  files  can
              always be consulted to determine the actual nature of the changes.

       o      USE MAILARGS <args>
              The  MAILARGS specification defines the arguments that are passed to MAILER, followed by the EMAIL
              specification.
              Example showing the default:
              USE MAILARGS -s "STEALTH scan report"
              Note that blanks may be used in the subject specification: use double or single quotes  to  define
              elements  containing  blanks.  Use \" to use a double quote in a string that itself is delimted by
              double quotes; use \’ to use a single quote in a string that itself is delimted by single quotes.

       o      USE REPORT <file-spec>
              REPORT defines the name of the reportfile. Information is always appended to this  file.  At  each
              stealth integrity scan a time marker line is written to the report file. Only when (in addition to
              the  marker  line) additional information is appended to the report file the added contents of the
              report file are mailed to the mail address specified  in  the  USE  EMAIL  specification.  When  a
              relative  file  specification  is  used  it  is  interpreted  a  location relative to the USE BASE
              specification.
              Example showing the default:
              USE REPORT report

       o      USE SH <sh>
              The SH specification uses /bin/sh as default, and defines the command shell used by the monitor to
              execute commands on itself. This must be an absolute path specification.
              Example showing the default:
              USE SH /bin/sh

       o      USE SSH <user>
              The SSH specification has no default, and must  be  specified.  This  must  be  an  absolute  path
              specification.

              Assuming the client trusts the monitor (which is after all what this program is all about, so this
              should  not  be  a very strong assumption), preferably the public ssh key of the monitor should be
              placed in the client’s root .ssh/authorized_keys file, granting the monitor  root  access  to  the
              client. Root access is normally needed to gain access to all directories and files of the client’s
              file system.

              In  practice,  connecting  to an account using the sh(1) shell is preferred. When another shell is
              already used by that account, one  should  make  sure  that  its  shell  doesn’t  define  its  own
              redirections  for  standard input and standard output. One way to accomplish that is for force the
              execution of /bin/sh in the USE SSH specification.  Examples:
                  # root’s shell is /bin/sh:
                      USE SSH root@client -T -q
                  # root uses another shell, but the use of /bin/bash is forced:
                      USE SSH root@client -T -q exec /bin/bash
                  # an alternative:
                      USE SSH root@client -T -q exec /bin/bash --noprofile

       In some installations stealth is used to inspect the monitor itself, even though this is not recommended,
       as it breaks one of the main reasons for stealth’s existence. But in those situations (so, where  stealth
       is  used  to  monitor  the  integrity  of  the  localhost),  /bin/bash  could be specified at the USE SSH
       directive. For example:
           # For stealth inspecting localhost:
               USE SSH /bin/bash --noprofile

COMMANDS

       Following the USE specifications, commands can be specified. The commands are executed in their order  of
       appearance  in the policy file. Processing continues until the last command has been processed or until a
       tested command (see below) returns a non-zero return value.

LABEL COMMANDS

       The following LABEL commands are available:

       o      LABEL <text>
              This defines a text-label which is written to the REPORT file, in front of the output generated by
              the next CHECK-command. If the next CHECK-command generates  no  output,  the  text-label  is  not
              written to the REPORT-file. Once a LABEL has been defined, it is used until it is redefined by the
              next LABEL. Use an empty LABEL specification to suppress the printing of labels.

              The text may contain \n characters (two characters) which are transformed to a newline character.

              Example:
              LABEL Inspecting files in /etc\nIncluding subdirectories
              LABEL
              (In this example the former LABEL specification is erased by the latter LABEL command).

LOCAL COMMANDS

       LOCAL commands are executed on the monitor itself:

       o      LOCAL <command>
              Execute  command  on the monitor, using the SH command shell. The command must succeed (i.e., must
              return a zero exit value).
              Example:
              LOCAL scp rootsh@client:/usr/bin/sha256sum /tmp
              This command copies the client’s sha256sum(1) program to the monitor.

       o      LOCAL NOTEST <command>
              Execute command on the monitor, using the SH command shell. The command may or may not succeed.
              Example:
              LOCAL NOTEST mkdir /tmp/subdir
              This command creates /tmp/subdir on the monitor. The command fails  if  the  directory  cannot  be
              created, but this does not terminate stealth.

       o      LOCAL CHECK [LOG =] <file-spec> [pathOffset] <command>
              Execute  command  on the monitor, using the SH command shell. The command must succeed. The output
              of this command is compared to the output of this command generated during the previous  integrity
              check run by stealth.

              The  phrase  LOG  =  is  optional. When a relative file location is specified at <file-spec> it is
              interpreted relatively to the USE BASE path specification.

              PathOffset is also optional. If specified it defines the  (0-based)  offset  where  path-names  of
              inspected  files  start  in lines produced by <command>. By default stealth assumes that the first
              occurrence of a forward slash defines the first character of the path-names of inspected files.

              For example, if diff-output looks like this:
                  01234567890123456789012345678901234567890 (column offsets)
                  33c33
                  < 90d8b506d249634c4ff80b9018644567  filename-specification
                  ---
                  > b88d0b77db74cc4a742d7bc26cdd2a1e  filename-specification
              then the specification
                  LOCAL CHECK logfile 36 command-to-be-executed
              informs stealth where to find the filename specifications in the diff-output. Using  the  standard
              /usr/bin/diff  command,  this  offset equals 2 + the offset of the filename-specification found in
              command-to-be-executed.

              Any differences between the previous and current output are written to REPORT. If differences were
              found, the existing logfile name is renamed to logfile.YYMMDD-HHMMSS, with YYMMDD-HHMMSS the (UTC)
              datetime-stamp at the time stealth was run.

              Note that eventually many logfile.YYMMDD-HHMMSS files could be created: It is up to the  monitor’s
              systems manager to decide what to do with old datetime-stamped logfiles.

              The  logfile  specifications  may  use  relative and absolute paths. When relative paths are used,
              these paths are relative to BASE. When the directories implied by the  logfile  specifications  do
              not yet exist, they are created first.

              Example:
              LOCAL CHECK LOG = local/sha256sum sha256sum /tmp/sha256sum
              This command checks the SHA256 sum of the /tmp/sha256sum program. The resulting output is saved at
              BASE/local/sha256sum. The program must succeed (i.e., sha256sum must return a zero exit-value).

       o      LOCAL NOTEST CHECK <logfile>  [pathOffset] <command>
              Execute  command  on  the monitor, using the SH command shell. The command may or may not succeed.
              Otherwise, the command performs exactly like the LOCAL CHECK ... command, discussed above.

              Example:
              LOCAL NOTEST CHECK LOG=local/sha256sum sha256sum /tmp/sha256sum
              This command checks the SHA256 sum of the /tmp/sha256sum program. The resulting output is saved at
              BASE/local/sha256sum. The program must succeed (i.e., sha256sum must return a zero exit-value).

       Note that the scp(1) command can be used to copy files between the client and the monitor, using a  local
       command.  This,  however,  is  discouraged, as a separate ssh(1)-connection is required for each separate
       scp(1)  command.  This  subtlety  was  brought   to   the   author’s   attention   by   Hopko   Meijerink
       (h.meijering@rug.nl).

       To  copy  files  between the client and the monitor, the GET and PUT commands (described below) should be
       used instead, as these commands use the existing ssh(1) connection. In general, LOCAL commands should not
       be used to establish additional ssh(1) connections to a client.

REMOTE COMMANDS

       Remote commands are commands executed on the client using the SSH  shell.  These  commands  are  executed
       using the standard PATH set for the SSH shell. However, it is advised to specify the full pathname to the
       programs  to  be  executed,  to  prevent  ``trojan  approaches’’  where a trojan horse is installed in an
       `earlier’ directory of the PATH-specification than the intended program.

       Two special remote commands are GET and PUT, which can be used to copy files between the client  and  the
       monitor.   Internally,  GET and PUT use the DD specification. If a non-default specification is used, one
       should ensure that the alternate program accepts dd(1)’s if=, of=, bs= and count= options. With  GET  the
       options  bs=,  count= and of= are used, with PUT the options bs=, count= and if= are used. Normally there
       should be no need to alter the default DD specification.

       The GET command may be used as follows:

       o      GET <client-path> <local-path>
              Copy the file indicated by  client-path  at  the  client  to  local-path  at  the  monitor.  Here,
              client-path  must  be  the full path of an existing file on the client, local-path may either be a
              local directory, in which case the client’s file name  is  used,  or  another  file  name  may  be
              specified, in which case the client’s file is copied to the specified local filename. If the local
              file already exists, it is overwritten by the copy-procedure.

              Example:
              GET /usr/bin/sha256sum /tmp
              The  program  /usr/bin/sha256sum,  available  at  the  client,  is  copied  to  the monitor’s /tmp
              directory. If, for whatever reason, copying fails, then stealth terminates.

       o      GET NOTEST <client-path> <local-path>
              Copy the file indicated by client-path  at  the  client  to  local-path  at  the  monitor.  Again,
              client-path  must  be  the full path of an existing file on the client, local-path may either be a
              local directory, in which case the client’s file name  is  used,  or  another  file  name  may  be
              specified, in which case the client’s file is copied to the specified local filename. If the local
              file already exists, it is overwritten by the copy-procedure.

              Example:
              GET NOTEST /usr/bin/sha256sum /tmp
              The  program  /usr/bin/sha256sum,  available  at  the  client,  is  copied  to  the monitor’s /tmp
              directory. Remaining commands in the policy file are executed, even if the copying process  wasn’t
              successful.

       The PUT command may be used as follows:

       o      PUT <local-path> <remote-path>
              Copy  the  file  indicated by local-path at the monitor to remote-path at the client. The argument
              local-path must be the full path of an existing file on the monitor. The argument remote-path must
              be the full path to a file on the client. If the remote file already exists, it is overwritten  by
              PUT.

              Example:
              PUT /tmp/sha256sum /usr/bin/sha256sum
              The   program   /tmp/sha256sum,   available   at   the   monitor,  is  copied  to  the  client  as
              usr/bin/sha256sum. If the copying fails, stealth terminates.

       o      PUT NOTEST <local-path> <remote-path>
              Copy the file indicated by local-path at the monitor to remote-path at the  client.  The  argument
              local-path must be the full path of an existing file on the monitor. The argument remote-path must
              be  the full path to a file on the client. If the remote file already exists, it is overwritten by
              PUT.

              Example:
              PUT NOTEST /tmp/sha256sum /usr/bin/sha256sum
              Copy the file indicated by local-path at the monitor to remote-path at the  client.  The  argument
              local-path must be the full path of an existing file on the monitor. The argument remote-path must
              be  the full path to a file on the client. If the remote file already exists, it is overwritten by
              PUT. Remaining commands in the policy file are  executed,  even  if  the  copying  process  wasn’t
              successful.

       Plain  commands can be executed on the client computer by merely specifying them. Of course, this implies
       that programs on the client which are named, e.g., LABEL, LOCAL or USE, cannot be executed,  since  these
       names  are  interpreted  otherwise  by  stealth.  It’s  unlikely that this restriction presents much of a
       problem....

       The following commands are available for execution on the client:

       o      <command-path>
              Execute command-path on the client using the SSH command shell (it is strongly advised to  specify
              a  full  path  to the command to execute). The command must succeed (i.e., must return a zero exit
              value). However, any output generated by the the command is ignored.
              Example:
              /usr/bin/find /tmp -type f -exec /bin/rm {} \;
              This command removes all ordinary files in and below the client’s /tmp directory.

       o      NOTEST <command-path>
              Execute command-path on the client, using the SSH command  shell.  The  command  may  or  may  not
              succeed.
              Example:
              NOTEST /usr/bin/find /tmp -type f -exec /bin/rm {} \;
              Same as the previous command, but this time the exit value of /usr/bin/find is not interpreted.

       o      CHECK [LOG =] <file-spec>  [pathOffset] <command-path>
              Execute command-path on the client, using the SSH command shell.

              The  phrase  LOG  =  is  optional. When a relative file location is specified at <file-spec> it is
              interpreted relatively to the USE BASE path specification.

              PathOffset is also optional, and has the same meaning as for the LOCAL  CHECK  command,  described
              above.  The  command  must  succeed.  The output of this command is compared to the output of this
              command generated during the previous run of stealth. Any differences are written  to  REPORT.  If
              differences  were  found,  the  existing  logfile  name  is renamed to logfile.YYMMDD-HHMMSS, with
              YYMMDD-HHMMSS the datetime-stamp at the time stealth was run.

              Note that the command is executed on the client, but the logfile is  kept  on  the  monitor.  This
              command represents the core of the method implemented by stealth: there will be no residues of the
              actions performed by stealth on the client computers.

              Several examples (note the use of the backslash as line continuation characters):

              CHECK LOG = remote/ls.root \
              /usr/bin/find / \
              -xdev -perm /6111 -type f -exec /bin/ls -l {} \;

              All  suid/gid/executable files on the same device as the root-directory (/) on the client computer
              are listed with their permissions, owner and size information. The resulting listing is written on
              the file BASE/remote/ls.root.

              CHECK remote/sha256.root \
              /usr/bin/find / \
              -xdev -perm /6111 -type f -exec /usr/bin/sha256sum {} \;

              The SHA256 checksums of all suid/gid/executable files on the same device as the root-directory (/)
              on  the  client  computer  are  determined.   The  resulting  listing  is  written  on  the   file
              BASE/remote/sha256.root.

       o      NOTEST CHECK [LOG =] <file-spec> [pathOffset] <command-path>
              Execute command-path on the client, using the SSH command shell.

              The  phrase  LOG  =  is  optional. When a relative file location is specified at <file-spec> it is
              interpreted relatively to the USE BASE path specification.

              PathOffset is also optional, and has the same meaning as for the LOCAL  CHECK  command,  described
              above.  The  command  may or may not succeed. Otherwise, the program acts identically as the CHECK
              ... command, described above.

              Example:
              NOTEST CHECK LOG = remote/sha256.root \
              /usr/bin/find / \
              -xdev -perm /6111 -type f -exec /usr/bin/sha256sum {} \;

              The SHA256 checksums of all suid/gid/executable files on the same device as the root-directory (/)
              on  the  client  computer  are  determined.   The  resulting  listing  is  written  on  the   file
              BASE/remote/sha256.root.  stealth  does  not  terminate  if  the  /usr/bin/find  program returns a
              non-zero exit value.

       The maximum download size (using GET or CHECK) can be specified using the --max-size option,  see  below.
       By default this size is set at 10M.

REPORT FILE ROTATION

       Since  stealth  only appends information to the report file, the report file’s size may eventually become
       prohibitively large, and log-rotation may be desirable. It is of course possible to issue  a  --terminate
       command,  rotate  the  logfiles,  and  restart stealth, but stealth also offers a facility to temporarily
       suspend integrity scans performed by a stealth daemon process:

       o      Calling stealth with the option --suspend <uds> suspends the daemon’s integrity scans. If  stealth
              is  actually  performing  a  series  of  integrity  scans  when --suspend is issued, the currently
              executing command is first completed after which the --suspend command completes. Once the stealth
              daemon has been suspended, automatic or explicit integrity  scan  requests  are  denied,  and  the
              daemon  can  only  be  instructed  to  resume  its  scanning  tasks (stealth --resume <uds>) or to
              terminate (stealth --terminate <uds>).

       o      Once `stealth --suspend <uds>’ has returned, the report file may safely be rotated  (using,  e.g.,
              logrotate(1)), and a new (empty) report file may optionally be created by the logrotation process.

       o      Once  the  log-rotation  has  been  completed,  the  log-rotation process should issue the command
              `stealth --resume <uds>’. This resumes the activities  of  a  suspended  stealth  daemon  process,
              immediately  performing  the next integrity scan. Following this the stealth daemon is back to its
              original integrity scanning mode.  Here is  an  example  of  logrotate(1)  specification  rotating
              stealth log-files:

              /root/stealth/clienthost/small/report /var/log/stealth/clienthost-small.log {
                  daily
                  rotate 4
                  compress
                  missingok
                  copytruncate
                  sharedscripts
                  prerotate
                      /usr/bin/stealth --suspend /root/stealth/client/small.uds
                  endscript
                  postrotate
                      /usr/bin/stealth --resume /root/stealth/client/small.uds
                  endscript
              }

RELOAD, RERUN AND TERMINATE

       Here is what happens when stealth is run using the third synopsis:

       o      When started as stealth --reload <uds>, the stealth daemon process reloads its policy file and (if
              specified)  --skip-files  specification  file.  Next  the  stealth  daemon process performs a file
              integrity scan using the information in the re-read  policy  and  skip-files  files.  Stealth  can
              reload  the  (modified)  contents  of  the  originally  specified policy- and skip-files names. If
              another policy and/or skip-files files must be used another stealth process must be  started,  for
              which these new filenames are specified.

       o      When  started  as  stealth  --rerun <uds>, the stealth daemon performs another scan (unless it has
              been suspended using stealth --suspend <uds>).

       o      When started as stealth --terminate <uds>, the stealth daemon is terminated.

RSYSLOG FILTERING

       When using rsyslogd(1) property based filters may be used to filter syslog messages and write them  to  a
       file of your choice. E.g., to filter messages starting with the syslog message tag (e.g., STEALTH) use

       :syslogtag, isequal, "STEALTH:"   /var/log/stealth.log
       :syslogtag, isequal, "STEALTH:"   stop

       Note that the colon is part of the tag, but is not specified with the syslog-tag option.

       This  causes  all messages having the STEALTH: tag to be written on /var/log/stealth.log after which they
       are     discarded.     More     extensive     filtering     is     also     supported,     see,     e.g.,
       http://www.rsyslog.com/doc/rsyslog_conf_filter.html and http://www.rsyslog.com/doc/property_replacer.html

       Time  stamps  written by rsyslogd are not controlled by stealth’s --time-stamp option, but, e.g., by a TZ
       specification in /etc/default/rsyslog. Simply add the line
           export TZ=UTC
       to /etc/default/rsyslog, followed by restarting rsyslogd configures  rsyslogd  to  generate  time  stamps
       using UTC.

DEPLOYMENT SUMMARY

       The  following  summarizes  the  advised  steps  to  perform when installing stealth. All these steps are
       elaborated upon in stealth’s User Guide (chapter Running `stealth’):

       o      Install stealth (e.g., use dpkg(1) to install the .deb file);

       o      Construct one or more policy files;

       o      Automate (re)starting stealth using cron(1) or ssh-cron(1) (possibly calling stealthcron);

       o      Set up automated log-file rotation, using, e.g., stealthcleanup and logrotate(1), defining one  or
              more /etc/logrotate.d/stealth... configuration files.

FILES

       /usr/share/doc/stealth/;
       the policy file;
       files under the BASE directory as defined in the policy file;
       the report file as defined by the policy’s USE REPORT directive.

SEE ALSO

       cron(1),  dd(1),  diff(1),  dpkg(1),  find(1),  logrotate(1),  ls(1),  mail(1),  sha256sum(1), passwd(5),
       rsyslog(1), sendmail(1), sh(1), ssh(1), ssh-cron(1)

DIAGNOSTICS

       By default, executed commands are echoed to stderr. Use -q to suppress this echoing.

BUGS

       None reported

COPYRIGHT

       This is free software, distributed under the terms of the `GNU General Public License’. Copyright remains
       with the author. Stealth is found at https://fbb-git.gitlab.io/stealth/.

ORGANIZATION

       University of Groningen.

AUTHOR

           Frank B. Brokken (f.b.brokken@rug.nl).

stealth_4.03.03                                     2005-2022                                         stealth(1)