stealth - Stealthy File Integrity Scanner
`<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
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.
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
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.
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 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 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.
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
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.
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 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 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.
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
}
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.
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.
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.
/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.
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)
By default, executed commands are echoed to stderr. Use -q
to suppress this echoing.
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/.
Center for Information Technology, University of Groningen.
Frank B. Brokken (f.b.brokken@rug.nl).