Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
sec(1)			    General Commands Manual			sec(1)

NAME
       sec - simple event correlator

SYNOPSIS
       sec    [--conf=<file pattern> ...]
	      [--input=<file pattern>[=<context>] ...]
	      [--input-timeout=<input timeout>]
	      [--timeout-script=<timeout script>]
	      [--reopen-timeout=<reopen	timeout>]
	      [--check-timeout=<check timeout>]
	      [--poll-timeout=<poll timeout>]
	      [--socket-timeout=<socket	timeout>]
	      [--blocksize=<io block size>]
	      [--bufsize=<input	buffer size>]
	      [--evstoresize=<event store size>]
	      [--cleantime=<clean time>]
	      [--log=<logfile>]
	      [--syslog=<facility>]
	      [--debug=<debuglevel>]
	      [--pid=<pidfile>]
	      [--dump=<dumpfile>]
	      [--user=<username>]
	      [--group=<groupname> ...]
	      [--umask=<mode>]
	      [--ruleperf | --noruleperf]
	      [--dumpfts | --nodumpfts]
	      [--dumpfjson | --nodumpfjson]
	      [--quoting | --noquoting]
	      [--tail |	--notail]
	      [--fromstart | --nofromstart]
	      [--detach	| --nodetach]
	      [--jointbuf | --nojointbuf]
	      [--keepopen | --nokeepopen]
	      [--rwfifo	| --norwfifo]
	      [--childterm | --nochildterm]
	      [--intevents | --nointevents]
	      [--intcontexts | --nointcontexts]
	      [--testonly | --notestonly]
	      [--help] [-?]
	      [--version]

DESCRIPTION
       SEC  is	an  event correlation tool for advanced	event processing which
       can be harnessed	for event log monitoring,  for	network	 and  security
       management,  for	fraud detection, and for any other task	which involves
       event correlation.  Event correlation is	a procedure where a stream  of
       events  is  processed,  in  order  to detect (and act on) certain event
       groups that occur within	predefined time	 windows.  Unlike  many	 other
       event  correlation  products  which are heavyweight solutions, SEC is a
       lightweight and platform-independent event correlator which runs	 as  a
       single  process.	 The user can start it as a daemon, employ it in shell
       pipelines, execute  it  interactively  in  a  terminal,	run  many  SEC
       processes  simultaneously for different tasks, and use it in a wide va-
       riety of	other ways.

       SEC reads lines from files, named pipes,	or standard input, matches the
       lines with patterns (regular expressions, Perl subroutines, etc.)   for
       recognizing  input events, and correlates events	according to the rules
       in its configuration file(s).  Rules are	matched	against	input  in  the
       order  they  are	 given in the configuration file.  If there are	two or
       more configuration files, rule sequence	from  every  file  is  matched
       against input (unless explicitly	specified otherwise).  SEC can produce
       output  by  executing external programs (e.g., snmptrap(1) or mail(1)),
       by writing to files, by sending data to TCP and UDP based  servers,  by
       calling precompiled Perl	subroutines, etc.

       SEC can be run in various ways. For example, the	following command line
       starts  it  as  a  daemon,  in  order to	monitor	events appended	to the
       /var/log/messages syslog	file with rules	from /etc/sec/syslog.rules:

       /usr/bin/sec --detach --conf=/etc/sec/syslog.rules \
		    --input=/var/log/messages

       Each time /var/log/messages is rotated, a new instance of /var/log/mes-
       sages is	opened and processed from the beginning. The following command
       line runs SEC in	a shell	pipeline, configuring it to process lines from
       standard	input, and to exit when	the /usr/bin/nc	tool closes its	 stan-
       dard output and exits:

       /usr/bin/nc -l 8080 | /usr/bin/sec --notail --input=- \
					  --conf=/etc/sec/my.conf

       Some  SEC  rules	 start event correlation operations, while other rules
       react immediately to input events or system clock. For example, suppose
       that SEC	has been started with the following command line

       /usr/bin/sec --conf=/etc/sec/sshd.rules --input=/var/log/secure

       in order	to monitor the /var/log/secure syslog file  for	 sshd  events.
       Also,  suppose that the /etc/sec/sshd.rules configuration file contains
       the following rule for correlating SSH failed login syslog events:

       type=SingleWithThreshold
       ptype=RegExp
       pattern=sshd\[\d+\]: Failed .+ for (\S+)	from [\d.]+ port \d+ ssh2
       desc=Three SSH login failures within 1m for user	$1
       action=pipe '%s'	/bin/mail -s 'SSH login	alert' root@localhost
       window=60
       thresh=3

       The pattern field of the	rule defines the pattern for recognizing input
       events, while the ptype field defines its  type	(regular  expression).
       Suppose that user risto fails to	log in over SSH	and the	following mes-
       sage is logged to /var/log/secure:

       Dec  16	16:24:59  myserver sshd[13685]:	Failed password	for risto from
       10.12.2.5 port 41063 ssh2

       This input message will match the regular  expression  pattern  of  the
       above  rule,  and the match variable $1 will be set to the string risto
       (see perlre(1) for details).  After a match, SEC	will evaluate the  op-
       eration	description  string given with the desc	field. This is done by
       substituting $1 with its	current	value which  yields  Three  SSH	 login
       failures	 within	 1m  for user risto.  SEC will then check if there al-
       ready exists an event correlation operation identified with this	string
       and triggered by	the same rule.	If the operation  is  not  found,  SEC
       will create a new operation for the user	name risto, and	the occurrence
       time of the input event will be recorded	into the operation.  Note that
       for  event occurrence time SEC always uses the current time as returned
       by the time(2) system call, *not*  the  timestamp  extracted  from  the
       event.

       Suppose	that  after  25	seconds, a similar SSH login failure event for
       the same	user name is observed. In this case, a running operation  will
       be  found for the operation description string Three SSH	login failures
       within 1m for user risto, and the occurrence time of the	 second	 event
       is  recorded into the operation.	 If after 30 seconds a third event for
       the user	name risto is observed,	the operation has processed  3	events
       within  55  seconds.  Since the threshold condition "3 events within 60
       seconds"	(as defined by the thresh and window fields) is	now satisfied,
       SEC will	execute	the action defined with	the action field  --  it  will
       fork a command

       /bin/mail -s 'SSH login alert' root@localhost

       with a pipe connected to	its standard input. Then, SEC writes the oper-
       ation  description  string  Three SSH login failures within 1m for user
       risto (held by the %s special variable) to the standard	input  of  the
       command through the pipe.  In other words, an e-mail warning is sent to
       the local root-user.  Finally, since there are 5	seconds	left until the
       end  of	the  event  correlation	window,	the operation will consume the
       following SSH login failure events for user risto without  any  further
       action, and finish after	5 seconds.

       The above example illustrates that the desc field of a rule defines the
       scope of	event correlation and influences the number of operations cre-
       ated  by	 the  rule. For	example, if we set the desc field to Three SSH
       login failures within 1m, the root-user would be	also alerted on	3  SSH
       login  failure  events for *different* users within 1 minute.  In order
       to avoid	clashes	between	operations started by different	rules,	opera-
       tion ID contains	not only the value set by the desc field, but also the
       rule  file  name	 and the rule number inside the	file.  For example, if
       the rule	file /etc/sec/sshd.rules contains one rule

       type=SingleWithThreshold
       ptype=RegExp
       pattern=sshd\[\d+\]: Failed .+ for (\S+)	from [\d.]+ port \d+ ssh2
       desc=Three SSH login failures within 1m for user	$1
       action=pipe '%s'	/bin/mail -s 'SSH login	alert' root@localhost
       window=60
       thresh=3

       and the event

       Dec 16 16:24:59 myserver	sshd[13685]: Failed password  for  risto  from
       10.12.2.5 port 41063 ssh2

       is the first matching event for the above rule, this event will trigger
       a new event correlation operation with the ID

       /etc/sec/sshd.rules  |  0 | Three SSH login failures within 1m for user
       risto

       (0 is the number	assigned to the	first rule in the file,	see EVENT COR-
       RELATION	OPERATIONS section for more information).

       The  following  simple  example	demonstrates  that  event  correlation
       schemes can be defined by combining several rules. In this example, two
       rules harness contexts and synthetic events for achieving their goal:

       type=SingleWithThreshold
       ptype=RegExp
       pattern=sshd\[\d+\]: Failed .+ for (\S+)	from [\d.]+ port \d+ ssh2
       desc=Three SSH login failures within 1m for user	$1
       action=event 3_SSH_LOGIN_FAILURES_FOR_$1
       window=60
       thresh=3

       type=EventGroup
       ptype=RegExp
       pattern=3_SSH_LOGIN_FAILURES_FOR_(\S+)
       context=!USER_$1_COUNTED	&& !COUNTING_OFF
       count=create USER_$1_COUNTED 60
       desc=Repeated SSH login failures	for 30 distinct	users within 1m
       action=pipe '%s'	/bin/mail -s 'SSH login	alert' root@localhost; \
	      create COUNTING_OFF 3600
       window=60
       thresh=30

       The first rule looks almost identical to	the rule from the previous ex-
       ample, but its action field is different	-- after three SSH login fail-
       ures  have been observed	for the	same user name within one minute by an
       event correlation operation, the	 operation  will  emit	the  synthetic
       event  3_SSH_LOGIN_FAILURES_FOR_<username>.  Although  synthetic	events
       are created by SEC, they	are treated like regular events	received  from
       input sources and are matched against rules.

       The  regular  expression	 pattern  of  the  second  rule	will match the
       3_SSH_LOGIN_FAILURES_FOR_<username> event and start a new event	corre-
       lation  operation  if  no such events have been previously seen.	 Also,
       each time a synthetic event for some user name has matched the rule,  a
       context	with  the  lifetime  of	1 minute for that user name is created
       (see the	count field).  Note that this prevents further matches for the
       same user name, since a synthetic event for <username>  can  match  the
       rule  only  if the context USER_<username>_COUNTED *does	not* exist (as
       requested by the	boolean	expression in the context field; see  CONTEXTS
       AND CONTEXT EXPRESSIONS section for more	information).

       The operation started by	the second rule	sends an e-mail	warning	to the
       local  root-user	 if  30	 synthetic  events have	been observed within 1
       minute (see the thresh and window fields). Note that due	to the use  of
       the USER_<username>_COUNTED contexts, all synthetic events concern dif-
       ferent  user names. After sending an e-mail warning, the	operation will
       also create the context COUNTING_OFF with the lifetime of 1  hour,  and
       will  continue  to  run until the 1 minute event	correlation window ex-
       pires. After the	operation has finished,	the  presence  of  the	COUNT-
       ING_OFF context will keep the second rule disabled (as requested	by the
       boolean expression in the context field). Therefore, at most one	e-mail
       warning per 1 hour is issued by above rules.

       The above examples have presented the event correlation capabilities of
       SEC  in	a  very	brief fashion.	The following sections will provide an
       in-depth	 discussion of SEC features.

OPTIONS
       --conf=<file_pattern>
	      expand <file_pattern> to filenames (with the Perl	 glob()	 func-
	      tion) and	read event correlation rules from every	file. Multiple
	      --conf  options  can be specified	at command line. Each time SEC
	      receives a signal	that forces a configuration reload, <file_pat-
	      tern> is re-evaluated. See also INPUT PROCESSING AND TIMING sec-
	      tion for a discussion on rule processing order for multiple con-
	      figuration files.

       --input=<file_pattern>[=<context>]
	      expand <file_pattern> to filenames (with the Perl	 glob()	 func-
	      tion) and	use the	files as input sources.	An input file can be a
	      regular  file, named pipe, or standard input if -	was specified.
	      Multiple --input options can be specified	at command line.  Each
	      time  SEC	 receives the SIGHUP or	SIGABRT	signal,	<file_pattern>
	      is re-evaluated.	If SEC experiences a system error when reading
	      from an input file, it  will  close  the	file  (use  the	 --re-
	      open-timeout  option  for	 reopening  the	file). If <context> is
	      given, SEC will set up the context <context> each	time it	 reads
	      a	 line from input files that correspond to <file_pattern>. This
	      will help	the user to write rules	that match data	from  particu-
	      lar  input  source(s) only. When there is	an --input option with
	      <context>	specified, it will automatically enable	the  --intcon-
	      texts  option. See INTERNAL EVENTS AND CONTEXTS section for more
	      information.

       --input-timeout=<input_timeout>,	--timeout-script=<timeout_script>
	      if SEC has not observed new data in an input  file  during  <in-
	      put_timeout>  seconds  (or  the  file was	closed <input_timeout>
	      seconds ago), <timeout_script> will  be  executed	 with  command
	      line  parameters	1  and	<the name of the input file>. If fresh
	      data become available again, <timeout_script> will  be  executed
	      with command line	parameters 0 and <the name of the input	file>.
	      Setting  <input_timeout>	to  0  disables	this behavior (this is
	      also  the	 default).   Note  that	 --input_timeout  and  --time-
	      out_script  options  can be used as synonyms for --input-timeout
	      and --timeout-script, respectively.

       --reopen-timeout=<reopen_timeout>
	      if an input file is in the closed	state (e.g., SEC fails to open
	      the file at startup, because it has not been created  yet),  SEC
	      will  attempt  to	 reopen	 the file after	every <reopen_timeout>
	      seconds until open succeeds.  Setting <reopen_timeout> to	0 dis-
	      ables this behavior (this	is also	the default).  This option has
	      no meaning when the --notail option  is  also  specified.	  Note
	      that --reopen_timeout is a synonym for --reopen-timeout.

       --check-timeout=<check_timeout>
	      if SEC has not observed new data in an input file, the file will
	      not  be  polled  (both  for  status  and	data)  during the next
	      <check_timeout> seconds.	Setting	<check_timeout>	to 0  disables
	      this   behavior	(this	is   also  the	default).   Note  that
	      --check_timeout is a synonym for --check-timeout.

       --poll-timeout=<poll_timeout>
	      a	real number that specifies how many  seconds  SEC  will	 sleep
	      when no new data were read from input files. Default is 0.1 sec-
	      onds.  Note that --poll_timeout is a synonym for --poll-timeout.

       --socket-timeout=<socket_timeout>
	      if  a  network  connection to a remote peer can't	be established
	      within <socket_timeout> seconds, give up.	Default	is 60 seconds.
	      Note that	--socket_timeout is a synonym for --socket-timeout.

       --blocksize=<io_block_size>
	      the number of bytes SEC will attempt to read at once from	an in-
	      put file.	 Default is 8192 bytes (i.e., read from	input files by
	      8KB blocks).

       --bufsize=<input_buffer_size>
	      set all input buffers to hold  <input_buffer_size>  lines.   The
	      content of input buffers will be compared	with patterns that are
	      part of rule definitions (i.e., no more than <input_buffer_size>
	      lines  can  be  matched  by  a  pattern  at  a  time).   If <in-
	      put_buffer_size> is set to 0,  SEC  will	determine  the	proper
	      value  for  <input_buffer_size>  by checking event matching pat-
	      terns of all SEC rules.  Default is 0 (i.e., determine the  size
	      of input buffers automatically).

       --evstoresize=<event_store_size>
	      set  an  upper  limit  to	 the number of events in context event
	      stores.  Default is 0 which sets no limit.

       --cleantime=<clean_time>
	      time interval in seconds that specifies how often	internal event
	      correlation and context lists are	processed, in order to	accom-
	      plish  time-related  tasks  and to remove	obsolete elements. See
	      INPUT PROCESSING AND TIMING section for more  information.   De-
	      fault is 1 second.

       --log=<logfile>
	      use  <logfile>  for logging SEC activities. Note that if the SEC
	      standard error is	connected to a terminal, messages will also be
	      logged there, in order to	facilitate debugging.

       --syslog=<facility>
	      use syslog for logging SEC  activities.  All  messages  will  be
	      logged with the facility <facility>, e.g., local0	(see syslog(3)
	      for  possible  facility  values).	Warning: be careful with using
	      this option if SEC is employed for monitoring syslog log	files,
	      because message loops might occur.

       --debug=<debuglevel>
	      set  logging  verbosity  for  SEC.  Setting debuglevel to	<debu-
	      glevel> means that all messages of level <debuglevel> and	 lower
	      are logged (e.g.,	if <debuglevel>	is 3, messages from levels 1-3
	      are logged). The following levels	are recognized by SEC:
	      1	 -  critical  messages (severe faults that cause SEC to	termi-
	      nate, e.g., a failed system call)
	      2	- error	messages (faults that need attention, e.g., an	incor-
	      rect rule	definition in a	configuration file)
	      3	 -  warning  messages (possible	faults,	e.g., a	command	forked
	      from SEC terminated with a non-zero exit code)
	      4	- notification messages	(normal	system level events and	inter-
	      rupts, e.g., the reception of a signal)
	      5	- informative messages (information  about  external  programs
	      forked from SEC)
	      6	 -  debug messages (detailed information about all SEC activi-
	      ties)
	      Default <debuglevel> is 6	(i.e., log  everything).  See  SIGNALS
	      section  for  information	 on how	to change <debuglevel> at run-
	      time.

       --pid=<pidfile>
	      SEC will store its process ID to <pidfile> at startup.

       --dump=<dumpfile>
	      SEC will use <dumpfile> as its dump file for writing performance
	      and debug	data. With the --dumpfts option, a timestamp suffix is
	      appended to the dump file	name.  With  the  --dumpfjson  option,
	      dump  file  is produced in JSON format.  See SIGNALS section for
	      more information.	Default	is /tmp/sec.dump.

       --user=<username>, --group=<groupname>
	      if SEC is	started	with effective user ID 0, it  will  drop  root
	      privileges  by  switching	 to  user <username> and group <group-
	      name>.  The --group option can't be used without the --user  op-
	      tion.  If	 the  --user  option is	given without --group, primary
	      group of the user	<username> is  assumed	for  <groupname>.   If
	      several  groups  are provided with multiple --group options, SEC
	      switches to the first group with other groups  as	 supplementary
	      groups.

       --umask=<mode>
	      set  file	 mode  creation	 mask  to <mode> at SEC	startup, where
	      <mode> is	a value	from the range 0..0777	(see  also  umask(2)).
	      Octal,  decimal, hexadecimal, and	binary values can be specified
	      for <mode> (e.g.,	octal mask 0027	can also be expressed  as  23,
	      0x17, and	0b000010111).

       --ruleperf, --noruleperf
	      if  the  --ruleperf option is specified, performance data	(e.g.,
	      total consumed CPU time) is collected for	each rule and reported
	      in dump file. Default is --noruleperf.

       --dumpfts, --nodumpfts
	      if the --dumpfts option is specified, a timestamp	 suffix	 (sec-
	      onds  since  Epoch)  is  appended	to the dump file name that re-
	      flects the file creation time. Default is	--nodumpfts.

       --dumpfjson, --nodumpfjson
	      if the --dumpfjson option	is specified, dump file	is produced in
	      JSON format.  Default is --nodumpfjson.

       --quoting, --noquoting
	      if the --quoting	option	is  specified,	operation  description
	      strings  that  are supplied to command lines of shellcmd,	spawn,
	      and cspawn actions will be put inside single quotes. Each	single
	      quote (')	that strings originally	contain	will be	 masked.  This
	      option prevents the shell	from interpreting special symbols that
	      operation	 description  strings might contain.  Default is --no-
	      quoting.

       --tail, --notail
	      if the --notail option is	specified, SEC will process  all  data
	      that  are	 currently  available  in  input  files	and exit after
	      reaching all EOFs.  If all input is received from	a pipe and the
	      --notail option is given,	SEC terminates when  the  last	writer
	      closes  the  pipe	 (EOF  condition). Please note that with named
	      pipes --notail should be used with --norwfifo.  With the	--tail
	      option, SEC will jump to the end of input	files and wait for new
	      lines  to	 arrive.   Each	input file is tracked both by its name
	      and i-node, and input file rotations are handled seamlessly.  If
	      the input	file is	recreated or truncated,	SEC will reopen	it and
	      process its content from the beginning. If the input file	is re-
	      moved (i.e., there is just an i-node left	without	a  name),  SEC
	      will  keep  the  i-node  open and	wait for the input file	recre-
	      ation.  Default is --tail.

       --fromstart, --nofromstart
	      these flags have no meaning when the  --notail  option  is  also
	      specified. When used in combination with --tail (or alone, since
	      --tail  is  enabled  by  default), --fromstart will force	SEC to
	      read and process input files from	the beginning to the end,  be-
	      fore the 'tail' mode is entered. Default is --nofromstart.

       --detach, --nodetach
	      if  the  --detach	option is specified, SEC will disassociate it-
	      self from	the  controlling  terminal  and	 become	 a  daemon  at
	      startup  (note  that SEC will close its standard input, standard
	      output, and standard error, and change its working directory  to
	      the root directory). Default is --nodetach.

       --jointbuf, --nojointbuf
	      if  the  --jointbuf  option  is  specified, SEC uses joint input
	      buffer for all input sources (the	size of	the buffer is set with
	      the --bufsize option). The --nojointbuf option creates  a	 sepa-
	      rate input buffer	for each input file, and a separate buffer for
	      all  synthetic and internal events (the sizes of all buffers are
	      set with the --bufsize option).  The  --jointbuf	option	allows
	      multiline	 patterns  to  match lines from	several	input sources,
	      while the	--nojointbuf pattern restricts the matching  to	 lines
	      from  one	 input	source	only.  See INPUT PROCESSING AND	TIMING
	      section for more information.  If	the size of input buffer(s) is
	      1	(either	explicitly set with --bufsize=1	or  automatically  de-
	      termined	from  SEC rules), --jointbuf option is enabled,	other-
	      wise the default is --nojointbuf.

       --keepopen, --nokeepopen
	      if the --keepopen	option is specified, SEC will keep input files
	      open across soft restarts.  When the SIGABRT signal is received,
	      SEC will not reopen input	files which have  been	opened	previ-
	      ously,  but  will	 only open input files which are in the	closed
	      state.  The --nokeepopen option forces SEC to close and (re)open
	      all input	files during soft restarts.  Default is	--keepopen.

       --rwfifo, --norwfifo
	      if the --norwfifo	option is specified, named  pipe  input	 files
	      are  opened in read-only mode.  In this mode, the	named pipe has
	      to be reopened when the last writer closes the pipe, in order to
	      clear the	EOF condition on the pipe. With	the  --rwfifo  option,
	      named  pipe  input files are opened in read-write	mode, although
	      SEC never	writes to the pipes. In	this mode, the pipe  does  not
	      need  to	be  reopened  when an external writer closes it, since
	      there is always at least one writer on the  pipe	and  EOF  will
	      never  appear. Therefore,	if the --notail	option has been	given,
	      --norwfifo should	also be	specified.  Default is --rwfifo.

       --childterm, --nochildterm
	      if the --childterm  option  is  specified,  SEC  will  send  the
	      SIGTERM  signal to all its child processes when it terminates or
	      goes through a full restart. Default is --childterm.

       --intevents, --nointevents
	      SEC will generate	internal events	when it	starts up, when	it re-
	      ceives certain signals, and when it terminates gracefully.  Spe-
	      cific  rules  can	 be written to match those internal events, in
	      order to accomplish special tasks	at SEC startup,	 restart,  and
	      shutdown.	 See INTERNAL EVENTS AND CONTEXTS section for more in-
	      formation. Default is --nointevents.

       --intcontexts, --nointcontexts
	      SEC will create an internal context when it reads	a line from an
	      input  file.   This will help the	user to	write rules that match
	      data from	particular input source	only. See INTERNAL EVENTS  AND
	      CONTEXTS	section	 for more information.	Default	is --nointcon-
	      texts.

       --testonly, --notestonly
	      if the --testonly	option is specified, SEC will exit immediately
	      after parsing the	configuration file(s).	If  the	 configuration
	      file(s)  contained no faulty rules, SEC will exit	with 0,	other-
	      wise with	1. Default is --notestonly.

       --help, -?
	      SEC will output usage information	and exit.

       --version
	      SEC will output version information and exit.

       Note that options can be	introduced both	with the single	dash  (-)  and
       double  dash  (--),  and	 both the equal	sign (=) and whitespace	can be
       used for	separating the option name from	the option value. For example,
       -conf=<file_pattern> and	--conf <file_pattern> options are equivalent.

CONFIGURATION FILES
       Each SEC	configuration file consists of rule definitions	which are sep-
       arated by empty lines, whitespace lines	and/or	comment	 lines.	  Each
       rule definition consists	of keyword=value fields, one keyword and value
       per  line. Values are case insensitive only where character case	is not
       important (like the values specifying rule types,  e.g.,	 'Single'  and
       'single'	 are treated identically).  The	backslash character (\)	may be
       used at the end of a line to continue the current  rule	field  in  the
       next  line.   Lines which begin with the	number sign (#)	are treated as
       comments	and ignored (whitespace	characters may precede #). Any comment
       line, empty line, whitespace line, or end of file  will	terminate  the
       preceding  rule	definition.   For inserting comments into rule defini-
       tions, the rem keyword can be used. For example,	 the  following	 lines
       define two rules:

       type=Single
       rem=this	rule matches any line which contains \
	   three consecutive A characters and writes the string	\
	   "three A characters were observed" to standard output
       ptype=SubStr
       pattern=AAA
       desc=Three A characters
       action=write - three A characters were observed
       # This comment line ends	preceding rule definition.
       # The following rule works like the previous rule,
       # but looks for three consecutive B characters and
       # writes	the string "three B characters were observed"
       # to standard output
       type=Single
       ptype=SubStr
       pattern=BBB
       desc=Three B characters
       action=write - three B characters were observed

       Apart  from  keywords that are part of rule definitions,	label keywords
       may appear anywhere in the configuration	file. The value	of each	 label
       keyword will be treated as a label that can be referred to in rule def-
       initions	as a point-of-continue.	 This allows for continuing event pro-
       cessing	at  a  rule that follows the label, after the current rule has
       matched and processed the event.

       The points-of-continue are defined with continue* fields. Accepted val-
       ues for these fields are:

       TakeNext
	      after an event has matched the rule, search for  matching	 rules
	      in the configuration file	will continue from the next rule.

       GoTo <label>
	      after  an	 event has matched the rule, search for	matching rules
	      will continue from the location of <label> in the	 configuration
	      file (<label> must be defined with the label keyword anywhere in
	      the configuration	file *after* the current rule definition).

       DontCont	(default value)
	      after  an	 event has matched the rule, search for	matching rules
	      ends in the *current* configuration file.

       EndMatch
	      after an event has matched the rule, search for  matching	 rules
	      ends for *all* configuration files.

       SEC rules from the same configuration file are matched against input in
       the  order  they	 have been given in the	file.  For example, consider a
       configuration file which	contains the following rule sequence:

       type=Single
       ptype=SubStr
       pattern=AAA
       rem=after this rule has matched,	continue from last rule
       continue=GoTo lastRule
       desc=Three A characters
       action=write - three A characters were observed

       type=Single
       ptype=SubStr
       pattern=BBB
       rem=after this rule has matched,	don't consider following rules,	\
	   since 'continue' defaults to	'DontCont'
       desc=Three B characters
       action=write - three B characters were observed

       type=Single
       ptype=SubStr
       pattern=CCC
       rem=after this rule has matched,	continue from next rule
       continue=TakeNext
       desc=Three C characters
       action=write - three C characters were observed

       label=lastRule

       type=Single
       ptype=SubStr
       pattern=DDD
       desc=Three D characters
       action=write - three D characters were observed

       For the input line "AAABBBCCCDDD", this ruleset writes strings "three A
       characters were observed" and "three D  characters  were	 observed"  to
       standard	 output. If the	input line is "BBBCCCDDD", the string "three B
       characters were observed" is written to standard	output.	 For the input
       line "CCCDDD", strings "three C characters were observed" and "three  D
       characters  were	observed" are sent to standard output, while the input
       line "DDD" produces the output string  "three  D	 characters  were  ob-
       served".

       If  there are two or more configuration files, rule sequence from every
       file is matched against input (unless explicitly	specified  otherwise).
       For example, suppose SEC	is started with	the command line

       /usr/bin/sec --input=- \
		    --conf=/etc/sec/sec1.rules --conf=/etc/sec/sec2.rules

       and  the	 configuration file /etc/sec/sec1.rules	has the	following con-
       tent:

       type=Single
       ptype=SubStr
       pattern=AAA
       desc=Three A characters
       action=write - three A characters were observed

       type=Single
       ptype=SubStr
       pattern=BBB
       continue=EndMatch
       desc=Three B characters
       action=write - three B characters were observed

       Also, suppose the  configuration	file /etc/sec/sec2.rules has the  fol-
       lowing content:

       type=Single
       ptype=SubStr
       pattern=CCC
       desc=Three C characters
       action=write - three C characters were observed

       If  SEC	receives  the line "AAABBBCCC" from standard input, rules from
       both configuration files	are tried, and as a result, the	strings	"three
       A characters were observed" and "three C	characters were	observed"  are
       written	to  standard  output. Note that	rules from /etc/sec/sec1.rules
       are  tried  first  against   the	  input	  line,	  since	  the	option
       --conf=/etc/sec/sec1.rules  is  given before --conf=/etc/sec/sec2.rules
       in the SEC command line (see also INPUT PROCESSING AND  TIMING  section
       for  a  more  detailed  discussion).  If	SEC receives the line "BBBCCC"
       from standard input, the	second rule from /etc/sec/sec1.rules  produces
       a  match,  and the string "three	B characters were observed" is written
       to standard output.  Since the rule contains  continue=EndMatch	state-
       ment,  the  search  for	matching  rules	will end for all configuration
       files, and rules	from /etc/sec/sec2.rules will not be not tried.	 With-
       out  this  statement,  the  search for matching rules would continue in
       /etc/sec/sec2.rules, and	the first rule would write the string "three C
       characters were observed" to standard output.

PATTERNS, PATTERN TYPES	AND MATCH VARIABLES
       Patterns	and pattern types are defined with pattern*  and  ptype*  rule
       fields.	Many pattern types define the number of	lines N	which the pat-
       tern  matches  (if N is omitted,	1 is assumed). If N is greater than 1,
       the scope of matching is	set with the --jointbuf	and  --nojointbuf  op-
       tions.	With --jointbuf, the pattern is	used for matching N last input
       lines taken from	the joint input	buffer (the lines can come  from  dif-
       ferent input sources).  With --nojointbuf, the source of	the last input
       line  is	identified, and	the pattern is matched with N last input lines
       from the	input buffer of	the identified source.

       SubStr[N]
	      pattern is a string that is searched in the last N  input	 lines
	      L1,  L2,	...,  LN.  If N	is greater than	1, the input lines are
	      joined into a string "L1<NEWLINE>L2<NEWLINE>...<NEWLINE>LN", and
	      the pattern string will be searched from	it.   If  the  pattern
	      string  is  found	 in input line(s), the pattern matches.	 Back-
	      slash sequences \t, \n, \r, \s, and \0 can be used in  the  pat-
	      tern  for	 denoting  tabulation, newline,	carriage return, space
	      character, and empty  string,  respectively,  while  \\  denotes
	      backslash	 itself.   For example,	consider the following pattern
	      definition:

	      ptype=substr
	      pattern=Backup done:\tsuccess

	      The pattern matches lines	containing "Backup done:<TAB>success".

	      Note that	since the SubStr[N] pattern type has been designed for
	      fast matching, it	does not support match variables.

       RegExp[N]
	      pattern is a Perl	regular	expression (see	perlre(1) for more in-
	      formation) for matching the last N input lines L1, L2, ...,  LN.
	      If N is greater than 1, the input	lines are joined into a	string
	      "L1<NEWLINE>L2<NEWLINE>...<NEWLINE>LN",  and the regular expres-
	      sion is matched with this	string.	  If  the  regular  expression
	      matches,	match variables	will be	set, and these match variables
	      can be used in other parts of the	rule definition.

	      In addition to numbered match variables ($1, $2, etc.), SEC sup-
	      ports named match	variables $+{name} and the $0 variable.	The $0
	      variable holds the entire	string of last N input lines that  the
	      regular  expression  has	matched.  Named	match variables	can be
	      created in newer versions	of Perl	regular	 expression  language,
	      e.g., (?<myvar>AB|CD) sets $+{myvar} to AB or CD.	Also, SEC cre-
	      ates special named match variables $+{_inputsrc} and $+{_intcon-
	      text}. The $+{_inputsrc} variable	holds input file name(s) where
	      matching	line(s)	 came from. The	$+{_intcontext}	variable holds
	      the name of current internal context (see	 INTERNAL  EVENTS  AND
	      CONTEXTS	section	for more information). If internal context has
	      not been set up for the current input source,  the  variable  is
	      set to Perl undefined value.

	      For  example,  the following pattern matches the SSH "Connection
	      from" event, and sets $0 to the entire event line, both  $1  and
	      $+{ip}  to the IP	address	of the remote node, and	$2 to the port
	      number at	the remote node:

	      ptype=RegExp
	      pattern=sshd\[\d+\]: Connection from (?<ip>[\d.]+) port (\d+)

	      If the matching event comes from	input  file  /var/log/messages
	      with  internal  context  MSGS, the $+{_inputsrc} and $+{_intcon-
	      text} variables  are  set	 to  strings  "/var/log/messages"  and
	      "MSGS", respectively.

	      Also, SEC	allows for match caching and for the creation of addi-
	      tional named match variables through variable maps which are de-
	      fined  with  the	varmap*	 fields.  Variable  map	 is  a list of
	      name=number mappings separated by	semicolons, where name is  the
	      name  for	 the  named  variable and number identifies a numbered
	      match variable that is set by the	regular	expression.  Each name
	      must begin with a	letter and consist of letters, digits and  un-
	      derscores. After the regular expression has matched, named vari-
	      ables  specified	by the map are created from corresponding num-
	      bered variables. If the same named variable is set up both  from
	      the  regular  expression	and variable map, the map takes	prece-
	      dence.

	      If name is not followed by the equal  sign  and  number  in  the
	      varmap*  field,  it  is  regarded	as a common name for all match
	      variables	and their values from a	successful match.   This  name
	      is  used	for caching a successful match by the pattern -- match
	      variables	and their values are stored in the  memory-based  pat-
	      tern match cache under name.  Cached match results can be	reused
	      by Cached	and NCached patterns. Note that	before processing each
	      new  input  line,	previous content of the	pattern	match cache is
	      cleared. Also note that a	successful  pattern  match  is	cached
	      even  if	the  subsequent	 context  expression evaluation	yields
	      FALSE (see INPUT PROCESSING AND TIMING section for more informa-
	      tion).

	      For example, consider the	following pattern definition:

	      ptype=regexp
	      pattern=(?i)(\S+\.mydomain).*printer: toner\/ink low
	      varmap=printer_toner_or_ink_low; message=0; hostname=1

	      The pattern matches "printer: toner/ink low" messages in a  case
	      insensitive  manner  from	 printers belonging to .mydomain. Note
	      that the printer hostname	is assigned to	$1  and	 $+{hostname},
	      while  the whole message line is assigned	to $0 and $+{message}.
	      If the message comes from	file /var/log/test which does not have
	      an internal context defined, the $+{_inputsrc} variable  is  set
	      to  string "/var/log/test", while	$+{_intcontext}	is set to Perl
	      undefined	value.	Also, these variables  and  their  values  are
	      stored   to   the	  pattern   match   cache   under   the	  name
	      "printer_toner_or_ink_low".

	      The following pattern definition produces	a match	 if  the  last
	      two input	lines are AAA and BBB:

	      ptype=regexp2
	      pattern=^AAA\nBBB$
	      varmap=aaa_bbb

	      Note  that with the --nojointbuf option the pattern only matches
	      if the matching lines are	coming from  the  *same*  input	 file,
	      while the	--jointbuf option lifts	that restriction.

	      In  the case of a	match, $0 is set to "AAA<NEWLINE>BBB", $+{_in-
	      putsrc} to file name(s) for matching lines, and  $+{_intcontext}
	      to  the name of current internal context.	 Also, these variable-
	      value pairs are cached under the name "aaa_bbb".

       PerlFunc[N]
	      pattern is a Perl	function for matching the last N  input	 lines
	      L1,  L2,	...,  LN. The Perl function is compiled	at SEC startup
	      with the Perl eval() function, and eval()	 must  return  a  code
	      reference	for the	pattern	to be valid (see also PERL INTEGRATION
	      section).	 The function is called	in Perl	list context, and with
	      the  --jointbuf  option,	lines L1, L2, ..., LN and the names of
	      corresponding input files	F1, F2,	...,  FN  are  passed  to  the
	      function as parameters:

	      function(L1, L2, ..., LN,	F1, F2,	..., FN)

	      Note  that  with the --nojointbuf	option,	the function is	called
	      with a single file name parameter	F, since lines L1, ...,	LN are
	      coming from the same input file:

	      function(L1, L2, ..., LN,	F)

	      Also note	that if	the input line is a synthetic event, the input
	      file name	is Perl	undefined value.

	      If the function returns several values or	a single value that is
	      true in Perl boolean context, the	pattern	matches. If the	 func-
	      tion  returns  no	values or a single value that is false in Perl
	      boolean context (0, empty	string or undefined value),  the  pat-
	      tern  does not match. If the pattern matches, return values will
	      be assigned to numbered match variables ($1,  $2,	 etc.).	  Like
	      with  RegExp  patterns, the $0 variable is set to	matching input
	      line(s),	the  $+{_inputsrc}  variable  is  set  to  input  file
	      name(s), the $+{_intcontext} variable is set to the name of cur-
	      rent  internal context, and named	match variables	can be created
	      from variable maps.  For example,	consider the following pattern
	      definition:

	      ptype=perlfunc2
	      pattern=sub { return ($_[0] cmp $_[1]); }

	      The pattern compares last	two input lines	in a stringwise	manner
	      ($_[1] holds the last line and $_[0]  the	 preceding  one),  and
	      matches  if the lines are	different. Note	that the result	of the
	      comparison is assigned to	$1, while two matching lines are  con-
	      catenated	(with the newline character between them) and assigned
	      to  $0.	If  matching lines come	from input file	/var/log/mylog
	      with internal context TEST, the  $+{_inputsrc}  and  $+{_intcon-
	      text}  variables are set to strings "/var/log/mylog" and "TEST",
	      respectively.

	      The following pattern produces a match for any  line,  and  sets
	      $1,  $2  and $3 variables	to strings "abc", "def"	and "ghi", re-
	      spectively (also,	$0 is set to the whole input line,  $+{_input-
	      src}  to the input file name, and	$+{_intcontext}	to the name of
	      internal context associated with input file $+{_inputsrc}):

	      ptype=perlfunc
	      pattern=sub { return ("abc", "def", "ghi"); }

	      The following pattern definition produces	a match	if  the	 input
	      line  is	not  a	synthetic event	and contains either the	string
	      "abc" or "def". The $0 variable is set to	the matching line.  If
	      matching	line comes from	/var/log/test without an internal con-
	      text, $+{_intcontext} is set to Perl undefined value, while  $1,
	      $+{file} and $+{_inputsrc} are set to string "/var/log/test":

	      ptype=perlfunc
	      pattern=sub { if (defined($_[1]) && $_[0]	=~ /abc|def/) \
	      {	return $_[1]; }	return 0; }
	      varmap= file=1

	      Finally, if a function pattern returns a single value which is a
	      reference	to a Perl hash,	named match variables are created from
	      key-value	 pairs in the hash. For	example, the following pattern
	      matches a	line if	it  contains  either  the  string  "three"  or
	      "four".  Apart  from  setting  $0, $+{_inputsrc} and $+{_intcon-
	      text}, the pattern also creates match  variables	$+{three}  and
	      $+{four},	and sets them to 3 and 4, respectively:

	      ptype=perlfunc
	      pattern=sub { my(%hash); \
	      if ($_[0]	!~ /three|four/) { return 0; } \
	      $hash{"three"} = 3; $hash{"four"}	= 4; return \%hash; }

       Cached pattern  is  a  name that	is searched in the pattern match cache
	      (entries are stored into the cache with the varmap* fields).  If
	      an  entry	with the given name is found in	the cache, the pattern
	      matches, and match variables and values are retrieved  from  the
	      cache.   For  example,  if  the input line matches the following
	      pattern

	      ptype=perlfunc
	      pattern=sub { if (defined($_[1]) && $_[0]	=~ /abc|def/) \
	      {	return $_[1]; }	return 0; }
	      varmap=abc_or_def_found; file=1

	      then the entry "abc_or_def_found"	 is  created  in  the  pattern
	      match cache.  Therefore, the pattern

	      ptype=cached
	      pattern=abc_or_def_found

	      will  also  produce a match for this input line, and set the $0,
	      $1, $+{file}, $+{_inputsrc}, and	$+{_intcontext}	 variables  to
	      values from the previous match.

       NSubStr[N]
	      like  SubStr[N], except that the result of the match is negated.
	      Note that	this pattern type does not support match variables.

       NRegExp[N]
	      like RegExp[N], except that the result of	the match  is  negated
	      and  variable  maps  are not supported. Note that	the only match
	      variables	supported by this pattern type are $0,	$+{_inputsrc},
	      and $+{_intcontext}.

       NPerlFunc[N]
	      like PerlFunc[N],	except that the	result of the match is negated
	      and  variable  maps  are not supported. Note that	the only match
	      variables	supported by this pattern type are $0,	$+{_inputsrc},
	      and $+{_intcontext}.

       NCached
	      like  Cached,  except  that  the result of the match is negated.
	      Note that	this pattern type does not support match variables.

       TValue pattern is a truth value,	with TRUE and FALSE  being  legitimate
	      values.	TRUE  always  matches an input line, while FALSE never
	      matches anything.	 Note that this	pattern	type does not  support
	      match variables.

       When match variables are	substituted, each "$$" sequence	is interpreted
       as  a literal dollar sign ($) which allows for masking match variables.
       For example, the	string "Received $$1" becomes "Received	$1" after sub-
       stitution,     while	"Received     $$$1"	becomes	     "Received
       $<value_of_1st_var>".   In  order  to disambiguate numbered match vari-
       ables from the following	text, variable	number	must  be  enclosed  in
       braces.	For  example,  the  string  "Received ${1}0" becomes "Received
       <value_of_1st_var>0" after substitution,	 while	the  string  "Received
       $10" would become "Received <value_of_10th_var>".

       If  the	match  variable	 was not set by	the pattern, it	is substituted
       with an empty string (i.e., a zero-width	string).  Thus the string "Re-
       ceived $10!" becomes "Received !" after substitution if the pattern did
       not set $10.  (Note that	prior to SEC-2.6, unset	variables  were	 *not*
       substituted.)

       In  the	current	version	of SEC,	names of $+{name} match	variables must
       comply with the following naming	convention -- the first	character  can
       be  a  letter or	underscore, while remaining characters can be letters,
       digits, underscores and exclamation marks (!).  However,	 when  setting
       named  match  variables	from a pattern,	it is recommended to begin the
       variable	name with a letter, since names	of special automatically  cre-
       ated variables begin with an underscore (e.g., $+{_inputsrc}).

       After  the  pattern  has	matched	an event and match variables have been
       set, it is also possible	to refer to previously cached match  variables
       with  the  syntax $:{entryname:varname},	where entryname	is the name of
       the pattern match cache entry, and varname is the name of the  variable
       stored  under  the entry.  For example, if the variable $+{ip} has been
       previously cached  under	 the  entry  "SSH",  it	 can  be  referred  as
       $:{SSH:ip}.   For  the reasons of efficiency, the $:{entryname:varname}
       syntax is not supported for fast	pattern	types which do not  set	 match
       variables (i.e.,	SubStr,	NSubStr, NCached and TValue).

       Note  that since	Pair and PairWithWindow	rules have two patterns, match
       variables of the	first pattern are shadowed for some rule  fields  when
       the  second  pattern  matches  and sets variables. In order to refer to
       shadowed	variables, their names must begin with % instead of  $	(e.g.,
       %1  refers to match variable $1 set by the first	pattern). However, the
       use of the %-prefix is only valid under the following circumstances  --
       *both*  pattern	types  support match variables *and* in	the given rule
       field match variables from *both* patterns can be used.

       The %-prefixed match variables are masked with the "%%" sequence	 (like
       regular	match  variables with "$$"). Similarly,	the braces can be used
       for disambiguating the %-prefixed variables from	the following text.

       Finally,	note that the second pattern of	Pair and PairWithWindow	 rules
       may  contain  match  variables if the second pattern is of type SubStr,
       NSubStr,	Regexp,	or NRegExp. The	variables are substituted  at  runtime
       with  the  values set by	the first pattern. If the pattern is a regular
       expression, all special characters inside substituted values are	masked
       with the	Perl quotemeta() function and the final	expression is  checked
       for correctness.

CONTEXTS AND CONTEXT EXPRESSIONS
       A  SEC  context is a memory based entity	which has one or more names, a
       lifetime, and an	event store. Also, an action list can be set up	for  a
       context which is	executed immediately before the	context	expires.

       For  example,  the  action  create  MYCONTEXT  3600  (report  MYCONTEXT
       /bin/mail root@localhost) creates the context  MYCONTEXT	 which	has  a
       lifetime	 of 3600 seconds and empty event store.	 Also, immediately be-
       fore MYCONTEXT expires and is dropped from memory,  the	action	report
       MYCONTEXT  /bin/mail  root@localhost  is	executed which mails the event
       store of	MYCONTEXT to root@localhost.

       Contexts	can be used for	event aggregation and reporting.  Suppose  the
       following actions are executed in this order:

       create MYCONTEXT
       add MYCONTEXT This is a test
       alias MYCONTEXT MYALIAS
       add MYALIAS This	is another test
       report MYCONTEXT	/bin/mail root@localhost
       delete MYALIAS

       The  first  action creates the context MYCONTEXT	with infinite lifetime
       and empty event store. The second action	appends	the string "This is  a
       test"  to  the  event  store of MYCONTEXT.  The third action sets up an
       alias name MYALIAS for the context (names MYCONTEXT and	MYALIAS	 refer
       to  the	same  context  data  structure). The fourth action appends the
       string "This is another test" to	the event store	of the	context.   The
       fifth action writes the lines

       This is a test
       This is another test

       to  the	standard  input	 of  the /bin/mail root@localhost command. The
       sixth action deletes the	context	data structure from memory  and	 drops
       its names MYCONTEXT and MYALIAS.

       Since  contexts are accessible from all rules and event correlation op-
       erations, they can be used for data sharing and joining	several	 rules
       into  one event correlation scheme.  In order to	check for the presence
       of contexts from	rules, context expressions can be employed.

       Context expressions are boolean expressions that	are defined  with  the
       context*	 rule  fields. Context expressions can be used for restricting
       the matches produced by patterns, since	if  the	 expression  evaluates
       FALSE, the rule will not	match an input event.

       The  context  expression	accepts	context	names, Perl miniprograms, Perl
       functions, and pattern match cache lookups as operands. These  operands
       can be combined with the	following operators:
       !  - logical NOT,
       &&  - short-circuit logical AND,
       ||  - short-circuit logical OR.
       In addition, parentheses	can be used for	grouping purposes.

       If  the	operand	 does not contain any special operators	(such as -> or
       :>, see below), it is treated as	a context name.	Context	name  operands
       may  contain  match  variables, but may not contain whitespace.	If the
       context name refers to an existing context, the operand evaluates TRUE,
       otherwise it evaluates FALSE.

       For example, consider the following rule	sequence:

       type=Single
       ptype=RegExp
       pattern=Test: (\d+)
       desc=test
       action=create CONT_$1

       type=Single
       ptype=RegExp
       pattern=Test2: (\d+) (\d+)
       context=CONT_$1 && CONT_$2
       desc=test
       action=write - Both $1 and $2 have been seen in the past

       If the following	input lines appear in this order

       Test: 19
       Test: 261
       Test2: 19 787
       Test: 787
       Test2: 787 261

       the first input line matches the	first rule which creates  the  context
       CONT_19,	 and similarly,	the second input line triggers the creation of
       the context CONT_261.  The third	input line "Test2: 19 787" matches the
       regular expression

       Test2: (\d+) (\d+)

       but does	not match the second rule, since the boolean expression

       CONT_19 && CONT_787

       evaluates FALSE (context	CONT_19	exists,	but context CONT_787 doesn't).
       The fourth input	line matches the first rule which creates the  context
       CONT_787.   The	fifth  input  line "Test2: 787 261" matches the	second
       rule, since the boolean expression

       CONT_787	&& CONT_261

       evaluates TRUE (both context CONT_787 and context CONT_261 exist),  and
       therefore  the  string "Both 787	and 261	have been seen in the past" is
       written to standard output.

       If the context expression operand contains the arrow operator (->), the
       text following the arrow	must be	a valid	Perl function definition  that
       is  compiled  at	 SEC startup with the Perl eval() function. The	eval()
       must return a code reference (see also  PERL  INTEGRATION  section  for
       more  information).  If any text	precedes the arrow, it is treated as a
       list of parameters for the function. Parameters must  be	 separated  by
       whitespace  and	may contain match variables.  In order to evaluate the
       context expression operand, the Perl function is	 called	 in  the  Perl
       scalar context. If the return value of the function is true in the Perl
       boolean	context,  the  operand	evaluates TRUE,	otherwise it evaluates
       FALSE.

       For example, the	following rule matches an SSH login failure  event  if
       the login attempt comes from a privileged port of the client host:

       type=Single
       ptype=RegExp
       pattern=sshd\[\d+\]: Failed .+ for (\S+)	from [\d.]+ port (\d+) ssh2
       context=$2 -> ( sub { $_[0] < 1024 } )
       desc=SSH	login failure for $1 priv port $2
       action=write - SSH login	failure	for user $1 from a privileged port $2

       When the	following message from SSH daemon appears

       Dec  16	16:24:59  myserver sshd[13685]:	Failed password	for risto from
       10.12.2.5 port 41063 ssh2

       the regular expression of the rule matches this message,	and the	 value
       of the $2 match variable	(41063)	is passed to the Perl function

       sub { $_[0] < 1024 }

       This function returns true if its input parameter is less than 1024 and
       false  otherwise,  and  therefore  the above message will not match the
       rule.  However, the following message

       Dec 16 16:25:17 myserver	sshd[13689]: Failed password  for  risto  from
       10.12.2.5 port 1023 ssh2

       matches the rule, and the string	"SSH login failure for user risto from
       a privileged port 1023" is written to standard output.

       As  another example, the	following context expression evaluates TRUE if
       the /var/log/messages file does not exist or  was  last	modified  more
       than 1 hour ago (note that the Perl function takes no parameters):

       context=	-> ( sub { my(@stat) = stat("/var/log/messages"); \
       return (!scalar(@stat) || time()	- $stat[9] > 3600); } )

       If  the	context	 expression operand contains the :> operator, the text
       that follows :> must be a valid Perl function definition	that  is  com-
       piled at	SEC startup with the Perl eval() function. The eval() must re-
       turn  a	code reference (see also PERL INTEGRATION section for more in-
       formation). If any text precedes	the :> operator, it is	treated	 as  a
       list  of	 parameters  for the function. Parameters must be separated by
       whitespace and may contain match	variables.  It is  assumed  that  each
       parameter is a name of an entry in the pattern match cache. If an entry
       with  the  given	name does not exist, Perl undefined value is passed to
       the function. If	an entry with the given	name exists,  a	 reference  to
       the  entry  is  passed  to the Perl function.  Internally, each pattern
       match cache entry is implemented	as a  Perl  hash  which	 contains  all
       match  variables	 for the given entry. In the hash, each	key-value pair
       represents some variable	name and value,	e.g., if cached	match variable
       $+{ip} is holding 10.1.1.1, the hash contains the value	10.1.1.1  with
       the  key	 ip.  In order to evaluate the context expression operand, the
       Perl function is	called in the Perl scalar context. If the return value
       of the function is true in the Perl boolean context, the	operand	evalu-
       ates TRUE, otherwise it evaluates FALSE.

       For example, consider the following rule	sequence:

       type=Single
       ptype=RegExp
       pattern=sshd\[\d+\]: (?<status>Accepted|Failed) .+ \
       for (?<invuser>invalid user )?(?<user>\S+) from (?<ip>[\d.]+) \
       port (?<port>\d+) ssh2
       varmap=SSH
       continue=TakeNext
       desc=parse SSH login events and pass them to following rules
       action=none

       type=Single
       ptype=Cached
       pattern=SSH
       context=SSH :> (	sub { $_[0]->{"status"}	eq "Failed" && \
			      $_[0]->{"port"} <	1024 &&	\
			      defined($_[0]->{"invuser"}) } )
       desc=Probe of invalid user $+{user} from	privileged port	of $+{ip}
       action=pipe '%t:	%s' /bin/mail -s 'SSH alert' root@localhost

       The first rule matches and parses SSH login messages, and stores	 pars-
       ing results to the pattern match	cache under the	name SSH.  The pattern
       of  the second rule (defined with ptype=Cached and pattern=SSH) matches
       any input event for which the entry SSH has been	previously created  in
       the  pattern match cache	(in other words, the event has been recognized
       and parsed as an	SSH login message).  For each matching event, the sec-
       ond rule	passes the reference to	the SSH	cache entry to the Perl	 func-
       tion

       sub { $_[0]->{"status"} eq "Failed" && \
	     $_[0]->{"port"} < 1024 && \
	     defined($_[0]->{"invuser"}) }

       The function checks the values of $+{status}, $+{port}, and $+{invuser}
       match  variables	 under	the  SSH entry,	and returns true if $+{status}
       equals to the string "Failed" (i.e., login attempt failed),  the	 value
       of  $+{port}  is	 less than 1024, and $+{invuser} holds a defined value
       (i.e., user account does	not exist).  If	the function (and thus context
       expression) evaluates TRUE, the rule sends a warning e-mail to root@lo-
       calhost that a non-existing user	account	was probed from	 a  privileged
       port of a client	host.

       If  the	context	expression operand begins with the varset keyword, the
       following string	is treated as a	name of	an entry in the	pattern	 match
       cache.  The operand evaluates TRUE if the given entry exists, and FALSE
       otherwise.

       For example, the	following context expression definition	evaluates TRUE
       if the pattern match cache entry	SSH exists and under this  entry,  the
       value of	the match variable $+{user} equals to the string "risto":

       context=varset SSH && SSH :> ( sub { $_[0]->{"user"} eq "risto" } )

       If  the	context	expression operand begins with the equal sign (=), the
       following text must be a	Perl miniprogram which is  a  valid  parameter
       for  the	 Perl eval() function. The miniprogram may contain match vari-
       ables.  In order	to evaluate the	Perl miniprogram operand, it  will  be
       compiled	 and  executed by calling the Perl eval() function in the Perl
       scalar context (see also	PERL  INTEGRATION  section).   If  the	return
       value  from  eval()  is	true  in the Perl boolean context, the operand
       evaluates TRUE, otherwise it evaluates FALSE. Please note  that	unlike
       Perl  functions	of  -> and :> operators	which are compiled once	at SEC
       startup,	Perl miniprograms are  compiled	 before	 each  execution,  and
       their evaluation	is thus	considerably more expensive.

       For  example, the following context expression evaluates	TRUE when nei-
       ther the	context	C1 nor the context C2 exists and the value of  the  $1
       variable	equals to the string "myhost.mydomain":

       context=!(C1 || C2) && =("$1" eq	"myhost.mydomain")

       Since &&	is a short-circuiting operator,	the Perl code

       "$1" eq "myhost.mydomain"

       is *not*	evaluated if either C1 or C2 exists.

       Note  that  since  Perl	functions and miniprograms may contain strings
       that clash with context expression operators (e.g., '!'), it is	recom-
       mended to enclose them in parentheses, e.g.,

       context=$1 $2 ->	( sub {	$_[0] != $_[1] } )

       context=	=({my($temp) = 0; !$temp;})

       Also,  if function parameter lists contain such strings,	they should be
       enclosed	in parentheses in the similar way:

       context=($1! $2)	-> ( sub { $_[0] eq $_[1] } )

       If the whole context expression is  enclosed  in	 square	 brackets  [],
       e.g.,  [MYCONTEXT1  &&  !MYCONTEXT2], SEC evaluates the expression *be-
       fore* pattern matching (normally, the pattern  is  matched  with	 input
       line(s) first, so that match variables would be initialized and substi-
       tuted  before the expression is evaluated).  However, if	the expression
       does not	contain	match variables	and many input	events	are  known  to
       match  the  pattern  but	not the	expression, the	[]-operator could save
       substantial amount of CPU time.

ACTIONS, ACTION	LISTS AND ACTION LIST VARIABLES
       Action lists are	defined	with the action* rule fields. An  action  list
       consists	 of action definitions that are	separated by semicolons.  Each
       action definition begins	with a keyword	specifying  the	 action	 type.
       Depending  on  the action type, parameters may follow, and non-constant
       parameters may contain match variables. For instance, if	the $1 and  $2
       match  variables	have the values	"test1"	and "the second	test", respec-
       tively, the action create MYCONT_$1 60 creates the context MYCONT_test1
       with the	lifetime of 60 seconds,	while the action write - The names  of
       tests:  $1, $2 writes the string	"The names of tests: test1, the	second
       test" to	standard output.

       Apart from few exceptions explicitly noted, match variables are substi-
       tuted at	the earliest opportunity in action lists.  For	example,  con-
       sider the following rule	definition:

       type=SingleWithThreshold
       ptype=RegExp
       pattern=sshd\[\d+\]: Failed .+ for (\S+)	from [\d.]+ port \d+ ssh2
       desc=Three SSH login failures within 1m
       action=pipe 'Three SSH login failures, first user is $1'	\
		   /bin/mail -s	'SSH login alert' root@localhost
       window=60
       thresh=3

       When this rule matches an SSH login failure event which starts an event
       correlation  operation, the operation substitutes the $1	match variable
       in the action list definition with the  user  name  from	 the  matching
       event,  and user	names from further events processed by this event cor-
       relation	operation are not considered for $1.  For example, if the fol-
       lowing events are observed

       Dec 16 16:24:52 myserver	sshd[13671]: Failed  password  for  root  from
       10.12.2.5 port 29736 ssh2
       Dec  16	16:24:59  myserver sshd[13685]:	Failed password	for risto from
       10.12.2.5 port 41063 ssh2
       Dec 16 16:25:01 myserver	sshd[13689]: Failed password for  oracle  from
       10.12.2.5 port 11204 ssh2

       then  all  events  are processed	by the same operation, and the message
       "Three SSH login	failures, first	user is	root" is mailed	to root@local-
       host.

       In order	to use semicolons inside a non-constant	parameter, the parame-
       ter must	be enclosed in parentheses (the	outermost set  of  parentheses
       will  be	 removed by SEC	during configuration file parsing).  For exam-
       ple, the	following action list consists of delete and shellcmd actions:

       action=delete MYCONTEXT;	shellcmd (rm /tmp/sec1.tmp; rm /tmp/sec2.tmp)

       The delete action deletes the context MYCONTEXT,	while the shellcmd ac-
       tion executes the command  line	rm  /tmp/sec1.tmp;  rm	/tmp/sec2.tmp.
       Since  the  command  line contains a semicolon, it has been enclosed in
       parentheses, since otherwise the	semicolon would	be mistakenly  consid-
       ered a separator	between	two actions.

       Apart  from  match variables, SEC supports action list variables	in ac-
       tion lists which	facilitate data	sharing	between	actions	and Perl inte-
       gration.	Each action list variable has a	name which must	begin  with  a
       letter  and consist of letters, digits and underscores. Names of	built-
       in variables usually start with a dot character (.), so that  they  can
       be  distinguished  from user defined variables. In order	to refer to an
       action list variable, its name must be prefixed by a percent sign  (%).
       Unlike  match  variables, action	list variables can only	be used	in ac-
       tion lists and they are substituted with	their values  immediately  be-
       fore the	action list execution. Also, action list variables continue to
       exist  after  the  current action list has been executed	and can	be em-
       ployed in action	lists of other rules.

       The following action list variables are predefined by SEC:

       %s     operation	description string (the	value of the desc field	 after
	      match  variables have been substituted with their	values).  Note
	      that for the action2 field of Pair and PairWithWindow rules, the
	      %s variable is set by evaluating the desc2 field of the rule.

       %t     the time in human-readable format, as returned by	the  Perl  lo-
	      caltime()	 function in the Perl scalar context (e.g., Fri	Feb 19
	      17:54:18 2016).

       %u     the time in seconds since	Epoch, as returned by the time(2) sys-
	      tem call.

       %.sec  number of	seconds	after the minute,  in  the  range  00-59  (the
	      value consists of	two digits and is zero padded on the left).

       %.min  number  of minutes after the hour, in the	range 00-59 (the value
	      consists of two digits and is zero padded	on the left).

       %.hour number of	hours past midnight, in	the  range  00-23  (the	 value
	      consists of two digits and is zero padded	on the left).

       %.hmsstr
	      the  time	 in  HH:MM:SS format (hours, minutes and seconds sepa-
	      rated by colons, e.g., 09:32:04 or 18:06:02).

       %.mday day of the month,	in the range 01-31 (the	value consists of  two
	      digits and is zero padded	on the left).

       %.mdaystr
	      day  of the month	as a string (the value consists	of two charac-
	      ters and is space	padded on the left, e.g., " 1",	" 4", "	9", or
	      "25").

       %.mon  month, in	the range 01-12	(the value consists of two digits  and
	      is zero padded on	the left).

       %.monstr
	      abbreviated  name	 of the	month according	to the current locale,
	      as returned by the %b specification of the  strftime(3)  library
	      call (e.g., Jan, May, or Sep).

       %.year year (e.g., 1998 or 2016).

       %.wday day of the week, in the range 0-6	(0 denotes Sunday).

       %.wdaystr
	      abbreviated name of the day of the week according	to the current
	      locale,  as  returned by the %a specification of the strftime(3)
	      library call (e.g., Mon, Wed, or Sat).

       %.tzname
	      name of the timezone according to	the  current  locale,  as  re-
	      turned  by  the %Z specification of the strftime(3) library call
	      (e.g., UTC or EET).

       %.tzoff
	      timezone offset from UTC,	as returned by the %z specification of
	      the strftime(3) library call (e.g., -0500	or +0200).

       %.tzoff2
	      timezone offset from UTC in +hh:mm/-hh:mm	format	(e.g.,	-05:00
	      or  +02:00),  provided  that  the	 %z specification of the strf-
	      time(3) library call returns the value in	+hhmm/-hhmm format (if
	      the value	does not follow	this format, %.tzoff2  is  set	to  an
	      empty string).

       %.nl   newline character.

       %.cr   carriage return character.

       %.tab  tabulation character.

       %.sp   space character.

       %.chr0, ..., %.chr255
	      ASCII  0..255  characters	 (e.g.,	 %.chr7	is bell	and %.chr12 is
	      form feed	character, whereas the sequence	%.chr195%.chr132 is A-
	      umlaut character in UTF-8	encoding).

       For example, the	following action list assigns the current time in  hu-
       man-readable  format and	the string "This is a test event" to the %text
       action list variable, and mails the value of %text to root@localhost:

       action=assign %text %t: This is a test event; \
	      pipe '%text' /bin/mail root@localhost

       If the action list is executed at Nov 19	10:58:51 2015, the assign  ac-
       tion  sets  the	%text  action  list variable to	the string "Thu	Nov 19
       10:58:51	2015: This is a	test event", while the pipe action mails  this
       string  to  root@localhost.   Note  that	unlike match variables,	action
       list variables have a global scope, and	accessing  the	value  of  the
       %text  variable	in  action  lists  of  other rules will	thus yield the
       string "Thu Nov 19 10:58:51 2015: This is a test	event" (until  another
       value is	assigned to %text).

       In  order  to  disambiguate  the	 variable from the following text, the
       variable	name must be enclosed in braces. For  example,	the  following
       action

       action=write - %{.year}-%{.mon}-%{.mday}T%{.hmsstr}%{.tzoff2}

       writes  a  timestamp  in	 ISO  8601  format  to	standard output, e.g.,
       2016-02-24T07:34:01+02:00 (replacing %{.mday} with %.mday in the	 above
       action would mistakenly create a	reference to %.mdayT variable).

       When  action list variables are substituted with	their values, each se-
       quence "%%" is interpreted as a literal percent sign (%)	 which	allows
       for masking the variables. For example, the string "s%%t" becomes "s%t"
       after substitution, not "s%<timestamp>".

       However,	 note that if %-prefixed match variables are supported for the
       action2 field of	the Pair or PairWithWindow rule,  the  sequence	 "%%%"
       must  be	 used in action2 for masking a variable, since the string goes
       through *two* variable substitution rounds (first for %-prefixed	 match
       variables  and then for action list variables, e.g., the	string "s%%%t"
       first becomes "s%%t" and	finally	"s%t").

       Whenever	a rule field goes through several substitution rounds,	the  $
       or  %  characters  are  masked inside values substituted	during earlier
       rounds, in order	to avoid unwanted side effects during later rounds.

       If the action list variable has not been	set, it	is substituted with an
       empty string (i.e., a zero-width	string).  Thus the string "Value of  A
       is: %a" becomes "Value of A is: " after substitution if the variable %a
       is unset.  (Note	that prior to SEC-2.6, unset variables were *not* sub-
       stituted.)

       Finally,	 the  values  are  substituted as strings, therefore values of
       other types (e.g., references) lose their original meaning, unless  ex-
       plicitly	 noted otherwise (e.g.,	if a Perl function reference is	stored
       to an action list variable, the function	can later be  invoked  through
       this variable with the call action).

       SEC supports the	following actions (optional parameters are enclosed in
       square brackets):

       none   No action.

       logonly [<string>]
	      Message  <string>	is logged to destinations given	with the --log
	      and --syslog options. The	level of the log message is set	 to  4
	      (see the --debug option for more information on log message lev-
	      els).  Default  value  for <string> is %s. For example, consider
	      the following action list	definition:

	      action=logonly This is a test

	      The above	logonly	action logs the	message	"This is a test"  with
	      level 4.

       write <filename>	[<string>]
	      String  <string>	with  a	 terminating newline is	written	to the
	      file <filename> (<filename> may not  contain  whitespace).  File
	      may  be  a regular file, named pipe, or standard output (denoted
	      by -).  If the file is a regular file, <string> is  appended  to
	      the  end of the file.  If	the file does not exist, it is created
	      as a regular file	before writing.	 Note that the file  will  not
	      be  closed  after	 the action completes, and the following write
	      actions will access an already open file.	 However, several sig-
	      nals cause the file to be	closed and reopened, and for  rotating
	      files  created with write	action,	the SIGUSR2 signal can be used
	      (see SIGNALS section for more information).  Default  value  for
	      <string> is %s.  For example, consider the following action list
	      definition:

	      action=write /var/log/test.log %t	$0

	      The  above  write	 action	 prepends human-readable timestamp and
	      separating space character to the	value of the  $0  match	 vari-
	      able,   and   the	  resulting   string   is   appended  to  file
	      /var/log/test.log	with terminating newline.

       writen <filename> [<string>]
	      Similar to the write action, except that the string <string>  is
	      written  without	a  terminating	newline.  Note	that write and
	      writen actions share the same filehandle for accessing the file.
	      For example, consider the	following action list definition:

	      action=writen - ab; writen - c; writen - %.nl

	      The above	action list writes the string "abc<NEWLINE>" to	 stan-
	      dard  output,  and is thus identical to write - abc (and also to
	      writen - abc%.nl).

       closef <filename>
	      Close the	file <filename>	that has been previously opened	by the
	      write or writen action (<filename> may not contain whitespace).

       owritecl	<filename> [<string>]
	      Similar to the write action, except that the file	<filename>  is
	      opened  and  closed at each write.  Also,	the string <string> is
	      written without a	terminating newline.  If the file has  already
	      been  opened  by	a previous write action, owritecl does not use
	      existing filehandle, but opens and closes	the  file  separately.
	      For example, consider the	following action list definition:

	      action=owritecl /var/log/test-%{.year}%{.mon}%{.mday} $0%{.nl}

	      The  above  owritecl  action  appends  the value of the $0 match
	      variable with terminating	newline	to  file  /var/log/test-YYYYM-
	      MDD, where YYYYMMDD reflects the current date (e.g., if the cur-
	      rent  date is April 1 2018, the file is /var/log/test-20180401).
	      Since the	file is	closed after each write, the old file will not
	      be left open when	date changes.

       udgram <filename> [<string>]
	      String <string> is written to the	UNIX  datagram	socket	<file-
	      name>  (<filename>  may  not contain whitespace).	 Note that the
	      socket will not be closed	after the action  completes,  and  the
	      following	 udgram	 actions  will	access an already open socket.
	      However, several signals cause the socket	to be closed  and  re-
	      opened  (see  SIGNALS  section  for  more	information).  Default
	      value for	<string> is %s.	 For example, consider	the  following
	      action list definition:

	      action=udgram /dev/log <30>%.monstr %.mdaystr %.hmsstr sec: This
	      is a test

	      The  above  udgram action	sends a	syslog message to local	syslog
	      daemon via /dev/log socket, where	message	priority is 30 (corre-
	      sponds to	the "daemon" facility and "info" level), syslog	tag is
	      "sec" and	message	text is	"This is a test".  Note	 that  message
	      substring	 "%.monstr  %.mdaystr %.hmsstr"	evaluates to timestamp
	      in BSD syslog format (e.g., Mar 31 15:36:07).

       closeudgr <filename>
	      Close the	UNIX datagram socket <filename>	that has  been	previ-
	      ously  opened  by	 the udgram action (<filename> may not contain
	      whitespace).

       ustream <filename> [<string>]
	      String <string> is written to the	UNIX stream socket  <filename>
	      (<filename>  may	not contain whitespace).  Note that the	socket
	      will not be closed after the action completes, and the following
	      ustream actions will access an already  open  socket.   However,
	      several  signals cause the socket	to be closed and reopened (see
	      SIGNALS  section	for  more  information).   Default  value  for
	      <string> is %s.

       closeustr <filename>
	      Close the	UNIX stream socket <filename> that has been previously
	      opened  by the ustream action (<filename>	may not	contain	white-
	      space).

       udpsock <host>:<port> [<string>]
	      String <string> is sent to the  UDP  port	 <port>	 of  the  host
	      <host>.	Note  that the UDP socket which	is used	for communica-
	      tion will	not be closed after the	action completes, and the fol-
	      lowing udpsock actions for the same remote peer will use an  al-
	      ready  existing  socket.	 However,  several  signals  cause the
	      socket to	be closed and recreated	(see SIGNALS section for  more
	      information).   Default  value for <string> is %s.  For example,
	      consider the following action list definition:

	      action=udpsock mysrv:514 <13>%.monstr %.mdaystr %.hmsstr	myhost
	      test: $0

	      The  above  udpsock  action  sends  a BSD	syslog message to port
	      514/udp of remote	syslog server mysrv, where message priority is
	      13 (corresponds to the "user" facility and "notice" level), name
	      of the local host	is "myhost", syslog tag	is "test" and  message
	      text is the value	if the $0 match	variable.

       closeudp	<host>:<port>
	      Close the	UDP socket for peer <host>:<port> that has been	previ-
	      ously opened by the udpsock action.

       tcpsock <host>:<port> [<string>]
	      String  <string>	is  sent  to  the  TCP port <port> of the host
	      <host>.  The timeout value given with the	 --socket-timeout  op-
	      tion  determines for how many seconds SEC	will attempt to	estab-
	      lish a connection	to the remote peer. If the  connection	estab-
	      lishment	does  not  succeed  immediately,  the  tcpsock	action
	      buffers <string> in memory for later sending to the remote peer.
	      Note that	the relevant TCP  socket  will	not  be	 closed	 after
	      <string> has been	transmitted, and the following tcpsock actions
	      for the same peer	will use an already existing socket.  However,
	      several signals cause the	socket to be closed and	recreated (see
	      SIGNALS  section	for  more  information).   Default  value  for
	      <string> is %s.  For example, consider the following action list
	      definition:

	      action=tcpsock grsrv:2003	ssh.login.failures %{num} %{u}%{.nl}

	      The above	tcpsock	action sends the  value	 of  the  action  list
	      variable	%{num}	to port	2003/tcp of the	Graphite server	grsrv,
	      so that the value	is recorded under metric path  ssh.login.fail-
	      ures.  Note that the %{u}	action list variable evaluates to cur-
	      rent time	in seconds since Epoch and is  used  for  setting  the
	      timestamp	for recorded value.

       closetcp	<host>:<port>
	      Close the	TCP socket for peer <host>:<port> that has been	previ-
	      ously opened by the tcpsock action.

       shellcmd	<cmdline>
	      Fork  a  process for executing command line <cmdline>.  If <cmd-
	      line> contains shell  metacharacters,  <cmdline>	is  parsed  by
	      shell.  If the --quoting option was specified and	<cmdline> con-
	      tains %s variables, the value of %s is quoted with single	quotes
	      before  substituting  it into <cmdline>; if the value of %s con-
	      tains single quotes, they	are masked with	backslashes (e.g., abc
	      is converted to 'abc' and	aa'bb  is  converted  to  'aa'\''bb').
	      For  additional  information,  see CHILD PROCESSES section.  For
	      example, consider	the following action list definition:

	      action=shellcmd (cat /tmp/report | mail  root;  rm  -f  /tmp/re-
	      port); \
		     logonly Report sent to user root

	      The  shellcmd  action  of	 this action list executes the command
	      line

	      cat /tmp/report |	mail root; rm -f /tmp/report

	      and the logonly action logs the message  "Report	sent  to  user
	      root".   Since  the  command  line contains a semicolon which is
	      used for separating shellcmd and logonly	actions,  the  command
	      line is enclosed in parentheses.

       spawn <cmdline>
	      Similar  to  the shellcmd	action,	except that each line from the
	      standard output of <cmdline> becomes a synthetic event and  will
	      be treated like a	line from input	file (see the event action for
	      more  information).  If the --intcontexts	command	line option is
	      given, internal context _INTERNAL_EVENT is set  up  before  each
	      synthetic	 event	is processed (see INTERNAL EVENTS AND CONTEXTS
	      section for more information).  For example, consider  the  fol-
	      lowing action list definition:

	      action=spawn (cat	/tmp/events; rm	-f /tmp/events)

	      The  above  spawn	action will generate synthetic events from all
	      lines in file /tmp/events	and remove the file. Since the command
	      line contains a semicolon	which is used for separating  actions,
	      the command line is enclosed in parentheses.

       cspawn <name> <cmdline>
	      Similar  to  the	spawn action, except that if the --intcontexts
	      command line option is given, internal context <name> is set  up
	      for each synthetic event.

       cmdexec <cmdline>
	      Fork  a  process	for  executing command line <cmdline>.	Unlike
	      shellcmd action, <cmdline> is not	parsed	by  shell,  but	 split
	      into arguments by	using whitespace as a separator, and passed to
	      execvp(3)	 for  execution. Note that splitting into arguments is
	      done when	cmdexec	action is loaded from the  configuration  file
	      and  parsed,  not	 at  runtime  (e.g.,  if <cmdline> is /usr/lo-
	      cal/bin/mytool $1	$2, the	values of $1 and $2 variables are  re-
	      garded  as  single  arguments  even if the values	contain	white-
	      space).  For additional information, see	CHILD  PROCESSES  sec-
	      tion.   For  example, consider the following action list defini-
	      tion:

	      action=cmdexec rm	/tmp/report*

	      The above	cmdexec	action will remove the file /tmp/report* with-
	      out treating * as	a file	pattern	 character  that  matches  any
	      string.

       spawnexec <cmdline>
	      Similar  to  the	cmdexec	action,	except that each line from the
	      standard output of <cmdline> becomes a synthetic event and  will
	      be treated like a	line from input	file (see the event action for
	      more  information).  If the --intcontexts	command	line option is
	      given, internal context _INTERNAL_EVENT is set  up  before  each
	      synthetic	 event	is processed (see INTERNAL EVENTS AND CONTEXTS
	      section for more information).

       cspawnexec <name> <cmdline>
	      Similar to the spawnexec action, except that  if	the  --intcon-
	      texts  command  line option is given, internal context <name> is
	      set up for each synthetic	event.

       pipe '[<string>]' [<cmdline>]
	      Fork a process for executing command line	<cmdline>.   If	 <cmd-
	      line>  contains  shell  metacharacters,  <cmdline>  is parsed by
	      shell.  The string <string> with a terminating newline is	 writ-
	      ten  to  the standard input of <cmdline> (single quotes are used
	      for disambiguating <string> from <cmdline>).  If	<string>  con-
	      tains  semicolons,  <string>  must  be  enclosed	in parentheses
	      (e.g., pipe '($1;$2)' /bin/cat).	Default	value for <string>  is
	      %s.   If	<cmdline>  is omitted, <string>	is written to standard
	      output.  For additional information, see	CHILD  PROCESSES  sec-
	      tion.   For  example, consider the following action list defini-
	      tion:

	      action=pipe  'Offending  activities  from	 host  $1'   /bin/mail
	      root@localhost

	      The above	pipe action writes the line "Offending activities from
	      host <hostname>" to the standard input of	the /bin/mail root@lo-
	      calhost  command	which sends this line to root@localhost	via e-
	      mail (<hostname> is the value of the $1 match variable).

       pipeexec	'[<string>]' [<cmdline>]
	      Similar to the pipe action, except <cmdline> is  not  parsed  by
	      shell, but split into arguments by using whitespace as a separa-
	      tor,  and	passed to execvp(3) for	execution. Note	that splitting
	      into arguments is	done when pipeexec action is loaded  from  the
	      configuration  file  and	parsed,	not at runtime (e.g., if <cmd-
	      line> is /usr/local/bin/mytool $1	$2, the	values of  $1  and  $2
	      variables	 are  regarded	as single arguments even if the	values
	      contain whitespace).  For	example, consider the following	action
	      list definition:

	      action=pipeexec 'Offending activities from host $1' \
			      /bin/mail	-s SEC%{.sp}alert $2

	      The above	pipeexec action	writes the line	"Offending  activities
	      from  host <hostname>" to	the standard input of the /bin/mail -s
	      <subject>	<user> command which sends this	line to	<user> via  e-
	      mail  with  subject <subject> (<hostname>	is the value of	the $1
	      match variable, while <user> is the value	of the $2 match	 vari-
	      able).  Note  that  since	<subject> is defined as	SEC%{.sp}alert
	      and does not contain whitespace, it is treated as	a single argu-
	      ment for the -s flag of the /bin/mail  command.  However,	 since
	      <subject>	 contains  the	%.sp  action list variable, the	string
	      "SEC alert" will be used for  the	 e-mail	 subject  at  runtime.
	      Also,  if	 the  value  of	 the  $2 match variable	contains shell
	      metacharacters, they will	not be interpreted by the shell.

       create [<name> [<time> [<action list>] ]	]
	      Create a context with the	name <name>, lifetime of  <time>  sec-
	      onds,  and  empty	event store. The <name>	parameter may not con-
	      tain whitespace and defaults to %s. The  <time>  parameter  must
	      evaluate	to  an	unsigned integer at runtime.  Specifying 0 for
	      <time> or	omitting the value means infinite lifetime.   If  <ac-
	      tion  list>  is  given, it will be executed when the context ex-
	      pires.  If <action list> contains	several	actions, the list must
	      be enclosed in parentheses. In <action list>, the	internal  con-
	      text name	_THIS may be used for referring	to the current context
	      (see INTERNAL EVENTS AND CONTEXTS	section	for a detailed discus-
	      sion).  If an already existing context is	recreated with create,
	      its remaining lifetime is	set to <time> seconds, its action list
	      is  reinitialized, and its event store is	emptied.  For example,
	      consider the following action list definition:

	      action=write /var/log/test.log $0; create	TIMER 3600 \
		     (	  logonly    Closing	 /var/log/test.log;	closef
	      /var/log/test.log	)

	      The write	action from the	above action list appends the value of
	      the  $0 match variable to	file /var/log/test.log,	while the cre-
	      ate action creates the context TIMER which will exist  for  3600
	      seconds. Since this context is recreated at each write, the con-
	      text  can	 expire	 only if the action list has not been executed
	      for more than 3600 seconds (i.e.,	the action list	has  last  up-
	      dated  the  file more than 1 hour	ago). If that is the case, the
	      action list

	      logonly Closing /var/log/test.log; closef	/var/log/test.log

	      is executed which	logs the message  "Closing  /var/log/test.log"
	      with  the	 logonly  action and closes /var/log/test.log with the
	      closef action. When the execution	of this	action	list  is  com-
	      plete, the TIMER context is deleted.

       delete [<name>]
	      Delete  the context <name>. The <name> parameter may not contain
	      whitespace and defaults to %s.

       obsolete	[<name>]
	      Similar to the delete action, except that	the action list	of the
	      context <name> (if present) is executed before deletion.

       set <name> <time> [<action list>]
	      Change settings for the context <name>. The creation time	of the
	      context is set to	the current time, and the lifetime of the con-
	      text is set to <time> seconds.  If the <action  list>  parameter
	      is  given, the context action list is set	to <action list>, oth-
	      erwise the context action	list is	not changed.  The <name> para-
	      meter may	not contain whitespace and defaults to %s.  The	<time>
	      parameter	must evaluate to an unsigned integer or	hyphen (-)  at
	      runtime.	 Specifying  0 for <time> means	infinite lifetime.  If
	      <time> equals to -, the creation time and	lifetime of  the  con-
	      text  are	 not  changed.	 If <action list> contains several ac-
	      tions, the list must be  enclosed	 in  parentheses.  In  <action
	      list>, the internal context name _THIS may be used for referring
	      to the current context (see INTERNAL EVENTS AND CONTEXTS section
	      for a detailed discussion).  For example,	consider the following
	      action list definition:

	      action=set C_$1 30 ( logonly Context C_$1	has expired )

	      The above	set action sets	the context C_<suffix> to expire after
	      30  seconds with a log message about expiration (<suffix>	is the
	      value of the $1 match variable).

       alias <name> [<alias>]
	      Create an	alias name <alias> for the context <name>. After  cre-
	      ation,  both  <alias>  and <name>	will point to the same context
	      data structure, and can thus be used interchangeably for	refer-
	      ring  to the context.  The <name>	and <alias> parameters may not
	      contain whitespace, and <alias> defaults to %s.  If the  context
	      <name>  does  not	 exist,	the alias name is not created.	If the
	      delete action is called for one of the context names,  the  con-
	      text  data  structure is destroyed, and all context names	(which
	      are now pointers to unallocated memory)  cease  to  exist.  Also
	      note  that when the context expires, its action list is executed
	      only once, no matter how many names the context has.

       unalias [<alias>]
	      Drop an existing context name <alias>, so	that it	can no	longer
	      be  used for referring to	the given context. The <alias> parame-
	      ter may not contain whitespace and defaults to %s.  If the  name
	      <alias> is the last reference to the context, the	unalias	action
	      is identical to delete.

       add <name> [<string>]
	      String <string> is appended to the end of	the event store	of the
	      context  <name>.	 The  <name>  parameter	may not	contain	white-
	      space, and the <string> parameter	defaults to %s.	 If  the  con-
	      text <name> does not exist, the context is created with an infi-
	      nite  lifetime, empty action list	and empty event	store (as with
	      create <name>) before adding the	string	to  event  store.   If
	      <string> is a multi-line string (i.e., it	contains newlines), it
	      is  split	 into  lines,  and  each line is appended to the event
	      store separately.	 For example, consider	the  following	action
	      list definition:

	      action=add EVENTS	This is	a test;	add EVENTS This	is a test2

	      After the	execution of this action list, the last	two strings in
	      the  event  store	of the EVENTS context are "This	is a test" and
	      "This is a test2"	(in that order).

       prepend <name> [<string>]
	      Similar to the add action, except	that the  string  <string>  is
	      prepended	to the beginning of the	event store of context <name>.
	      For example, consider the	following action list definition:

	      action=prepend  EVENTS  This is a	test; prepend EVENTS This is a
	      test2

	      After the	execution of this action list, the first  two  strings
	      in  the  event store of the EVENTS context are "This is a	test2"
	      and "This	is a test" (in that order).

       fill <name> [<string>]
	      Similar to the add action, except	that the event	store  of  the
	      context <name> is	emptied	before <string>	is added.

       report <name> [<cmdline>]
	      Fork  a  process for executing command line <cmdline>.  If <cmd-
	      line> contains shell  metacharacters,  <cmdline>	is  parsed  by
	      shell.   Also, write strings from	the event store	of the context
	      <name> to	the standard input of <cmdline>.  Strings are  written
	      in  the order they appear	in the event store, with a terminating
	      newline appended to each string.	If the context <name> does not
	      exist or its event store is empty, <cmdline>  is	not  executed.
	      The  <name>  parameter  may not contain whitespace, and if <cmd-
	      line> is omitted,	strings	are written to standard	 output.   For
	      additional  information, see CHILD PROCESSES section.  For exam-
	      ple, consider the	following action list definition:

	      action=create PID_$1 60 (	report PID_$1 /bin/mail	root@localhost
	      ); \
		     add PID_$1	Beginning of the report

	      The above	action list creates the	context	PID_<suffix> with  the
	      lifetime	of 60 seconds and sets the first string	in the context
	      event store to "Beginning	of the report" (<suffix> is the	 value
	      of  the  $1  match  variable).   When  the  context expires, all
	      strings from the event store will	be mailed to root@localhost.

       reportexec <name> [<cmdline>]
	      Similar to the report action, except <cmdline> is	not parsed  by
	      shell, but split into arguments by using whitespace as a separa-
	      tor,  and	passed to execvp(3) for	execution. Note	that splitting
	      into arguments is	done when reportexec action is loaded from the
	      configuration file and parsed, not at runtime  (e.g.,  if	 <cmd-
	      line>  is	 /usr/local/bin/mytool	$1 $2, the values of $1	and $2
	      variables	are regarded as	single arguments even  if  the	values
	      contain whitespace).

       copy <name> %<var>
	      Strings s1,...,sn	from the event store of	the context <name> are
	      joined into a multi-line string "s1<NEWLINE>...<NEWLINE>sn", and
	      this  string is assigned to the action list variable %<var>.  If
	      the context <name> does not exist, the value of %<var> does  not
	      change.

       empty <name> [%<var>]
	      Similar  to  the copy action, except that	the event store	of the
	      context <name> will be emptied after the assignment.  If	%<var>
	      is omitted, the content of the event store is dropped without an
	      assignment.

       pop <name> %<var>
	      Remove  the  last	string from the	event store of context <name>,
	      and assign it to the action list variable	%<var>.	If  the	 event
	      store  is	 empty,	%<var> is set to empty string.	If the context
	      <name> does not exist, the value of %<var> does not change.

       shift <name> %<var>
	      Remove the first string from the event store of context  <name>,
	      and  assign  it to the action list variable %<var>. If the event
	      store is empty, %<var> is	set to empty string.  If  the  context
	      <name> does not exist, the value of %<var> does not change.

       exists %<var> <name>
	      If  the  context	<name>	exists,	 set  the action list variable
	      %<var> to	1, otherwise set %<var>	to 0.

       getsize %<var> <name>
	      Find the number of strings in the	event store of context <name>,
	      and assign this number to	the action list	variable  %<var>.   If
	      the  context  <name> does	not exist, %<var> is set to Perl unde-
	      fined value.  For	example, consider the  following  action  list
	      definition:

	      action=fill EVENTS Event1; add EVENTS Event2; add	EVENTS Event3;
	      \
		     pop  EVENTS  %temp1;  shift  EVENTS %temp2; getsize %size
	      EVENTS

	      This action list sets the	%temp1 action list variable to Event3,
	      %temp2 action list variable to Event1,  and  %size  action  list
	      variable to 1.

       getaliases %<var> <name>
	      Find  all	 alias names for context <name>, join the names	into a
	      multi-line string	"alias1<NEWLINE>...<NEWLINE>aliasn",  and  as-
	      sign  this  string  to  the action list variable %<var>.	If the
	      context <name> does not exist, the  value	 of  %<var>  does  not
	      change.

       getltime	%<var> <name>
	      Find  the	 lifetime of context <name>, and assign	this number to
	      the action list variable %<var>.	If the context <name> does not
	      exist, the value of %<var> does not change.  For	example,  con-
	      sider the	following action list definition:

	      action=create TEST 10 ( getltime %time TEST; \
		     logonly  Context  TEST with %time second lifetime has ex-
	      pired )

	      The above	create action configures the context TEST to  log  its
	      lifetime when it expires.

       setltime	<name> [<time>]
	      Set  the lifetime	of context <name> to <time>.  Specifying 0 for
	      <time> or	omitting the value means infinite lifetime.  Note that
	      unlike the set action, setltime does not adjust the context cre-
	      ation time. For example, if context TEST	has  been  created  at
	      12:01:00	with  the  lifetime of 60 seconds, then	after invoking
	      setltime TEST 30 at  12:01:20  the  context  would  exist	 until
	      12:01:30,	 while invoking	setltime TEST 10 would immediately ex-
	      pire the context.

       getctime	%<var> <name>
	      Find the creation	time of	context	<name>,	and assign this	 time-
	      stamp to the action list variable	%<var>.	 The value assigned to
	      %<var>  is  measured  in seconds since Epoch (as reported	by the
	      time(2) system call).  If	the context <name> does	not exist, the
	      value of %<var> does not change.

       setctime	<time> <name>
	      Set the creation time of context <name> to <time>.   The	<time>
	      parameter	 must  evaluate	to seconds since Epoch (as reported by
	      the time(2) system call),	and must reflect a time	moment between
	      the previous creation time and the current time (both  endpoints
	      included).   For	example,  if  context TEST has been created at
	      12:43:00 with the	lifetime of 60 seconds,	 then  after  invoking
	      setctime	%u  TEST  at  12:43:25	the  context would exist until
	      12:44:25 (the %u action list variable evaluates to current  time
	      in seconds since Epoch).

       event [<time>] [<string>]
	      After  <time>  seconds,  create  a synthetic event <string>.  If
	      <string> is a multi-line string (i.e., it	contains newlines), it
	      is split into lines, and from each  line	a  separate  synthetic
	      event  is	 created.   SEC	will treat each	synthetic event	like a
	      line from	an input file -- the event  will  be  matched  against
	      rules  and  it  might trigger further actions.  If the --intcon-
	      texts command line option	is  given,  internal  context  _INTER-
	      NAL_EVENT	 is set	up for synthetic event(s) (see INTERNAL	EVENTS
	      AND CONTEXTS section for more information).  The <time>  parame-
	      ter  is an integer constant. Specifying 0	for <time> or omitting
	      the value	means "now". Default value for <string>	 is  %s.   For
	      example, consider	the following action list definition:

	      action=copy EVENTS %events; event	%events

	      The  above  action  list will create a synthetic event from each
	      string in	the event store	of the EVENTS context.

       tevent <time> [<string>]
	      Similar to the event action, except that	the  <time>  parameter
	      may  contain  variables and must evaluate	to an unsigned integer
	      at runtime.

       cevent <name> <time> [<string>]
	      Similar to the tevent action, except that	if  the	 --intcontexts
	      command  line option is given, internal context <name> is	set up
	      for synthetic event(s).

       reset [<offset>]	[<string>]
	      Terminate	event correlation operation(s) with the	operation  de-
	      scription	string <string>. Note that the reset action works only
	      for  operations  started	from the same configuration file.  The
	      <offset> parameter is used to refer to a specific	 rule  in  the
	      configuration  file. If <offset> is given, the operation started
	      by the given rule	is terminated (if it exists).  If <offset>  is
	      an unsigned integer N, it	refers to the N-th rule	in the config-
	      uration  file.  If <offset> is 0,	it refers to the current rule.
	      If <offset> begins with the plus (+) or minus (-)	sign, it spec-
	      ifies an offset from the current rule (e.g., -1 denotes the pre-
	      vious and	+1 the next rule).  Note that since Options rules  are
	      only  processed when configuration files are loaded and they are
	      not applied at runtime, Options rules are	excluded  when	calcu-
	      lating  <offset>.	 If <offset> is	not given, SEC checks for each
	      rule from	the current configuration file if  an  operation  with
	      <string>	has  been  started  by this rule, and the operation is
	      terminated if it exists.	Default	value for <string> is %s.  For
	      additional information, see EVENT	 CORRELATION  OPERATIONS  sec-
	      tion.   For  example, consider the following action list defini-
	      tion:

	      action=reset -1 Ten login	failures observed from $1; reset 0

	      If the above action list is executed by an event correlation op-
	      eration, the first reset action  will  terminate	another	 event
	      correlation  operation  which  has  been started by the previous
	      rule and has the operation description string "Ten  login	 fail-
	      ures  observed from <host>" (<host> is the value of the $1 match
	      variable). The second reset action will  terminate  the  calling
	      operation	itself.

       getwpos %<var> <offset> [<string>]
	      Find  the	beginning of the event correlation window for an event
	      correlation operation, and set the action	list  variable	%<var>
	      to  this timestamp.  The value assigned to %<var>	is measured in
	      seconds since Epoch (as reported by the time(2) system call). As
	      with the reset action, the event correlation operation is	 iden-
	      tified by	the operation description string <string> and the rule
	      offset  <offset>.	 If the	operation does not exist, the value of
	      %<var> does not change.  Default value for <string> is %s.   For
	      additional  information,	see  EVENT CORRELATION OPERATIONS sec-
	      tion.  For example, consider the following action	 list  defini-
	      tion:

	      action=getwpos %pos -1 Ten login failures	observed from $1

	      The  above  getwpos  action will find the	beginning of the event
	      correlation window for an	event correlation operation which  has
	      been started by the previous rule	and has	the operation descrip-
	      tion string "Ten login failures observed from <host>" (<host> is
	      the  value  of  the $1 match variable). If the event correlation
	      window begins at April 6 08:03:53	2018 UTC, the value 1523001833
	      will be assigned to the %pos action list variable.

       setwpos <time> <offset> [<string>]
	      Set the beginning	of the event correlation window	to <time>  for
	      an  event	correlation operation (if it exists). The <time> para-
	      meter must evaluate to seconds since Epoch (as reported  by  the
	      time(2) system call), and	must reflect a time moment between the
	      previous	window	position  and the current time (both endpoints
	      included). As with the reset action, the event correlation oper-
	      ation is identified by the operation description string <string>
	      and the rule offset <offset>.  Default value for <string>	is %s.
	      For additional information,  see	EVENT  CORRELATION  OPERATIONS
	      section.

       assign %<var> [<string>]
	      Assign  string <string> to the action list variable %<var>.  De-
	      fault value for <string> is %s.

       assignsq	%<var> [<string>]
	      Similar to the assign action, except  that  <string>  is	quoted
	      with  single  quotes  before assigning it	to %<var>. If <string>
	      contains single quotes, they are masked with backslashes	(e.g.,
	      if the match variable $1 holds the value abc'123'xyz, the	action
	      assignsq	%myvar $1 assigns the value 'abc'\''123'\''xyz'	to the
	      action list variable %myvar).  This action is  useful  for  dis-
	      abling  shell interpretation for the values of action list vari-
	      ables that appear	in command lines  executed  by	SEC.   Default
	      value for	<string> is %s.

       free %<var>
	      Unset the	action list variable %<var>.

       eval %<var> <code>
	      The  parameter <code> is a Perl miniprogram that is compiled and
	      executed by calling the Perl eval() function in  the  Perl  list
	      context.	 If  the miniprogram returns a single value, it	is as-
	      signed to	the action list	variable %<var>.  If  the  miniprogram
	      returns  several values s1,...,sn, they are joined into a	multi-
	      line string "s1<NEWLINE>...<NEWLINE>sn", and this	string is  as-
	      signed  to  %<var>.   If	no value is returned, %<var> is	set to
	      Perl undefined value. If eval() fails, the value of %<var>  does
	      not  change.   Since most	Perl programs contain semicolons which
	      are also employed	by SEC as action separators, it	is recommended
	      to enclose the <code> parameter in parentheses, in order to mask
	      the semicolons in	<code>.	 For additional	information, see  PERL
	      INTEGRATION section.  For	example, consider the following	action
	      list definition:

	      action=assign %div Division error; eval %div ( $1	/ $2 )

	      The  assign  action  sets	 the  %div action list variable	to the
	      string "Division error", while the eval action  substitutes  the
	      values  of  $1 and $2 match variables into the string "$1	/ $2".
	      Resulting	string is treated as Perl code which is	first compiled
	      and then executed. For instance, if the values of	$1 and $2  are
	      12  and 4, respectively, the following Perl code is compiled: 12
	      /	4. Since executing this	code yields 3, the eval	action assigns
	      this value to the	%div action list variable.  Also, if $2	has no
	      value or its value is 0, resulting code leads to compilation  or
	      execution	 error,	 and %div retains its previous value "Division
	      error".

       call %<var> %<ref> [<paramlist>]
	      Call the precompiled Perl	function referenced by the action list
	      variable %<ref>, and assign the result to	the action list	 vari-
	      able %<var>.  The	%<ref> parameter must be a code	reference that
	      has   been   previously	created	 with  the  eval  action.  The
	      <paramlist> parameter (if	given) is a string which specifies pa-
	      rameters for the function. The parameters	must be	 separated  by
	      whitespace in the	<paramlist> string.  If	the function returns a
	      single value, it is assigned to %<var>.  If the function returns
	      several  values  s1,...,sn,  they	 are  joined into a multi-line
	      string "s1<NEWLINE>...<NEWLINE>sn", and this string is  assigned
	      to  %<var>. If no	value is returned, %<var> is set to Perl unde-
	      fined value.  If the function encounters a fatal	runtime	 error
	      or  %<ref> is not	a code reference, the value of %<var> does not
	      change.  For additional information, see PERL  INTEGRATION  sec-
	      tion.   For  example, consider the following action list defini-
	      tion:

	      action=eval %func	( sub {	return $_[0] + $_[1] } ); \
		     call %sum %func $1	$2

	      Since the	Perl code provided to eval action is a	definition  of
	      an  anonymous  function, its compilation yields a	code reference
	      which gets assigned to the %func action list variable (the func-
	      tion returns the sum of its two input parameters).  The call ac-
	      tion will	invoke previously compiled function, using the	values
	      of $1 and	$2 match variables as function parameters, and assign-
	      ing  function  return  value  to	the %sum action	list variable.
	      Therefore, if the	values of $1 and $2 are	2 and 3, respectively,
	      %sum is set to 5.

       lcall %<var> [<paramlist>] -> <code>

       lcall %<var> [<paramlist>] :> <code>
	      Call the precompiled Perl	function <code>	and assign the	result
	      to  the  action list variable %<var>.  The <code>	parameter must
	      be a valid Perl anonymous	function definition that  is  compiled
	      at  SEC  startup	with the Perl eval() function, and eval() must
	      return a code reference.	The <paramlist>	parameter  (if	given)
	      is a string which	specifies parameters for the function. The pa-
	      rameters	must  be  separated  by	 whitespace in the <paramlist>
	      string.  If <paramlist> is followed by ->	 operator,  parameters
	      are passed to function as	Perl scalar values.  If	<paramlist> is
	      followed	by :> operator,	it is assumed that each	parameter is a
	      name of an entry in the pattern match cache. If  an  entry  with
	      the given	name does not exist, Perl undefined value is passed to
	      the  function.  If an entry with the given name exists, a	refer-
	      ence to the entry	is passed to the function.   Internally,  each
	      pattern  match  cache  entry is implemented as a Perl hash which
	      contains all match variables for the given entry.	 If the	 func-
	      tion  returns  a single value, it	is assigned to %<var>.	If the
	      function returns several values s1,...,sn, they are joined  into
	      a	multi-line string "s1<NEWLINE>...<NEWLINE>sn", and this	string
	      is assigned to %<var>. If	no value is returned, %<var> is	set to
	      Perl  undefined  value.  If the function encounters a fatal run-
	      time error, the value of %<var> does  not	 change.   Since  most
	      Perl functions contain semicolons	which are also employed	by SEC
	      as  action  separators,  it is recommended to enclose the	<code>
	      parameter	in parentheses,	in order to  mask  the	semicolons  in
	      <code>.	For  additional	information, see PERL INTEGRATION sec-
	      tion.  For example, consider the following action	 list  defini-
	      tion:

	      action=lcall %len	$1 -> (	sub { return length($_[0]) } )

	      The above	lcall action will take the value of the	$1 match vari-
	      able  and	find its length	in characters, assigning the length to
	      the %len action list variable. Note that the function for	 find-
	      ing the length is	compiled when SEC loads	its configuration, and
	      all invocations of lcall will execute already compiled code.  As
	      another example, consider	the following action list definition:

	      action=lcall %o SSH :> ( sub { $_[0]->{"failure"}	= 1 } )

	      The  above  lcall	 action	will assign 1 to the $+{failure} match
	      variable that has	been cached under the SSH entry	in the pattern
	      match cache (variable will be created if it did not exist	previ-
	      ously).

       rewrite <lnum> [<string>]
	      Replace last <lnum>  lines  in  the  input  buffer  with	string
	      <string>.	 If  the --nojointbuf option was specified and the ac-
	      tion is triggered	by a matching event, the action	 modifies  the
	      buffer  which  holds  this event.	If the --nojointbuf option was
	      specified	and the	action is triggered by the system clock	(e.g.,
	      the action is executed from the Calendar rule), the action modi-
	      fies the buffer which holds the last  already  processed	event.
	      With  the	 --jointbuf  option,  the  content  of the joint input
	      buffer is	rewritten. The <lnum> parameter	must  evaluate	to  an
	      unsigned integer at runtime. If <lnum> evaluates to 0, <lnum> is
	      reset  to	 the  number  of  lines	 in <string>.  If the value of
	      <lnum> is	greater	than the buffer	size N,	<lnum> is reset	to  N.
	      If  <string>  contains  less than	<lnum> lines, <string> will be
	      padded with leading empty	lines. If <string> contains more  than
	      <lnum>  lines, only leading <lnum> lines from <string> are writ-
	      ten into the buffer.  Default value for <string> is %s.  For ad-
	      ditional information, see	INPUT PROCESSING AND TIMING section.

       addinput	<filename> [<offset> [<name>] ]
	      File <filename> is added to the list of input files and  opened,
	      so  that	processing starts from file offset <offset>. The <off-
	      set> parameter must evaluate to unsigned integer or -  (EOF)  at
	      runtime.	 If <offset> is	not specified, it defaults to -	(i.e.,
	      processing starts	from the end of	file).	If  opening  the  file
	      fails  (e.g., the	file does not exist), it will stay in the list
	      of input files (e.g., with the --reopen-timeout command line op-
	      tion, SEC	will attempt to	reopen the file).  The <name>  parame-
	      ter defines the internal context which should be used for	<file-
	      name>  if	 the  --intcontexts  command  line option is given (if
	      <name> is	omitted	 but  --intcontexts  command  line  option  is
	      present,	default	 internal context will be used).  See INTERNAL
	      EVENTS AND CONTEXTS section for more information.	 For  example,
	      consider the following action list definition:

	      action=addinput /var/log/test-%{.year}%{.mon}%{.mday} 0 TESTFILE

	      The  above  addinput action adds the file	/var/log/test-YYYYMMDD
	      to the list of input files, where	YYYYMMDD reflects the  current
	      date.  The  addinput  action will	also attempt to	open the file,
	      and if open succeeds, file will be processed from	the beginning.
	      Also, the	internal context TESTFILE will be used for all	events
	      read from	the file.

       dropinput <filename>
	      File  <filename>	is  dropped  from  the list of input files and
	      closed (if currently open). Note that dropinput action can  only
	      be  used	for input files	which have been	previously set up with
	      addinput action.

       sigemul <signal>
	      Emulates the arrival of signal <signal> and  triggers  its  han-
	      dler.   The  <signal> parameter must evaluate to one of the fol-
	      lowing strings: HUP, ABRT, USR1, USR2, INT, or TERM.  For	 exam-
	      ple, the action sigemul USR1 triggers the	generation of SEC dump
	      file.  See  the SIGNALS section for detailed information on sig-
	      nals that	are handled by SEC.

       varset %<var> <entry>
	      If the pattern match cache entry <entry> exists, set the	action
	      list  variable %<var> to 1, otherwise set	%<var> to 0. For exam-
	      ple, if pattern match cache contains the entry with the name SSH
	      but not the entry	with the name NTP, the action varset %ssh  SSH
	      will  set	 the  %ssh action list variable	to 1, while the	action
	      varset %ntp NTP will set the %ntp	action list variable to	0.

       if %<var> ( <action list> ) [ else ( <action list2> ) ]
	      If the action list variable %<var> evaluates true	 in  the  Perl
	      boolean context (i.e., it	holds a	defined	value which is neither
	      0	 nor  empty string), execute the action	list <action list>. If
	      the second action	list <action list2> is given with the optional
	      else-statement, it is executed if	%<var> either does  not	 exist
	      or  evaluates  false (i.e., %<var> holds 0, empty	string or Perl
	      undefined	value).	 For example, consider	the  following	action
	      list definition:

	      action=exists %present REPORT; if	%present \
		       ( report	REPORT /bin/mail root@localhost; delete	REPORT
	      )	\
		       else ( logonly Nothing to report	)

	      If  the  REPORT  context	exists,	 its  event store is mailed to
	      root@localhost and the context is	deleted, otherwise the message
	      "Nothing to report" is logged.

       while %<var> ( <action list> )
	      Execute the action list <action list> repeatedly as long as  the
	      action  list  variable %<var> evaluates true in the Perl boolean
	      context (i.e., it	holds a	defined	value which is neither	0  nor
	      empty  string).  For example, consider the following action list
	      definition:

	      action=create REVERSE; getsize %n	TEST; \
		     while %n (	pop TEST %e; add REVERSE %e; getsize  %n  TEST
	      ); \
		     copy REVERSE %events; fill	TEST %events

	      This  action  list  reverses  the	 order of strings in the event
	      store of the context TEST, using the context REVERSE as a	tempo-
	      rary storage.  During each iteration of the while-loop, the last
	      string in	the event store	of TEST	is removed with	the pop	action
	      and appended to the event	store of REVERSE with the add  action.
	      The  loop	terminates when	all strings have been removed from the
	      event store of TEST (i.e., the  getsize  action  reports	0  for
	      event  store  size).  Finally, the event store of	REVERSE	is as-
	      signed to	the %events action list	variable with the copy action,
	      and the fill action is used for overwriting the event  store  of
	      TEST with	the value of %events.

       break  If used inside a while-loop, terminates its execution; otherwise
	      terminates the execution of the entire action list.

       continue
	      If  used	inside	a while-loop, starts the next iteration	of the
	      loop; otherwise terminates the execution of  the	entire	action
	      list.

       Examples:

       Follow the /var/log/trapd.log file and feed to SEC input	all lines that
       are appended to the file:

       action=spawn /bin/tail -f /var/log/trapd.log

       Mail the	timestamp and the value	of the $0 variable to the local	root:

       action=pipe '%t:	$0' /bin/mail -s "alert	message" root@localhost

       Add  the	 value	of  the	 $0 variable to	the event store	of the context
       ftp_<the	value of $1>, and set the context to expire after 30  minutes.
       When  the  context expires, its event store will	be mailed to the local
       root:

       action=add ftp_$1 $0; \
	      set ftp_$1 1800 (report ftp_$1 /bin/mail root@localhost)

       Create a	subroutine for weeding out comment lines from the input	 list,
       and use this subroutine for removing comment lines from the event store
       of the context C1:

       action=eval %funcptr ( sub { my(@buf) = split(/\n/, $_[0]); \
		   my(@ret) = grep(!/^#/, @buf); return	@ret; }	); \
	      copy C1 %in; call	%out %funcptr %in; fill	C1 %out

       The following action list achieves the same goal	as the previous	action
       list with while and if actions:

       action=getsize %size C1;	while %size ( shift C1 %event; \
	      lcall %nocomment %event -> ( sub { $_[0] !~ /^#/ } ); \
	      if %nocomment ( add C1 %event ); \
	      lcall %size %size	-> ( sub { $_[0]-1; } )	)

PARSING	ISSUES
       As  already noted, SEC context expressions and action lists may contain
       parentheses which are used for grouping and masking purposes. When  SEC
       parses  its configuration, it checks whether parentheses	in context ex-
       pressions and action lists are balanced (i.e., whether each parenthesis
       has a counterpart), since unbalanced parentheses	 introduce  ambiguity.
       This can	cause SEC to reject some legitimate constructs,	e.g.,

       action=eval %o (print ")";)

       is considered an	invalid	action list (however, note that
       action=eval %o (print "()";)
       would  be passed	by SEC,	since now parentheses are balanced).  In order
       to avoid	such parsing errors, each parenthesis  without	a  counterpart
       must  be	 masked	with a backslash (the backslash	will be	removed	by SEC
       during configuration file parsing). For example,	the above action could
       be written as

       action=eval %o (print "\)";)

RULE TYPES
       This section provides a detailed	discussion of SEC rule types.

   SINGLE RULE
       The Single rule supports	the following fields.  Note that  match	 vari-
       ables may be used in context, desc, and action fields.

       type   fixed  to	Single (value is case insensitive, so single or	sIngLe
	      can be used instead).

       continue	(optional)
	      TakeNext,	DontCont, EndMatch or GoTo <label>  (apart  from  <la-
	      bel>, values are case insensitive).

       ptype  pattern type (value is case insensitive).

       pattern
	      pattern.

       varmap (optional)
	      variable map.

       context (optional)
	      context expression.

       desc   operation	description string.

       action action list.

       rem (optional, may appear more than once)
	      remarks and comments.

       The  Single  rule immediately executes an action	list when an event has
       matched the rule.  An event matches the rule if the pattern matches the
       event and the context expression	(if given) evaluates TRUE.

       Note that the Single rule does not start	event correlation  operations,
       and  the	desc field is merely used for setting the %s action list vari-
       able.

       Examples:

       type=single
       continue=takenext
       ptype=regexp
       pattern=ftpd\[(\d+)\]: \S+ \(ristov2.*FTP session opened
       desc=ftp	session	opened for ristov2 pid $1
       action=create ftp_$1

       type=single
       continue=takenext
       ptype=regexp
       pattern=ftpd\[(\d+)\]:
       context=ftp_$1
       desc=ftp	session	event for ristov2 pid $1
       action=add ftp_$1 $0; set ftp_$1	1800 \
		(report	ftp_$1 /bin/mail root@localhost)

       type=single
       ptype=regexp
       pattern=ftpd\[(\d+)\]: \S+ \(ristov2.*FTP session closed
       desc=ftp	session	closed for ristov2 pid $1
       action=report ftp_$1 /bin/mail root@localhost; \
	      delete ftp_$1

       This ruleset is created for monitoring the ftpd log  file.   The	 first
       rule creates the	context	ftp_<pid> when someone connects	from host ris-
       tov2 over FTP and establishes a new ftp session (the session is identi-
       fied by the PID of the process which has	been created for handling this
       session).  The second rule adds all further log file lines for the ses-
       sion <pid> to the event store of	the context ftp_<pid> (before adding a
       line, the rule checks if	the context exists). After adding a line,  the
       rule extends context's lifetime for 30 minutes and sets the action list
       that  will  be  executed	when the context expires. The third rule mails
       collected log file lines	to root@localhost when the  session  <pid>  is
       closed.	Collected lines	will also be mailed when the session <pid> has
       been inactive for 30 minutes (no	log file lines observed	for that  ses-
       sion).

       Note  that  the	log  file line that has	matched	the first rule is also
       matched against the second rule (since the first	rule has the  continue
       field  set  to  TakeNext).   Since  the second rule always matches this
       line, it	will become the	first line in the event	 store	of  ftp_<pid>.
       The second rule has also	its continue field set to TakeNext, since oth-
       erwise no log file lines	would reach the	third rule.

   SINGLEWITHSCRIPT RULE
       The  SingleWithScript  rule  supports  the following fields.  Note that
       match variables may be used in context, script, desc, action,  and  ac-
       tion2 fields.

       type   fixed to SingleWithScript	(value is case insensitive).

       continue	(optional)
	      TakeNext,	 DontCont,  EndMatch  or GoTo <label> (apart from <la-
	      bel>, values are case insensitive).

       ptype  pattern type (value is case insensitive).

       pattern
	      pattern.

       varmap (optional)
	      variable map.

       context (optional)
	      context expression.

       script command line of external program.

       shell (optional)
	      Yes or No	(values	are case insensitive, default is Yes).

       desc   operation	description string.

       action action list.

       action2 (optional)
	      action list.

       rem (optional, may appear more than once)
	      remarks and comments.

       The SingleWithScript rule forks a process  for  executing  an  external
       program	when  an  event	has matched the	rule.  The command line	of the
       external	program	is defined by the script field.

       If the shell field is set to Yes	(this is  the  default),  the  command
       line  of	 the  external	program	will be	parsed by shell	if the command
       line contains shell metacharacters.  If the shell field is set  to  No,
       command	line is	not parsed by shell, but split into arguments by using
       whitespace as a separator, and passed to	execvp(3) for execution.  Note
       that  splitting into arguments is done when command line	is loaded from
       the configuration file and parsed, not at  runtime  (e.g.,  if  command
       line  is	/usr/local/bin/mytool $1 $2, the values	of $1 and $2 variables
       are regarded as single arguments	even  if  the  values  contain	white-
       space).

       The  names  of all currently existing contexts are written to the stan-
       dard input of the program.  After the program has been forked, the rule
       matching	continues immediately, and the program status will be  checked
       periodically  until  the	 program exits.	 If the	program	returns	0 exit
       status, the action list defined by the action field is executed;	other-
       wise the	action list defined by	the  action2  field  is	 executed  (if
       given).

       Note  that  the	SingleWithScript rule does not start event correlation
       operations, and the desc	field is merely	used for setting the %s	action
       list variable.

       Examples:

       type=SingleWithScript
       ptype=RegExp
       pattern=interface ([\d.]+) down
       script=/bin/ping	-c 3 -q	$1
       desc=Check if $1	responds to ping
       action=logonly Interface	$1 reported down, but is pingable
       action2=pipe '%t: Interface $1 is down' /bin/mail root@localhost

       When "interface <ipaddress> down"  line	appears	 in  input,  the  rule
       checks if <ipaddress> responds to ping. If <ipaddress> is pingable, the
       message	"Interface  <ipaddress>	 reported  down,  but  is pingable" is
       logged; otherwise an e-mail warning containing a	 human-readable	 time-
       stamp is	sent to	root@localhost.

   SINGLEWITHSUPPRESS RULE
       The  SingleWithSuppress	rule supports the following fields.  Note that
       match variables may be used in context, desc, and action	fields.

       type   fixed to SingleWithSuppress (value is case insensitive).

       continue	(optional)
	      TakeNext,	DontCont, EndMatch or GoTo <label>  (apart  from  <la-
	      bel>, values are case insensitive).

       ptype  pattern type (value is case insensitive).

       pattern
	      pattern.

       varmap (optional)
	      variable map.

       context (optional)
	      context expression.

       desc   operation	description string.

       action action list.

       window event correlation	window size (value is an integer constant).

       rem (optional, may appear more than once)
	      remarks and comments.

       The  SingleWithSuppress rule runs event correlation operations for fil-
       tering repeated instances of the	same event during T seconds. The value
       of T is defined by the window field.

       When an event has matched the rule, SEC	evaluates  the	operation  de-
       scription  string  given	 with the desc field. If the operation for the
       given string and	rule does not exist, SEC will create it	with the life-
       time of T seconds, and the operation  immediately  executes  an	action
       list.  If  the operation	exists,	it consumes the	matching event without
       any action.

       Examples:

       type=SingleWithSuppress
       ptype=RegExp
       pattern=(\S+): [fF]ile system full
       desc=File system	$1 full
       action=pipe '%t:	%s' /bin/mail root@localhost
       window=900

       This rule runs event correlation	operations for processing "file	system
       full" syslog messages, e.g.,

       Dec 16 14:26:09 test ufs: [ID 845546 kern.notice] NOTICE: alloc:	 /var:
       file system full

       When  the  first	message	for a file system is observed, an operation is
       created which sends  an	e-mail	warning	 about	this  file  system  to
       root@localhost.	 The  operation	 will  then  run  for  900 seconds and
       silently	consume	further	messages for the *same*	file system.  However,
       if a message for	a different file system	is observed, another operation
       will be started which sends a warning to	 root@localhost	 again	(since
       the  desc  field	 contains the $1 match variable	which evaluates	to the
       file system name).

   PAIR	RULE
       The Pair	rule supports the following fields.  Note that match variables
       may be used in context, desc, action, pattern2,	context2,  desc2,  and
       action2 fields.

       type   fixed to Pair (value is case insensitive).

       continue	(optional)
	      TakeNext,	 DontCont,  EndMatch  or GoTo <label> (apart from <la-
	      bel>, values are case insensitive). Specifies the	 point-of-con-
	      tinue after a match by pattern and context.

       ptype  pattern type for pattern (value is case insensitive).

       pattern
	      pattern.

       varmap (optional)
	      variable map for pattern.

       context (optional)
	      context expression, evaluated together with pattern.

       desc   operation	description string.

       action action list.

       continue2 (optional)
	      TakeNext,	 DontCont,  EndMatch  or GoTo <label> (apart from <la-
	      bel>, values are case insensitive). Specifies the	 point-of-con-
	      tinue after a match by pattern2 and context2.

       ptype2 pattern type for pattern2	(value is case insensitive).

       pattern2
	      pattern.

       varmap2 (optional)
	      variable map for pattern2.

       context2	(optional)
	      context expression, evaluated together with pattern2.

       desc2  format string that sets the %s variable for action2.

       action2
	      action list.

       window (optional)
	      event correlation	window size (value is an integer constant).

       rem (optional, may appear more than once)
	      remarks and comments.

       The  Pair  rule	runs event correlation operations for processing event
       pairs during T seconds. The value of T is defined by the	window	field.
       Default value is	0 which	means infinity.

       When  an	 event	has  matched the conditions defined by the pattern and
       context field, SEC evaluates the	 operation  description	 string	 given
       with  the  desc	field.	If the operation for the given string and rule
       exists, it consumes the matching	event without any action. If the oper-
       ation does not exist, SEC will create it	with the lifetime  of  T  sec-
       onds,  and the operation	immediately executes an	action list defined by
       the action field. SEC will also copy the	match  conditions  given  with
       the  pattern2  and  context2  field  into the operation,	and substitute
       match variables with their values in copied conditions.

       If the event does not match conditions defined by the pattern and  con-
       text  field,  SEC  will	check  the  match conditions of	all operations
       started by the given rule. Each matching	operation executes the	action
       list given with the action2 field and finishes.

       If  match  variables  are set when the operation	matches	an event, they
       are made	available as $-prefixed	match variables	 in  context2,	desc2,
       and  action2  fields  of	 the rule definition. For example, if pattern2
       field is	a regular expression, then $1 in the desc2  field  is  set  by
       pattern2.   In  order  to access	match variables	set by pattern,	%-pre-
       fixed match variables have to be	used in	context2, desc2,  and  action2
       fields.	For  example, if pattern and pattern2 are regular expressions,
       then %1 in the desc2 field refers to the	value set by the first capture
       group in	pattern	(i.e., it has the same value as	$1 in the desc field).

       Examples:

       type=Pair
       ptype=RegExp
       pattern=kernel: nfs: server (\S+) not responding, still trying
       desc=Server $1 is not responding
       action=pipe '%t:	%s' /bin/mail root@localhost
       ptype2=SubStr
       pattern2=kernel:	nfs: server $1 OK
       desc2=Server $1 is responding again
       action2=logonly
       window=3600

       This rule runs event correlation	operations for processing NFS  "server
       not responding" and "server OK" syslog messages,	e.g.,

       Dec  18	22:39:48  test	kernel:	nfs: server box1 not responding, still
       trying
       Dec 18 22:42:27 test kernel: nfs: server	box1 OK

       When the	"server	not responding"	message	for an NFS server is observed,
       an operation is created for this	server which sends an  e-mail  warning
       about  the  server  to root@localhost.  The operation will then run for
       3600 seconds and	silently consume further "server not responding"  mes-
       sages  for the same server. If this operation observes "server OK" mes-
       sage for	the *same* server, it will log the  message  "Server  <server-
       name> is	responding again" and finish.

       For example, if SEC observes the	following event	at 22:39:48

       Dec  18	22:39:48  test	kernel:	nfs: server box1 not responding, still
       trying

       an event	correlation operation is created for server box1 which	issues
       an e-mail warning about this server immediately.	After that, the	opera-
       tion  will  run for 3600	seconds	(until 23:39:48), waiting for an event
       which would contain the substring "kernel: nfs: server  box1  OK"  (be-
       cause the pattern2 field	contains the $1	match variable which evaluates
       to the server name).

       If  any	further	 error messages	appear for server box1 during the 3600
       second lifetime of the operation, e.g.,

       Dec 18 22:40:28 test kernel: nfs: server	 box1  not  responding,	 still
       trying
       Dec  18	22:41:09  test	kernel:	nfs: server box1 not responding, still
       trying

       these messages will be silently consumed	by the operation.   If	before
       its  expiration the operation observes an event which contains the sub-
       string  "kernel:	nfs: server box1 OK", e.g.,

       Dec 18 22:42:27 test kernel: nfs: server	box1 OK

       the operation will log the message "Server box1	is  responding	again"
       and  terminate immediately.  If no such message appears during the 3600
       second lifetime of the operation, the  operation	 will  expire  without
       taking any action. Please note that if the window field would be	either
       removed from the	rule definition	or set to 0, the operation would never
       silently	 expire,  but  would  terminate	 only after observing an event
       which contains the substring  "kernel: nfs: server box1 OK".

       If the above rule is modified in	the following way

       type=Pair
       ptype=RegExp
       pattern=^([[:alnum:]: ]+) \S+ kernel: nfs: server (\S+) not responding,
       still trying
       desc=Server $2 is not responding
       action=logonly
       ptype2=RegExp
       pattern2=^([[:alnum:]: ]+) \S+ kernel: nfs: server $2 OK
       desc2=Server %2 was not accessible from %1 to $1
       action2=pipe '%s' /bin/mail root@localhost
       window=86400

       this rule will run event	correlation operations which report NFS	server
       downtime	to root@localhost via e-mail, provided that downtime does  not
       exceed 24 hours (86400 seconds).

       For example, if SEC observes the	following event

       Dec 18 23:01:17 test kernel: nfs: server	box.test not responding, still
       trying

       then  the  rule	matches	 this event, sets $1 match variable to "Dec 18
       23:01:17" and $2	to "box.test", and creates an event correlation	opera-
       tion for	server box.test.  This operation will start its	work  by  log-
       ging the	message	"Server	box.test is not	responding", and will then run
       for  86400  seconds, waiting for	an event which would match the regular
       expression

       ^([[:alnum:]: ]+) \S+ kernel: nfs: server box\.test OK

       Note that this expression was created from the regular expression  tem-
       plate  in the pattern2 field by substituting the	match variable $2 with
       its value. However, since the string "box.test" contains	 the  dot  (.)
       character  which	 is  a	regular	 expression  metacharacter, the	dot is
       masked with the backslash in the	regular	expression.

       Suppose SEC will	then observe the event

       Dec 18 23:09:54 test kernel: nfs: server	box.test OK

       This event matches the above regular expression which is	 used  by  the
       operation  running  for	server	box.test. Also,	the regular expression
       match sets the $1 variable to "Dec 18 23:09:54" and unsets the $2 vari-
       able. In	order to refer to their	original values	when the operation was
       created,	%1 and %2 match	variables have to be used in the  desc2	 field
       (%1  equals  to	"Dec 18	23:01:17" and %2 equals	to "box.test").	There-
       fore, the operation will	send the e-mail	message	"Server	 box.test  was
       not  accessible from Dec	18 23:01:17 to Dec 18 23:09:54"	to root@local-
       host, and will terminate	immediately.

   PAIRWITHWINDOW RULE
       The PairWithWindow rule supports	the following fields.  Note that match
       variables may be	used in	context,  desc,	 action,  pattern2,  context2,
       desc2, and action2 fields.

       type   fixed to PairWithWindow (value is	case insensitive).

       continue	(optional)
	      TakeNext,	 DontCont,  EndMatch  or GoTo <label> (apart from <la-
	      bel>, values are case insensitive). Specifies the	 point-of-con-
	      tinue after a match by pattern and context.

       ptype  pattern type for pattern (value is case insensitive).

       pattern
	      pattern.

       varmap (optional)
	      variable map for pattern.

       context (optional)
	      context expression, evaluated together with pattern.

       desc   operation	description string.

       action action list.

       continue2 (optional)
	      TakeNext,	 DontCont,  EndMatch  or GoTo <label> (apart from <la-
	      bel>, values are case insensitive). Specifies the	 point-of-con-
	      tinue after a match by pattern2 and context2.

       ptype2 pattern type for pattern2	(value is case insensitive).

       pattern2
	      pattern.

       varmap2 (optional)
	      variable map for pattern2.

       context2	(optional)
	      context expression, evaluated together with pattern2.

       desc2  format string that sets the %s variable for action2.

       action2
	      action list.

       window event correlation	window size (value is an integer constant).

       rem (optional, may appear more than once)
	      remarks and comments.

       The  PairWithWindow rule	runs event correlation operations for process-
       ing event pairs during T	seconds. The value of T	is defined by the win-
       dow field.

       When an event has matched the conditions	defined	 by  the  pattern  and
       context	field,	SEC  evaluates	the operation description string given
       with the	desc field.  If	the operation for the given  string  and  rule
       exists, it consumes the matching	event without any action. If the oper-
       ation  does  not	 exist,	SEC will create	it with	the lifetime of	T sec-
       onds.  SEC will also copy the match conditions given with the  pattern2
       and  context2  field into the operation,	and substitute match variables
       with their values in copied conditions.

       If the event does not match conditions defined by the pattern and  con-
       text  field,  SEC  will	check  the  match conditions of	all operations
       started by the given rule. Each matching	operation executes the	action
       list  given  with the action2 field and finishes.  If the operation has
       not observed a matching event by	the end	of its lifetime,  it  executes
       the action list given with the action field before finishing.

       If  match  variables  are set when the operation	matches	an event, they
       are made	available as $-prefixed	match variables	 in  context2,	desc2,
       and  action2  fields  of	 the rule definition. For example, if pattern2
       field is	a regular expression, then $1 in the desc2  field  is  set  by
       pattern2.   In  order  to access	match variables	set by pattern,	%-pre-
       fixed match variables have to be	used in	context2, desc2,  and  action2
       fields.	For  example, if pattern and pattern2 are regular expressions,
       then %1 in the desc2 field refers to the	value set by the first capture
       group in	pattern	(i.e., it has the same value as	$1 in the desc field).

       Examples:

       type=PairWithWindow
       ptype=RegExp
       pattern=sshd\[\d+\]: Failed .+ for (\S+)	from ([\d.]+) port \d+ ssh2
       desc=User $1 has	been unable to log in from $2 over SSH during 1	minute
       action=pipe '%t:	%s' /bin/mail root@localhost
       ptype2=RegExp
       pattern2=sshd\[\d+\]: Accepted .+ for $1	from $2	port \d+ ssh2
       desc2=SSH login successful for %1 from %2 after initial failure
       action2=logonly
       window=60

       This rule runs event correlation	operations for	processing  SSH	 login
       events, e.g.,

       Dec  27	19:00:24  test	sshd[10526]:  Failed  password	for risto from
       10.1.2.7	port 52622 ssh2
       Dec 27 19:00:27 test sshd[10526]:  Accepted  password  for  risto  from
       10.1.2.7	port 52622 ssh2

       When  an	 SSH login failure is observed for a user name and a source IP
       address,	an operation is	created	for this user name and IP address com-
       bination	which will expect a successful login for the *same* user  name
       and  *same*  IP address during 60 seconds.  If the user will not	log in
       from the	same IP	address	during 60 seconds, the operation will send  an
       e-mail  warning	to  root@localhost before finishing, otherwise it will
       log the message "SSH login successful for <username>  from  <ipaddress>
       after initial failure" and finish.

       Suppose	the  following events are generated by an SSH daemon, and each
       event timestamp reflects	the time SEC observes the event:

       Dec 30 13:02:01	test  sshd[30517]:  Failed  password  for  risto  from
       10.1.2.7	port 42172 ssh2
       Dec  30	13:02:30  test	sshd[30810]:  Failed  password	for  root from
       192.168.1.104 port 46125	ssh2
       Dec 30 13:02:37	test  sshd[30517]:  Failed  password  for  risto  from
       10.1.2.7	port 42172 ssh2
       Dec  30	13:02:59  test	sshd[30810]:  Failed  password	for  root from
       192.168.1.104 port 46125	ssh2
       Dec 30 13:03:04 test  sshd[30810]:  Accepted  password  for  root  from
       192.168.1.104 port 46125	ssh2

       When  the  first	event is observed at 13:02:01, an operation is started
       for user	risto and IP address 10.1.2.7 which will expect	 a  successful
       login  for  risto from 10.1.2.7.	The operation will run for 60 seconds,
       waiting for an event which would	match the regular expression

       sshd\[\d+\]: Accepted .+	for risto from 10\.1\.2\.7 port	\d+ ssh2

       Note that this expression was created from the regular expression  tem-
       plate  in  the pattern2 field by	substituting match variables $1	and $2
       with their values. However, since the value of $2 contains the dot  (.)
       characters  which  are  regular	expression metacharacters, each	dot is
       masked with the backslash in the	regular	expression.

       When the	second event is	observed at  13:02:30,	another	 operation  is
       started	for  user  root	and IP address 192.168.1.104 which will	expect
       root to log in successfully from	192.168.1.104. This operation will run
       for 60 seconds, waiting for an event matching the regular expression

       sshd\[\d+\]: Accepted .+	for root from 192\.168\.1\.104 port \d+	ssh2

       The third event at 13:02:37 represents a	second login failure for  user
       risto  and  IP  address 10.1.2.7, and is	silently consumed by the first
       operation. Likewise, the	fourth event at	13:02:59 is silently  consumed
       by  the	second operation.  The first operation will run	until 13:03:01
       and then	expire without	seeing	a  successful  login  for  risto  from
       10.1.2.7. Before	terminating, the operation will	send an	e-mail warning
       to  root@localhost  that	 user  risto  has  not	managed	to log in from
       10.1.2.7	during one minute.  At 13:03:04, the second operation will ob-
       serve an	event which matches its	regular	expression

       sshd\[\d+\]: Accepted .+	for root from 192\.168\.1\.104 port \d+	ssh2

       After seeing this event,	the operation will log the message "SSH	 login
       successful  for root from 192.168.1.104 after initial failure" and ter-
       minate immediately.  Please note	that the match by the regular  expres-
       sion

       sshd\[\d+\]: Accepted .+	for root from 192\.168\.1\.104 port \d+	ssh2

       sets the	$1 match variable to 1 and unsets $2. Therefore, the %1	and %2
       match  variables	 have to be used in the	desc2 field, in	order to refer
       to the original values of $1 (root) and $2 (192.168.1.104) when the op-
       eration was created.

   SINGLEWITHTHRESHOLD RULE
       The SingleWithThreshold rule supports the following fields.  Note  that
       match  variables	 may  be  used	in  context, desc, action, and action2
       fields.

       type   fixed to SingleWithThreshold (value is case insensitive).

       continue	(optional)
	      TakeNext,	DontCont, EndMatch or GoTo <label>  (apart  from  <la-
	      bel>, values are case insensitive).

       ptype  pattern type (value is case insensitive).

       pattern
	      pattern.

       varmap (optional)
	      variable map.

       context (optional)
	      context expression.

       desc   operation	description string.

       action action list.

       action2 (optional)
	      action list.

       window event correlation	window size (value is an integer constant).

       thresh counting threshold (value	is an integer constant).

       rem (optional, may appear more than once)
	      remarks and comments.

       The  SingleWithThreshold	 rule  runs  event  correlation	operations for
       counting	repeated instances of the same event  during  T	 seconds,  and
       taking  an  action if N events are observed.  The values	of T and N are
       defined by the window and thresh	field, respectively.

       When an event has matched the rule, SEC	evaluates  the	operation  de-
       scription  string  given	 with the desc field. If the operation for the
       given string and	rule does not exist, SEC will create it	with the life-
       time of T seconds. The operation	will memorize the occurrence  time  of
       the  event  (current  time as returned by the time(2) system call), and
       compare the number of memorized occurrence times	with the threshold  N.
       If the operation	has observed N events, it executes the action list de-
       fined  by  the  action  field, and consumes all further matching	events
       without any action. If the rule has an  optional	 action	 list  defined
       with the	action2	field, the operation will execute it before finishing,
       provided	that the action	list given with	action has been	previously ex-
       ecuted  by  the	operation. Note	that  a	sliding	window is employed for
       event counting -- if the	operation has observed less than N  events  by
       the end of its lifetime,	it drops occurrence times which	are older than
       T seconds, and extends its lifetime for T seconds from the earliest re-
       maining	occurrence  time.  If there are	no remaining occurrence	times,
       the operation finishes without executing	an action list.

       Examples:

       type=SingleWithThreshold
       ptype=RegExp
       pattern=sshd\[\d+\]: Failed .+ for (\S+)	from [\d.]+ port \d+ ssh2
       desc=Three SSH login failures within 1m for user	$1
       action=pipe '%t:	%s' /bin/mail root@localhost
       window=60
       thresh=3

       This rule runs event correlation	operations for counting	the number  of
       SSH  login  failure  events.  Each operation counts events for one user
       name, and if the	operation has observed three login failures within  60
       seconds,	it sends an e-mail warning to root@localhost.

       Suppose	the  following events are generated by an SSH daemon, and each
       event timestamp reflects	the time SEC observes the event:

       Dec 28 01:42:21	test  sshd[28132]:  Failed  password  for  risto  from
       10.1.2.7	port 42172 ssh2
       Dec  28	01:43:10  test	sshd[28132]:  Failed  password	for risto from
       10.1.2.7	port 42172 ssh2
       Dec 28 01:43:29	test  sshd[28132]:  Failed  password  for  risto  from
       10.1.2.7	port 42172 ssh2
       Dec  28	01:44:00  test	sshd[28149]:  Failed  password for risto2 from
       10.1.2.7	port 42176 ssh2
       Dec 28 01:44:03	test  sshd[28211]:  Failed  password  for  risto  from
       10.1.2.7	port 42192 ssh2
       Dec  28	01:44:07  test	sshd[28211]:  Failed  password	for risto from
       10.1.2.7	port 42192 ssh2

       When the	first event is observed	at 01:42:21, a counting	 operation  is
       started	for  user  risto,  with	its event correlation window ending at
       01:43:21.  Since	by 01:43:21 two	SSH login failures for user risto have
       occurred, the threshold condition remains unsatisfied  for  the	opera-
       tion.  Therefore, the beginning of its event correlation	window will be
       moved  to  01:43:10  (the occurrence time of the	second event), leaving
       the first event outside the window.  At 01:44:00, another counting  op-
       eration	is  started  for user risto2.  The threshold condition for the
       first operation will become satisfied at	01:44:03 (since	the  operation
       has  seen three login failure events for	user risto within 60 seconds),
       and thus	an e-mail warning will be issued. Finally, the event occurring
       at 01:44:07 will	be consumed silently by	the first operation (the oper-
       ation will run until 01:44:10).	Since there will be no	further	 login
       failure	events	for user risto2, the second operation will exist until
       01:45:00	without	taking any action.

   SINGLEWITH2THRESHOLDS RULE
       The SingleWith2Thresholds rule supports	the  following	fields.	  Note
       that  match  variables may be used in context, desc, action, desc2, and
       action2 fields.

       type   fixed to SingleWith2Thresholds (value is case insensitive).

       continue	(optional)
	      TakeNext,	DontCont, EndMatch or GoTo <label>  (apart  from  <la-
	      bel>, values are case insensitive).

       ptype  pattern type (value is case insensitive).

       pattern
	      pattern.

       varmap (optional)
	      variable map.

       context (optional)
	      context expression.

       desc   operation	description string.

       action action list.

       window event correlation	window size (value is an integer constant).

       thresh counting threshold.

       desc2  format string that sets the %s variable for action2.

       action2
	      action list.

       window2
	      event correlation	window size (value is an integer constant).

       thresh2
	      counting threshold.

       rem (optional, may appear more than once)
	      remarks and comments.

       The  SingleWith2Thresholds rule runs event correlation operations which
       take action if N1 events	have been observed in the window  of  T1  sec-
       onds,  and  then	at most	N2 events will be observed in the window of T2
       seconds.	 The values of T1, N1, T2, and N2 are defined by  the  window,
       thresh, window2,	and thresh2 field, respectively.

       When  an	 event	has  matched the rule, SEC evaluates the operation de-
       scription string	given with the desc field. If the  operation  for  the
       given string and	rule does not exist, SEC will create it	with the life-
       time  of	T1 seconds. The	operation will memorize	the occurrence time of
       the event (current time as returned by the time(2)  system  call),  and
       compare the number of memorized occurrence times	with the threshold N1.
       If  the	operation  has observed	N1 events, it executes the action list
       defined by the action field, and	starts another counting	round  for  T2
       seconds.	  If  no  more than N2 events have been	observed by the	end of
       the window, the operation executes the action list defined by  the  ac-
       tion2  field  and  finishes.  Note that both windows are	sliding	-- the
       first window slides like	the window of the  SingleWithThreshold	opera-
       tion,  while  the beginning of the second window	is moved to the	second
       earliest	memorized event	occurrence time	when the threshold N2 is  vio-
       lated.

       Examples:

       type=SingleWith2Thresholds
       ptype=RegExp
       pattern=(\S+): %SYS-3-CPUHOG
       desc=Router $1 CPU overload
       action=pipe '%t:	%s' /bin/mail root@localhost
       window=300
       thresh=2
       desc2=Router $1 CPU load	has been normal	for 1h
       action2=logonly
       window2=3600
       thresh2=0

       When  a SYS-3-CPUHOG syslog message is received from a router, the rule
       starts a	counting operation for this router which sends an e-mail warn-
       ing to root@localhost if	another	such message is	received from the same
       router within 300 seconds. After	sending	 the  warning,	the  operation
       will  continue  to  run until no	SYS-3-CPUHOG syslog messages have been
       received	from the router	for 3600 seconds. When this condition  becomes
       satisfied,  the operation will log the message "Router <routername> CPU
       load has	been normal for	1h" and	finish.

       Suppose the following events are	generated by a router, and each	 event
       timestamp reflects the time SEC observes	the event:

       Dec 30 12:23:25 router1.mydomain	Router1: %SYS-3-CPUHOG:	cpu is hogged
       Dec 30 12:25:38 router1.mydomain	Router1: %SYS-3-CPUHOG:	cpu is hogged
       Dec 30 12:28:53 router1.mydomain	Router1: %SYS-3-CPUHOG:	cpu is hogged

       When  the  first	event is observed at 12:23:25, a counting operation is
       started for router Router1. The	appearance  of	the  second  event  at
       12:25:38	 fulfills  the	threshold  condition given with	the thresh and
       window fields (two events  have	been  observed	within	300  seconds).
       Therefore,  the	operation  will	 send  an e-mail warning about the CPU
       overload	of Router1 to root@localhost.

       After that, the operation will start another counting round,  expecting
       to  see no SYS-3-CPUHOG events (since thresh2=0)	for Router1 during the
       following 3600 seconds (the beginning of	the operation's	event correla-
       tion window will	be moved to 12:25:38 for the second  counting  round).
       Since  the  appearance  of  the	third  event  at 12:28:53 violates the
       threshold condition given with the thresh2 and window2 fields, the  be-
       ginning	of  the	 event	correlation  window will be moved to 12:28:53.
       Since there will	be no further SYS-3-CPUHOG messages for	 Router1,  the
       operation  will run until 13:28:53 and then expire, logging the message
       "Router Router1 CPU load	has been normal	for 1h"	before finishing.

   EVENTGROUP RULE
       The EventGroup rule supports the	following  fields.   Note  that	 match
       variables  may  be  used	 in  context*, count*, egtoken*, desc, action,
       init, end, and slide fields.

       type   EventGroup[N] (value is case insensitive,	N defaults to 1).

       continue	(optional)
	      TakeNext,	DontCont, EndMatch or GoTo <label>  (apart  from  <la-
	      bel>,  values are	case insensitive). Specifies the point-of-con-
	      tinue after a match by pattern and context.

       ptype  pattern type for pattern (value is case insensitive).

       pattern
	      pattern.

       varmap (optional)
	      variable map for pattern.

       context (optional)
	      context expression, evaluated together with pattern.

       count (optional)
	      action list for execution	after a	match by pattern and context.

       thresh (optional)
	      counting threshold for events matched  by	 pattern  and  context
	      (value is	an integer constant, default is	1).

       egtoken (optional)
	      token  for  building the event group string that is matched with
	      egpattern	(default value is 1).

       ...

       continueN (optional)
	      TakeNext,	DontCont, EndMatch or GoTo <label>  (apart  from  <la-
	      bel>,  values are	case insensitive). Specifies the point-of-con-
	      tinue after a match by patternN and contextN.

       ptypeN pattern type for patternN	(value is case insensitive).

       patternN
	      pattern.

       varmapN (optional)
	      variable map for patternN.

       contextN	(optional)
	      context expression, evaluated together with patternN.

       countN (optional)
	      action list for execution	after a	match  by  patternN  and  con-
	      textN.

       threshN (optional)
	      counting	threshold  for events matched by patternN and contextN
	      (value is	an integer constant, default is	1).

       egtokenN	(optional)
	      token for	building the event group string	that is	 matched  with
	      egpattern	(default value is N).

       desc   operation	description string.

       action action list.

       init (optional)
	      action list.

       end (optional)
	      action list.

       slide (optional)
	      action list.

       multact (optional)
	      Yes or No	(values	are case insensitive, default is No).

       egptype (optional)
	      SubStr,  NSubStr,	RegExp,	NRegExp, PerlFunc or NPerlFunc (values
	      are case insensitive).  Specifies	the pattern  type  for	egpat-
	      tern.

       egpattern (optional)
	      event group pattern.

       window event correlation	window size (value is an integer constant).

       rem (optional, may appear more than once)
	      remarks and comments.

       The  EventGroup rule runs event correlation operations for counting re-
       peated instances	of N different events e1,...,eN	during T seconds,  and
       taking an action	if threshold conditions	c1,...,cN for *all* events are
       satisfied  (i.e.,  for  each  event  eK there are at least cK event in-
       stances in the window).	Note that the event correlation	window of  the
       EventGroup  operation  is  sliding  like	 the window of the SingleWith-
       Threshold operation.

       Event e1	is described with the pattern and context field, event	e2  is
       described  with the pattern2 and	context2 field,	etc.  The values for N
       and T are defined by the	type and window	field, respectively. The value
       for c1 is given with the	thresh field, the value	for c2 is  given  with
       the thresh2 field, etc.	Values for N and c1,...,cN default to 1.

       In  order  to  match an event with the rule, pattern and	context	fields
       are evaluated first. If they don't match	the event, then	 pattern2  and
       context2	 are  evaluated,  etc. If all N	conditions are tried without a
       success,	the event doesn't match	the rule.

       When an event has matched the rule, SEC	evaluates  the	operation  de-
       scription  string  given	 with the desc field. If the operation for the
       given string and	rule does not exist, SEC will create it	with the life-
       time of T seconds. The operation	will memorize the occurrence  time  of
       the  event  (current  time as returned by the time(2) system call), and
       compare the number of memorized occurrence times	for each eK  with  the
       threshold  cK (i.e., the	number of observed instances of	eK is compared
       with the	threshold cK).	If all threshold conditions are	satisfied, the
       operation executes the action list defined by  the  action  field,  and
       consumes	 all  further  matching	events without re-executing the	action
       list if the multact field is set	to No (this is the default).  However,
       if multact is set to Yes, the operation will re-evaluate	the  threshold
       conditions  on  every  further  matching	event, re-executing the	action
       list given with the action field	if all conditions are  satisfied,  and
       sliding	the  event correlation window forward when the window is about
       to expire (if no	events remain in the window, the operation  will  fin-
       ish).

       For example, consider the following rule:

       type=EventGroup2
       ptype=SubStr
       pattern=EVENT_A
       thresh=2
       ptype2=SubStr
       pattern2=EVENT_B
       thresh2=2
       desc=Sequence of	two or more As and Bs observed within 60 seconds
       action=write - %s
       window=60

       Also,  suppose the following events occur, and each event timestamp re-
       flects the time SEC observes the	event:

       Mar 10 12:03:01 EVENT_A
       Mar 10 12:03:04 EVENT_B
       Mar 10 12:03:10 EVENT_A
       Mar 10 12:03:11 EVENT_A
       Mar 10 12:03:27 EVENT_B
       Mar 10 12:03:46 EVENT_A
       Mar 10 12:03:59 EVENT_A

       When these events are observed by the above EventGroup2 rule, the  rule
       starts  an  event correlation operation at 12:03:01. Note that although
       the first threshold condition thresh=2  is  satisfied  when  the	 third
       event  appears at 12:03:10, the second threshold	condition thresh2=2 is
       not met,	and therefore the operation will not execute the  action  list
       given with the action field.  When the fifth event appears at 12:03:27,
       all  threshold conditions are finally satisfied,	and the	operation will
       write the string	"Sequence of two or more As and	Bs observed within  60
       seconds"	 to standard output with the write action. Finally, the	events
       occurring at 12:03:46 and 12:03:59 will be consumed silently by the op-
       eration (the operation will run until 12:04:01).

       If multact=yes statement	is added to the	above  EventGroup2  rule,  the
       operation would execute the write action	not only at 12:03:27, but also
       at 12:03:46 and 12:03:59, since all threshold conditions	are still sat-
       isfied  when  the last two events appear	(i.e., the last	two events are
       no longer silently consumed). Also, with	multact=yes the	operation will
       employ sliding window based event processing even after the  write  ac-
       tion  has  been executed	at 12:03:27 (therefore,	the operation will run
       until 12:04:59).

       If the rule definition has an optional event group pattern and its type
       defined with the	egpattern and egptype fields, the event	group  pattern
       is  used	 for  matching the event group string.	The event group	string
       consists	of tokens Xi that are separated	by a single  space  character:
       "X1  X2	...  XM".  M is	the number of events a given event correlation
       operation has observed within its event correlation window.

       If the i-th event that the event	correlation operation has observed  is
       an instance of event eK,	then Xi	is set as follows. If the rule defini-
       tion  has  a  token defined with	the egtokenK field for event eK, Xi is
       set to that token (the token definition	may  contain  match  variables
       that  are substituted with values from matching the current instance of
       eK).  If	the rule does not have the egtokenK field, then	Xi =  K	 (note
       that K is a positive integer).

       Event  group string is built and	matched	with event group pattern after
       all threshold conditions	(given with thresh* fields)  have  been	 found
       satisfied.   In	other  words, the event	group pattern defines an addi-
       tional condition	to numeric threshold conditions.

       Note that the event group pattern and its type are similar  to  regular
       patterns	 and  pattern  types  that  are	given with pattern* and	ptype*
       fields, except the event	group pattern is not setting any  match	 vari-
       ables.  If the egptype field is set to RegExp or	NRegExp, the egpattern
       field  defines  a  regular  expression, while in	the case of SubStr and
       NSubStr egpattern provides a string pattern.

       If the egptype field is set to PerlFunc or NPerlFunc, the Perl function
       given with the egpattern	field is called	in the	Perl  scalar  context,
       with  the function having three parameters: the event group string, the
       reference to the	list of	tokens from the	event group  string,  and  the
       reference  to the list of event occurrence times	that correspond	to to-
       kens.  Each event occurrence time is provided in	seconds	 since	Epoch,
       with  the  first	 element  in the list being the	occurrence time	of the
       event represented by the	first token in the  event  group  string,  the
       second  element in the list being the occurrence	time of	the event rep-
       resented	by the second token in the event group string, etc.

       With egptype=PerlFunc, event group pattern matches if the return	 value
       of  the	function  evaluates true in the	Perl boolean context, while in
       the case	of false the pattern does not match the	 event	group  string.
       With egptype=NPerlFunc, the pattern matching works in the opposite way.

       For example, consider the following rule:

       type=EventGroup2
       ptype=SubStr
       pattern=EVENT_A
       thresh=2
       ptype2=SubStr
       pattern2=EVENT_B
       thresh2=2
       desc=Sequence of	two or more As and Bs with 'A B' at the	end
       action=write - %s
       egptype=RegExp
       egpattern=1 2$
       window=60

       Also,  suppose the following events occur, and each event timestamp re-
       flects the time SEC observes the	event:

       Mar 10 12:05:31 EVENT_B
       Mar 10 12:05:32 EVENT_B
       Mar 10 12:05:38 EVENT_A
       Mar 10 12:05:39 EVENT_A
       Mar 10 12:05:42 EVENT_B

       When these events are observed by the above EventGroup2 rule, the  rule
       starts  an  event  correlation  operation  at 12:05:31. When the	fourth
       event appears at	 12:05:39,  all	 threshold  conditions	(thresh=2  and
       thresh2=2)  become  satisfied,  and therefore the following event group
       string is built from the	first four events:

       2 2 1 1

       However,	since this string does not match the regular expression

       1 2$

       that has	been given with	the egpattern field, the  operation  will  not
       execute	the  action  list  given with the action field.	When the fifth
       event appears at	12:05:42, all threshold	conditions  are	 again	satis-
       fied, and all observed events produce the following event group string:

       2 2 1 1 2

       Since this event	group string matches the regular expression given with
       the  egpattern  field, the operation will write the string "Sequence of
       two or more As and Bs with 'A B'	at the end" to	standard  output  with
       the write action.

       If  the	rule  definition  has an optional action list defined with the
       countK field for	event eK, the operation	executes it every time an  in-
       stance  of  eK is observed (even	if multact is set to No	and the	opera-
       tion has	already	executed the action list given with action).   If  the
       action  list  contains  match  variables,  they	are substituted	before
       *each* execution	with values from matching the current instance of eK.

       If the rule definition has an optional action  list  defined  with  the
       init  field,  the operation executes it immediately after the operation
       has been	created.

       If the rule definition has an optional action list defined with the end
       field, the operation executes it	immediately before the operation  fin-
       ishes.  Note that this action list is *not* executed when the operation
       is terminated with the reset action.

       If  the	rule  definition  has an optional action list defined with the
       slide field, the	operation executes it immediately after	the event cor-
       relation	window has slidden forward.  However,  note  that  moving  the
       window with the setwpos action will *not* trigger the execution.

       Also  note  that	 when the event	correlation window slides forward, the
       event group pattern  (given  with  the  egpattern  field)  and  numeric
       threshold  conditions  (given with thresh* fields) will *not* be	evalu-
       ated for	checking if the	action list given with the action field	should
       be executed.

       Examples:

       The following example rule cross-correlates iptables events, Apache web
       server access log messages with 4xx response codes, and SSH login fail-
       ure events:

       type=EventGroup3
       ptype=RegExp
       pattern=sshd\[\d+\]: Failed .+ for (?:invalid user )?\S+	from  ([\d.]+)
       port \d+	ssh2
       thresh=2
       ptype2=RegExp
       pattern2=^([\d.]+) \S+ \S+ \[.+?\] ".+? HTTP\/[\d.]+" 4\d+
       thresh2=3
       ptype3=RegExp
       pattern3=kernel:	iptables:.* SRC=([\d.]+)
       thresh3=5
       desc=Repeated probing from host $1
       action=pipe '%t:	%s' /bin/mail root@localhost
       window=120

       The rule	starts an event	correlation operation for an IP	address	if SSH
       login  failure  event,  iptables	event, or Apache 4xx event is observed
       for that	IP address. The	operation sends	an e-mail warning to  root@lo-
       calhost	if within 120 seconds three threshold conditions are satisfied
       for the IP address it tracks -- (1) at  least  two  SSH	login  failure
       events  have occurred for this client IP, (2) at	least three Apache 4xx
       events have occurred for	this client IP,	(3)  at	 least	five  iptables
       events have been	observed for this source IP.

       Suppose	the  following events occur, and each event timestamp reflects
       the time	SEC observes the event:

       192.168.1.104  -	 -  [05/Jan/2014:01:11:22   +0200]   "GET   /test.html
       HTTP/1.1"  404  286 "-" "Mozilla/5.0 (X11; Ubuntu; Linux	i686; rv:26.0)
       Gecko/20100101 Firefox/26.0"
       Jan    5	  01:12:52   localhost	 kernel:   iptables:   IN=eth0	  OUT=
       MAC=08:00:27:8e:a1:3a:00:1d:e0:7e:89:b1:08:00	     SRC=192.168.1.104
       DST=192.168.1.107  LEN=60  TOS=0x10  PREC=0x00	TTL=64	 ID=48422   DF
       PROTO=TCP SPT=46351 DPT=21 WINDOW=29200 RES=0x00	SYN URGP=0
       Jan     5   01:12:53   localhost	  kernel:   iptables:	IN=eth0	  OUT=
       MAC=08:00:27:8e:a1:3a:00:1d:e0:7e:89:b1:08:00	     SRC=192.168.1.104
       DST=192.168.1.107   LEN=60   TOS=0x10   PREC=0x00  TTL=64  ID=48423  DF
       PROTO=TCP SPT=46351 DPT=21 WINDOW=29200 RES=0x00	SYN URGP=0
       Jan    5	  01:13:01   localhost	 kernel:   iptables:   IN=eth0	  OUT=
       MAC=08:00:27:8e:a1:3a:00:1d:e0:7e:89:b1:08:00	     SRC=192.168.1.104
       DST=192.168.1.107  LEN=60  TOS=0x10  PREC=0x00	TTL=64	 ID=20048   DF
       PROTO=TCP SPT=44963 DPT=23 WINDOW=29200 RES=0x00	SYN URGP=0
       Jan     5   01:13:02   localhost	  kernel:   iptables:	IN=eth0	  OUT=
       MAC=08:00:27:8e:a1:3a:00:1d:e0:7e:89:b1:08:00	     SRC=192.168.1.104
       DST=192.168.1.107   LEN=60   TOS=0x10   PREC=0x00  TTL=64  ID=20049  DF
       PROTO=TCP SPT=44963 DPT=23 WINDOW=29200 RES=0x00	SYN URGP=0
       Jan    5	  01:13:08   localhost	 kernel:   iptables:   IN=eth0	  OUT=
       MAC=08:00:27:8e:a1:3a:00:1d:e0:7e:89:b1:08:00	     SRC=192.168.1.104
       DST=192.168.1.107  LEN=60  TOS=0x10  PREC=0x00	TTL=64	 ID=36362   DF
       PROTO=TCP SPT=56918 DPT=25 WINDOW=29200 RES=0x00	SYN URGP=0
       Jan     5   01:13:09   localhost	  kernel:   iptables:	IN=eth0	  OUT=
       MAC=08:00:27:8e:a1:3a:00:1d:e0:7e:89:b1:08:00	     SRC=192.168.1.104
       DST=192.168.1.107   LEN=60   TOS=0x10   PREC=0x00  TTL=64  ID=36363  DF
       PROTO=TCP SPT=56918 DPT=25 WINDOW=29200 RES=0x00	SYN URGP=0
       192.168.1.104  -	 -  [05/Jan/2014:01:13:51   +0200]   "GET   /test.html
       HTTP/1.1"  404  286 "-" "Mozilla/5.0 (X11; Ubuntu; Linux	i686; rv:26.0)
       Gecko/20100101 Firefox/26.0"
       192.168.1.104  -	 -  [05/Jan/2014:01:13:54   +0200]   "GET   /test.html
       HTTP/1.1"  404  286 "-" "Mozilla/5.0 (X11; Ubuntu; Linux	i686; rv:26.0)
       Gecko/20100101 Firefox/26.0"
       192.168.1.104  -	 -  [05/Jan/2014:01:14:00  +0200]   "GET   /login.html
       HTTP/1.1"  404  287 "-" "Mozilla/5.0 (X11; Ubuntu; Linux	i686; rv:26.0)
       Gecko/20100101 Firefox/26.0"
       192.168.1.104  -	 -  [05/Jan/2014:01:14:03  +0200]   "GET   /login.html
       HTTP/1.1"  404  287 "-" "Mozilla/5.0 (X11; Ubuntu; Linux	i686; rv:26.0)
       Gecko/20100101 Firefox/26.0"
       192.168.1.104  -	 -  [05/Jan/2014:01:14:03  +0200]   "GET   /login.html
       HTTP/1.1"  404  287 "-" "Mozilla/5.0 (X11; Ubuntu; Linux	i686; rv:26.0)
       Gecko/20100101 Firefox/26.0"
       Jan  5 01:14:11 localhost sshd[1810]: Failed  password  for  root  from
       192.168.1.104 port 46125	ssh2
       Jan   5	01:14:12  localhost  sshd[1810]: Failed	password for root from
       192.168.1.104 port 46125	ssh2
       Jan  5 01:14:18 localhost sshd[1822]: Failed  password  for  root  from
       192.168.1.104 port 46126	ssh2
       Jan   5	01:14:19  localhost  sshd[1822]: Failed	password for root from
       192.168.1.104 port 46126	ssh2
       192.168.1.104  -	 -  [05/Jan/2014:01:14:34   +0200]   "GET   /test.html
       HTTP/1.1"  404  286 "-" "Mozilla/5.0 (X11; Ubuntu; Linux	i686; rv:26.0)
       Gecko/20100101 Firefox/26.0"

       The Apache 4xx event at 01:11:22	starts an event	correlation  operation
       for  192.168.1.104  which  has the event	correlation window of 120 sec-
       onds, thus ending at 01:13:22.  Between 01:12:52	and 01:13:09, six ipt-
       ables events appear for 192.168.1.104, and the appearance of the	 fifth
       event  at  01:13:08  fulfills the third threshold condition (within 120
       seconds,	at least five iptables events have been	observed).

       Since by	01:13:22 (the end of the event correlation  window)  no	 addi-
       tional  events  have occurred, the first	and second threshold condition
       remain unsatisfied.  Therefore, the beginning of	the event  correlation
       window  will  be	moved to 01:12:52 (the occurrence time of the earliest
       event which is at most 120 seconds old).	 As a result, the end  of  the
       window  will  move  from	01:13:22 to 01:14:52.  The only	event which is
       left outside the	window is the Apache 4xx event at 01:11:22,  and  thus
       the threshold condition for iptables events remains satisfied.

       Between	01:13:51  and  01:14:03, five Apache 4xx events	occur, and the
       appearance of the third event at	01:14:00 fulfills the second threshold
       condition (within 120 seconds, at least three Apache  4xx  events  have
       been  observed).	  These	 events	are followed by	four SSH login failure
       events which occur between 01:14:11 and 01:14:19. The appearance	of the
       second event at 01:14:12	fulfills the first threshold condition (within
       120 seconds, at least two SSH login failure events have been observed).
       Since at	this particular	moment (01:14:12) the other two	conditions are
       also  fulfilled,	 the  operation	 sends	 an   e-mail   warning	 about
       192.168.1.104  to  root@localhost.   After that,	the operation silently
       consumes	all further matching events for	192.168.1.104 until  01:14:52,
       and then	terminates.

       Please note that	if the above rule definition would contain multact=yes
       statement,  the operation would continue	sending	e-mails	at each	match-
       ing event after 01:14:12, provided that all  threshold  conditions  are
       satisfied.   Therefore,	the  operation	would send three additional e-
       mails at	01:14:18, 01:14:19, and	01:14:34.  Also, the  operation	 would
       not terminate after its window ends at 01:14:52,	but would rather slide
       the  window  forward  and  expect new events.  At the occurrence	of any
       iptables, SSH login failure or Apache 4xx event for 192.168.1.104,  the
       operation  would	 produce  a warning e-mail if all threshold conditions
       are fulfilled.

       The following example rule cross-correlates iptables events and SSH lo-
       gin events:

       type=EventGroup3
       ptype=regexp
       pattern=sshd\[\d+\]: Failed .+ for (\S+)	from ([\d.]+) port \d+ ssh2
       varmap= user=1; ip=2
       count=alias OPER_$+{ip} LOGIN_FAILED_$+{user}_$+{ip}
       ptype2=regexp
       pattern2=sshd\[\d+\]: Accepted .+ for (\S+) from	([\d.]+) port \d+ ssh2
       varmap2=	user=1;	ip=2
       context2=LOGIN_FAILED_$+{user}_$+{ip}
       ptype3=regexp
       pattern3=kernel:	iptables:.* SRC=([\d.]+)
       varmap3=	ip=1
       desc=Client $+{ip} accessed a firewalled	port and had difficulties with
       logging in
       action=pipe '%t:	%s' /bin/mail root@localhost
       init=create OPER_$+{ip}
       slide=delete OPER_$+{ip}; reset 0
       end=delete OPER_$+{ip}
       window=120

       The rule	starts an event	correlation operation for an IP	address	if SSH
       login failure or	iptables event was observed for	that IP	 address.  The
       operation exists	for 120	seconds	(since when the	event correlation win-
       dow  slides forward, the	operation terminates itself with the reset ac-
       tion as specified with the slide	field).	 The operation sends an	e-mail
       warning to root@localhost if within 120 seconds three threshold	condi-
       tions  are  satisfied  for the IP address it tracks -- (1) at least one
       iptables	event has been observed	for this source	IP, (2)	at  least  one
       SSH  login  failure  has	been observed for this client IP, (3) at least
       one successful SSH login	has been observed for this client IP  and  for
       some  user,  provided that the operation	has previously observed	an SSH
       login failure for the same user and same	client IP.

       Suppose the following events occur, and each event  timestamp  reflects
       the time	SEC observes the event:

       Dec    27    19:00:06	test	kernel:	   iptables:	IN=eth0	  OUT=
       MAC=00:13:72:8a:83:d2:00:1b:25:07:e2:1b:08:00 SRC=10.1.2.7 DST=10.2.5.5
       LEN=60 TOS=0x00 PREC=0x00 TTL=62	ID=1881	DF PROTO=TCP SPT=34342	DPT=23
       WINDOW=5840 RES=0x00 SYN	URGP=0
       Dec  27	19:00:14  test	sshd[10520]:  Accepted	password for root from
       10.1.2.7	port 52609 ssh2
       Dec 27 19:00:24	test  sshd[10526]:  Failed  password  for  risto  from
       10.1.2.7	port 52622 ssh2
       Dec  27	19:00:27  test	sshd[10526]:  Accepted password	for risto from
       10.1.2.7	port 52622 ssh2

       The iptables event at 19:00:06 starts an	 event	correlation  operation
       for  10.1.2.7  which  has  the event correlation	window of 120 seconds.
       Immediately after the operation has been	started, it creates  the  con-
       text  OPER_10.1.2.7.   The  second event	at 19:00:14 does not match the
       rule, since the context LOGIN_FAILED_root_10.1.2.7 does not exist.  The
       third event at 19:00:24 matches the rule, and the  operation  which  is
       running for 10.1.2.7 sets up the	alias name LOGIN_FAILED_risto_10.1.2.7
       for  the	 context OPER_10.1.2.7.	 Finally, the fourth event at 19:00:27
       matches the rule, since the context LOGIN_FAILED_risto_10.1.2.7 exists,
       and the event is	therefore processed by the operation (the presence  of
       the  context indicates that the operation has previously	observed a lo-
       gin failure for user risto from 10.1.2.7).  At this  particular	moment
       (19:00:27),  all	 three threshold conditions for	the operation are ful-
       filled, and therefore it	sends an  e-mail  warning  about  10.1.2.7  to
       root@localhost. After that, the operation silently consumes all further
       matching	 events	for 10.1.2.7 until 19:02:06, and then terminates.  Im-
       mediately  before  termination,	the  operation	deletes	 the   context
       OPER_10.1.2.7	 which	  also	  drops	   its	  alias	   name	   LO-
       GIN_FAILED_risto_10.1.2.7.

       The following example rule correlates SSH login failure events:

       type=EventGroup
       ptype=RegExp
       pattern=sshd\[\d+\]: Failed .+ for (\S+)	from ([\d.]+) port \d+ ssh2
       desc=SSH	login failures from three different hosts within 1m  for  user
       $1
       egtoken=$2
       egptype=PerlFunc
       egpattern=sub { my(%hosts) = map	{ $_ =>	1 } @{$_[1]}; \
		       return scalar(keys %hosts) >= 3;	}
       action=pipe '%t:	%s' /bin/mail root@localhost
       window=60
       thresh=3

       The  rule  runs event correlation operations for	counting the number of
       SSH login failure events. Each operation	counts	events	for  one  user
       name,  and if the operation has observed	login failures from three dif-
       ferent hosts within 60 seconds, it sends	an e-mail warning to  root@lo-
       calhost.	  For  verifying  that	hosts are different, the egtoken field
       configures the use of host IP addresses	as  tokens  for	 building  the
       event group string. Also, the Perl function provided with the egpattern
       field  checks  if  the list of tokens contains at least three unique IP
       addresses.  Note	that the list of tokens	is referenced  by  the	second
       input  parameter	($_[1])	of the function, while the first input parame-
       ter ($_[0]) holds the event group string	(the above Perl	function  only
       processes the list of tokens).

       Suppose	the  following events are generated by an SSH daemon, and each
       event timestamp reflects	the time SEC observes the event:

       Apr  4 23:04:00	test  sshd[21137]:  Failed  password  for  risto  from
       10.1.1.7	port 32182 ssh2
       Apr   4	23:04:03  test	sshd[21145]:  Failed  password	for risto from
       10.1.1.9	port 42176 ssh2
       Apr  4 23:04:04	test  sshd[21212]:  Failed  password  for  risto  from
       10.1.1.7	port 34191 ssh2
       Apr   4	23:04:07  test	sshd[21226]:  Failed  password	for risto from
       10.1.1.2	port 18999 ssh2

       When the	first event is observed	at 23:04:00, a counting	 operation  is
       started	for  user  risto. Since	at 23:04:04 the	operation observes the
       third event, the	threshold condition given with the  thresh  field  be-
       comes satisfied,	and thus the event group pattern given with the	egpat-
       tern  field  is	evaluated.  However,  the  list	 of  tokens (10.1.1.7,
       10.1.1.9, 10.1.1.7) contains only two unique  elements,	and  therefore
       the  event  group pattern does not match.  When the fourth event	occurs
       at 23:04:07, event group	pattern	is evaluated again, and	since the list
       of tokens  (10.1.1.7,  10.1.1.9,	 10.1.1.7,  10.1.1.2)  contains	 three
       unique  elements	now, the event group pattern matches and the operation
       will send an e-mail warning to root@localhost.

   SUPPRESS RULE
       The Suppress rule supports the following	fields.	 Note that match vari-
       ables may be used in the	context	field.

       type   fixed to Suppress	(value is case insensitive).

       ptype  pattern type (value is case insensitive).

       pattern
	      pattern.

       varmap (optional)
	      variable map.

       context (optional)
	      context expression.

       desc (optional)
	      string for describing the	rule.

       rem (optional, may appear more than once)
	      remarks and comments.

       The Suppress rule takes no action when an event has matched  the	 rule,
       and  keeps  matching  events from being processed by later rules	in the
       configuration file.

       Note that the Suppress rule does	not  start  event  correlation	opera-
       tions,  and  the	 optional desc field is	merely used for	describing the
       rule.  Also, in order to	end event processing, so that no further rules
       from any	of the configuration files would be tried, use the Jump	rule.

       Examples:

       type=Suppress
       ptype=RegExp
       pattern=sshd\[\d+\]: Failed .+ for \S+ from ([\d.]+) port \d+ ssh2
       context=SUPPRESS_IP_$1

       type=SingleWithThreshold
       ptype=RegExp
       pattern=sshd\[\d+\]: Failed .+ for (\S+)	from ([\d.]+) port \d+ ssh2
       desc=Three SSH login failures within 1m for user	$1 from	$2
       action=pipe '%t:	%s' /bin/mail root@localhost; \
	      create SUPPRESS_IP_$2 3600
       window=60
       thresh=3

       The first rule filters out SSH login failure events for an already  re-
       ported  source IP address, so that they will not	be matched against the
       second rule during 3600 seconds after sending an	e-mail warning.

   CALENDAR RULE
       The Calendar rule supports the following	fields.

       type   fixed to Calendar	(value is case insensitive).

       time   time specification.

       context (optional)
	      context expression.

       desc   operation	description string.

       action action list.

       rem (optional, may appear more than once)
	      remarks and comments.

       The Calendar rule was designed for executing actions at specific	times.
       Unlike all other	rules, this rule reacts	only to	the system clock,  ig-
       noring  other  input.  The Calendar rule	executes the action list given
       with the	action field if	the current time matches all conditions	of the
       time specification given	with the time field. The action	list  is  exe-
       cuted only once for any matching	minute.

       The  rule  employs  a  time  specification  which closely resembles the
       crontab(1) style, but there are	some  subtle  differences.   The  time
       specification  consists	of  five or six	conditions separated by	white-
       space. The first	condition matches minutes (allowed values  are	0-59),
       the second condition matches hours (allowed values are 0-23), the third
       condition  days	(allowed values	are 0-31, with 0 denoting the last day
       of the month), the fourth condition months (allowed values  are	1-12),
       and  the	fifth condition	weekdays (allowed values are 0-7, with 0 and 7
       denoting	Sunday). The sixth condition is	 optional  and	matches	 years
       (allowed	values are 0-99	which denote the last two digits of the	year).

       Asterisks  (*),	ranges	of  numbers  (e.g.,  8-11),  and  lists	(e.g.,
       2,5,7-9)	are allowed as conditions. Asterisks and ranges	 may  be  aug-
       mented with step	values (e.g., 47-55/2 means 47,49,51,53,55).

       Note  that  unlike  crontab(1)  time specification, the day and weekday
       conditions are *not* joined with	logical	OR, but	 rather	 with  logical
       AND.   Therefore,  0  1 25-31 10	7 means	1AM on last Sunday in October.
       On the other hand, with crontab(1) the same specification means 1AM  in
       every last seven	days or	every Sunday in	October.

       Also,  unlike  some  versions of	cron(8), SEC is	not restricted to take
       action only during the first second of the current minute. For example,
       if SEC is started at the	22th second of a minute, the  wildcard	condi-
       tion produces a match for this minute.  As another example, if the time
       specification  matches  the  current  minute but	the context expression
       evaluates FALSE during the first	half of	the minute, the	Calendar  rule
       will  execute the action	list in	the middle of this minute when the ex-
       pression	value becomes TRUE.

       Note that the Calendar rule does	not  start  event  correlation	opera-
       tions, and the desc field is merely used	for setting the	%s action list
       variable.

       Examples:

       type=Calendar
       time=0 2	25-31 3,12 6
       desc=Check if backup is done on last Saturday of	Q1 and Q4
       action=event WAITING_FOR_BACKUP

       type=Calendar
       time=0 2	24-30 6,9 6
       desc=Check if backup is done on last Saturday of	Q2 and Q3
       action=event WAITING_FOR_BACKUP

       type=PairWithWindow
       ptype=SubStr
       pattern=WAITING_FOR_BACKUP
       desc=Quarterly backup not completed on time!
       action=pipe '%t:	%s' /bin/mail root@localhost
       ptype2=SubStr
       pattern2=BACKUP READY
       desc2=Quarterly backup successfully completed
       action2=none
       window=1800

       The  first two rules create a synthetic event WAITING_FOR_BACKUP	at 2AM
       on last Saturday	of March, June,	September  and	December.   The	 third
       rule matches this event and starts an event correlation operation which
       waits  for  the	BACKUP READY event for 1800 seconds. If	this event has
       not arrived by  2:30AM,	the  operation	sends  an  e-mail  warning  to
       root@localhost.

   JUMP	RULE
       The Jump	rule supports the following fields.  Note that match variables
       may  be	used  in the context field. They may also be used in the cfset
       field, provided that the	constset field is set to No.

       type   fixed to Jump (value is case insensitive).

       continue	(optional)
	      TakeNext,	DontCont, EndMatch or GoTo <label>  (apart  from  <la-
	      bel>, values are case insensitive).

       ptype  pattern type (value is case insensitive).

       pattern
	      pattern.

       varmap (optional)
	      variable map.

       context (optional)
	      context expression.

       cfset (optional)
	      configuration file set names that	are separated by whitespace.

       constset	(optional)
	      Yes or No	(values	are case insensitive, default is Yes).

       desc (optional)
	      string for describing the	rule.

       rem (optional, may appear more than once)
	      remarks and comments.

       The  Jump  rule submits matching	events to specific ruleset(s) for fur-
       ther processing.	If the event  matches  the  rule,  SEC	continues  the
       search  for  matching rules in configuration file set(s)	given with the
       cfset field. Rules from every file are tried in the order of their  ap-
       pearance	 in the	file.  Configuration file sets can be created from Op-
       tions rules with	the joincfset field, with each set containing at least
       one configuration file.	If more	that one set name is given with	cfset,
       sets are	processed from left to right;  a  matching  rule  in  one  set
       doesn't prevent SEC from	processing the following sets. If the constset
       field is	set to Yes, set	names are assumed to be	constants and will not
       be searched for match variables at runtime.

       If  the	cfset  field  is  not present and the continue field is	set to
       GoTo, the Jump rule can be used for skipping rules inside  the  current
       configuration file. If both cfset and continue are not present (or con-
       tinue  is  set  to  DontCont), Jump is identical	to Suppress rule.  Fi-
       nally, if cfset is not present and continue is set  to  EndMatch,  pro-
       cessing	of the matching	event ends (i.e., no further rules from	any of
       the configuration files will be tried).

       Note that the Jump rule does not	start  event  correlation  operations,
       and the optional	desc field is merely used for describing the rule.

       Examples:

       type=Jump
       ptype=RegExp
       pattern=sshd\[\d+\]:
       cfset=sshd-rules	auth-rules

       When  an	sshd syslog message appears in input, rules from configuration
       files of	the set	sshd-rules are first used for  matching	 the  message,
       and then	rules from the configuration file set auth-rules are tried.

   OPTIONS RULE
       The Options rule	supports the following fields.

       type   fixed to Options (value is case insensitive).

       joincfset (optional)
	      configuration file set names that	are separated by whitespace.

       procallin (optional)
	      Yes or No	(values	are case insensitive, default is Yes).

       rem (optional, may appear more than once)
	      remarks and comments.

       The Options rule	sets processing	options	for the	ruleset	in the current
       configuration  file.  If	 more  than one	Options	rule is	present	in the
       configuration file, the last instance overrides all previous ones. Note
       that the	Options	rule is	only processed when SEC	(re)starts  and	 reads
       in  the configuration file.  Since this rule is not applied at runtime,
       it can never match events, react	to the system clock,  or  start	 event
       correlation operations.

       The  joincfset  field lists the names of	one or more configuration file
       sets, and the current configuration file	will be	added to each set.  If
       a set doesn't exist, it will be created and the	current	 configuration
       file  becomes  its  first member.  If the procallin field is set	to No,
       the rules from the configuration	file will be used for  matching	 input
       from Jump rules only.

       Examples:

       The  following  rule  adds  the	current	 configuration file to the set
       sshd-rules which	is used	for matching input from	Jump rules only:

       type=Options
       joincfset=sshd-rules
       procallin=no

       The following rule adds the current configuration file  to  sets	 linux
       and solaris which are used for matching all input:

       type=Options
       joincfset=linux solaris

EVENT CORRELATION OPERATIONS
       Event  correlation  operations  are  dynamic entities created by	rules.
       After creating an operation, the	rule also  feeds  the  operation  with
       events  that need to be correlated. Since each rule can create and feed
       many operations which are running simultaneously, each operation	 needs
       a unique	ID.

       In order	to identify event correlation operations, SEC assigns an ID to
       every  operation	that is	composed from the configuration	file name, the
       rule number, and	the operation description string (defined by the  desc
       field  of  the  rule).	If there are N rules in	the configuration file
       (excluding Options rules), the rule numbers belong to the range 0..N-1,
       and the number of the k-th rule is k-1.	Since  each  Options  rule  is
       only  processed when SEC	reads in the configuration file	and is not ap-
       plied at	runtime, the Options rules  will  not  receive	rule  numbers.
       Note that since the configuration file name and rule number are part of
       the  operation ID, different rules can have identical desc fields with-
       out a danger of a clash between operations.

       For example, if the configuration file /etc/sec/my.conf	contains  only
       one rule

       type=SingleWithThreshold
       ptype=RegExp
       pattern=user (\S+) login	failure	on (\S+)
       desc=Repeated login failures for	user $1	on $2
       action=pipe '%t:	%s' /bin/mail root@localhost
       window=60
       thresh=3

       then  the  number  of  this rule	is 0.  When this rule matches an input
       event "user admin login failure on tty1", the desc field	yields an  op-
       eration	description  string  Repeated login failures for user admin on
       tty1, and the event will	be directed for	further	processing to the  op-
       eration with the	following ID:

       /etc/sec/my.conf	| 0 | Repeated login failures for user admin on	tty1

       If  the	operation for this ID does not exist, the rule will create it.
       The newly created operation has its event counter initialized to	1, and
       it expects to receive two additional "user admin	login failure on tty1"
       events from the rule within the following 60 seconds. If	the  operation
       receives	 such  an  event, its event counter is incremented, and	if the
       counter reaches the value of 3, a warning e-mail	is sent	to root@local-
       host.

       By tuning the desc field	of the rule, the  scope	 of  individual	 event
       correlation  operations can be changed.	For instance, if the following
       events occur within 10 seconds

       user admin login	failure	on tty1
       user admin login	failure	on tty5
       user admin login	failure	on tty2

       the above rule starts three event correlation operations.  However,  if
       the  desc  field	 of the	rule is	changed	to Repeated login failures for
       user $1,	these events are processed by the *same* event correlation op-
       eration (the operation sends a warning e-mail to	root@localhost when it
       receives	the third event).

       Since rules from	the same configuration file are	matched	against	 input
       in  the order they are given, the rule ordering influences the creation
       and feeding of event correlation	operations. Suppose the	 configuration
       file /etc/sec/my.conf contains the following rules:

       type=Suppress
       ptype=TValue
       pattern=TRUE
       context=MYCONTEXT

       type=SingleWithThreshold
       ptype=RegExp
       pattern=user (\S+) login	failure	on (\S+)
       desc=Repeated login failures for	user $1	on $2
       action=pipe '%t:	%s' /bin/mail root@localhost
       window=60
       thresh=3

       The second rule is able to create and feed event	correlation operations
       as  long	as the context MYCONTEXT does not exist. However, after	MYCON-
       TEXT has	been created, no input event will reach	the second  rule,  and
       the rule	is thus	unable to create new operations	and feed existing ones
       with events.

       Note that Pair and PairWithWindow rules can feed	the same event to sev-
       eral  operations. Suppose the configuration file	/etc/sec/my2.conf con-
       tains the following rules:

       type=Suppress
       ptype=SubStr
       pattern=test

       type=Pair
       ptype=RegExp
       pattern=database	(\S+) down
       desc=Database $1	is down
       action=pipe '%t:	%s' /bin/mail root@localhost
       ptype2=RegExp
       pattern2=database $1 up|all databases up
       desc2=Database %1 is up
       action2=pipe '%t: %s' /bin/mail root@localhost
       window=86400

       Since the following input events	don't contain the substring "test"

       database	mydb1 down
       database	mydb2 down
       database	mydb3 down

       they are	matched	by the second rule of type Pair	 which	creates	 three
       event correlation operations. Each operation is running for one partic-
       ular database name, and the operations have the following IDs:

       /etc/sec/my2.conf | 1 | Database	mydb1 is down
       /etc/sec/my2.conf | 1 | Database	mydb2 is down
       /etc/sec/my2.conf | 1 | Database	mydb3 is down

       Each  newly  created operation sends an e-mail notification to root@lo-
       calhost about the "database down" condition, and	 will  then  wait  for
       86400 seconds (24 hours)	for either of the following messages:
       (a) "database up" message for the given database,
       (b) "all	databases up" message.

       The operation with the ID

       /etc/sec/my2.conf | 1 | Database	mydb1 is down

       uses the	following regular expression for matching expected messages:

       database	mydb1 up|all databases up

       The operation with the ID

       /etc/sec/my2.conf | 1 | Database	mydb2 is down

       employs	the  following	regular	 expression for	matching expected mes-
       sages:

       database	mydb2 up|all databases up

       Finally,	the operation with the ID

       /etc/sec/my2.conf | 1 | Database	mydb3 is down

       uses the	following regular expression:

       database	mydb3 up|all databases up

       If the following	input events appear after 10 minutes

       database	test up
       admin logged in
       database	mydb3 up
       all databases up

       the first event "database test up" matches the  first  rule  (Suppress)
       which  does not pass the	event further to the second rule (Pair).  How-
       ever, all following events reach	the Pair  rule.	  Since	 the  messages
       don't  match  the pattern field of the rule, the	rule feeds them	to all
       currently existing operations it	has created, so	 that  the  operations
       can match these events with their regular expressions.  Because regular
       expressions of all three	operations don't match the event "admin	logged
       in", the	operations will	continue to run.  In the case of the "database
       mydb3 up" event,	the regular expression of the operation

       /etc/sec/my2.conf | 1 | Database	mydb3 is down

       produces	a match. Therefore, the	operation will send the	e-mail notifi-
       cation  "Database  mydb3	 is up"	to root@localhost and terminate.  How-
       ever, the following event "all databases	up" matches  the  regular  ex-
       pressions of two	remaining operations. As a result, the operations will
       send e-mail notifications "Database mydb1 is up"	and "Database mydb2 is
       up" to root@localhost and terminate.

       Each  operation has an event correlation	window which defines its scope
       in time.	The size of the	window is defined by the  window*  field,  and
       the  beginning  of  the window can be obtained with the getwpos action.
       SingleWithThreshold, SingleWith2Thresholds  and	EventGroup  operations
       can slide its window forward during event processing, while for all op-
       erations	 the  window can also be moved explicitly with the setwpos ac-
       tion. Also, with	the reset action event correlation operations  can  be
       terminated. Note	that getwpos, setwpos, and reset actions only work for
       operations started by the rules from the	same configuration file.

       For  example,  consider the configuration file /etc/sec/sshd.rules that
       contains	the following rules:

       type=SingleWithThreshold
       ptype=RegExp
       pattern=sshd\[\d+\]: Failed .+ for (\S+)	from [\d.]+ port \d+ ssh2
       desc=Three SSH login failures within 1m for user	$1
       action=pipe '%t:	%s' /bin/mail root@localhost
       window=60
       thresh=3

       type=Single
       ptype=RegExp
       pattern=sshd\[\d+\]: Accepted .+	for (\S+) from [\d.]+ port \d+ ssh2
       desc=SSH	login successful for user $1
       action=reset -1 Three SSH login failures	within 1m for user $1

       Suppose the following events are	generated by an	SSH daemon,  and  each
       event timestamp reflects	the time SEC observes the event:

       Dec  29	15:00:03  test	sshd[14129]:  Failed  password	for risto from
       10.1.2.7	port 31312 ssh2
       Dec 29 15:00:08	test  sshd[14129]:  Failed  password  for  risto  from
       10.1.2.7	port 31312 ssh2
       Dec  29	15:00:17  test	sshd[14129]:  Accepted password	for risto from
       10.1.2.7	port 31312 ssh2
       Dec 29 15:00:52	test  sshd[14142]:  Failed  password  for  risto  from
       10.1.1.2	port 17721 ssh2

       The  first event	at 15:00:03 starts an event correlation	operation with
       the ID

       /etc/sec/sshd.rules | 0 | Three SSH login failures within 1m  for  user
       risto

       However,	 when  the  third  event  occurs  at 15:00:17, the second rule
       matches it and terminates the operation with the	action

       reset -1	Three SSH login	failures within	1m for user risto

       The -1 parameter	of reset restricts the action to operations started by
       the previous rule (i.e.,	the first rule that has	a number 0), while the
       Three SSH login failures	within 1m for user risto parameter  refers  to
       the  operation description string. Together with	the current configura-
       tion file name (/etc/sec/sshd.rules), the parameters yield  the	opera-
       tion ID

       /etc/sec/sshd.rules  |  0 | Three SSH login failures within 1m for user
       risto

       (If the operation with the given	ID would not exist, reset  would  per-
       form no operation.)

       As a consequence, the fourth event at 15:00:52 starts another operation
       with  the  same	ID as the terminated operation had. Without the	second
       rule, the operation that	was started at 15:00:03	would  not  be	termi-
       nated,  and  the	appearance of the fourth event would trigger a warning
       e-mail from that	operation.

INPUT PROCESSING AND TIMING
       SEC processes input data	iteratively by reading one line	at each	itera-
       tion, writing this line into a relevant input buffer, and matching  the
       content	of the updated buffer with rules from configuration files.  If
       during the matching process an action list is  executed	which  creates
       new input events	(e.g., through the event action), they are *not* writ-
       ten  to	buffer(s) immediately, but rather consumed at following	itera-
       tions.

       Note that when both synthetic events and	regular	 input	are  available
       for  processing,	 synthetic events are always consumed first.  When all
       synthetic events	have been consumed iteratively,	SEC  will  start  pro-
       cessing new data	from input files.

       With  the  --jointbuf  option, SEC employs a joint input	buffer for all
       input sources which holds N last	input lines (the value of N can	be set
       with the	--bufsize option). Updating the	input buffer  means  that  the
       new  line  becomes the first element of the buffer, while the last ele-
       ment (the oldest	line) is removed from the end of the buffer.  With the
       --nojointbuf option, SEC	maintains a buffer of N	lines for  each	 input
       file,  and  if the input	line comes from	file F,	the buffer of F	is up-
       dated as	described previously.  There is	also  a	 separate  buffer  for
       synthetic and internal events.

       Suppose SEC is started with the following command line

       /usr/bin/sec --conf=/etc/sec/test-multiline.conf	--jointbuf \
		    --input=/var/log/prog1.log --input=/var/log/prog2.log

       and the configuration file /etc/sec/test-multiline.conf has the follow-
       ing content:

       type=Single
       rem=this	rule matches two consecutive lines where the first \
	   line	contains "test1" and the second	line "test2", and \
	   writes the matching lines to	standard output
       ptype=RegExp2
       pattern=test1.*\n.*test2
       desc=two	consecutive test lines
       action=write - $0

       When  the  following lines appear in input files	/var/log/prog1.log and
       /var/log/prog2.log

       Dec 31 12:33:12 test prog1: test1 (file /var/log/prog1.log)
       Dec 31 12:34:09 test prog2: test1 (file /var/log/prog2.log)
       Dec 31 12:39:35 test prog1: test2 (file /var/log/prog1.log)
       Dec 31 12:41:53 test prog2: test2 (file /var/log/prog2.log)

       they are	stored in a common input buffer. Therefore, rule  fires	 after
       the  third  event has appeared, and writes the following	lines to stan-
       dard output:

       Dec 31 12:34:09 test prog2: test1 (file /var/log/prog2.log)
       Dec 31 12:39:35 test prog1: test2 (file /var/log/prog1.log)

       However,	if SEC is started with the --nojointbuf	option,	separate input
       buffers are  set	 up  for  /var/log/prog1.log  and  /var/log/prog2.log.
       Therefore,  the	rule  fires  after  the	 third event has occurred, and
       writes the following lines to standard output:

       Dec 31 12:33:12 test prog1: test1 (file /var/log/prog1.log)
       Dec 31 12:39:35 test prog1: test2 (file /var/log/prog1.log)

       The rule	also fires after the fourth event has occurred,	producing  the
       following output:

       Dec 31 12:34:09 test prog2: test1 (file /var/log/prog2.log)
       Dec 31 12:41:53 test prog2: test2 (file /var/log/prog2.log)

       The  content  of	input buffers can be modified with the rewrite action,
       and modifications become	visible	immediately during ongoing event  pro-
       cessing	iteration.   Suppose SEC is started with the following command
       line

       /usr/bin/sec --conf=/etc/sec/test-rewrite.conf \
		    --input=- --nojointbuf

       and the configuration file /etc/sec/test-rewrite.conf has the following
       content:

       type=Single
       rem=this	rule matches two consecutive lines where the first \
	   line	contains "test1" and the second	line "test2", and \
	   joins these lines in	the input buffer
       ptype=RegExp2
       pattern=^(.*test1.*)\n(.*test2.*)$
       continue=TakeNext
       desc=join two test lines
       action=rewrite 2	Joined $1 and $2

       type=Single
       rem=this	rule matches a line which begins with "Joined",	\
	   and writes this line	to standard output
       ptype=RegExp
       pattern=^Joined
       desc=output joined lines
       action=write - $0

       When the	following two lines appear in standard input

       This is a test1
       This is a test2

       they are	matched	by the first rule which	uses the  rewrite  action  for
       replacing  those	two lines in the input buffer with a new content.  The
       last line in the	input buffer ("This is	a  test2")  is	replaced  with
       "Joined	This  is a test1 and This is a test2", while the previous line
       in the input buffer ("This is a	test1")	 is  replaced  with  an	 empty
       string.	 Since	the  rule  contains  continue=TakeNext	statement, the
       matching	process	will continue from  the	 following  rule.   This  rule
       matches	the  last line in the input buffer if it begins	with "Joined",
       and writes the line to standard output, producing

       Joined This is a	test1 and This is a test2

       After each event	processing  iteration,	the  pattern  match  cache  is
       cleared.	  In  other  words, if a match is cached with the rule varmap*
       field, it is available during ongoing iteration only.   Note  that  re-
       sults  from a successful	pattern	matching are also cached when the sub-
       sequent context expression evaluation yields FALSE.   This  allows  for
       reusing	results	from partial rule matches.  For	example, the following
       rule creates the	cache entry "ssh_failed_login" for any SSH failed  lo-
       gin event, even if the context ALERTING_ON does not exist:

       type=Single
       ptype=RegExp
       pattern=sshd\[\d+\]: Failed .+ for (\S+)	from ([\d.]+) port \d+ ssh2
       varmap=ssh_failed_login;	user=1;	ip=2
       context=ALERTING_ON
       desc=SSH	login failure for user $1 from $2
       action=pipe '%s'	/bin/mail -s 'SSH login	alert' root@localhost

       However,	 provided  the context expression does not contain match vari-
       ables, enclosing	the  expression	 in  square  brackets  (e.g.,  [ALERT-
       ING_ON])	 forces	 its  evaluation before	the pattern matching, and will
       thus prevent the	matching and the creation of the cache	entry  if  the
       evaluation yields FALSE.

       Rules  from  the	same configuration file	are matched against the	buffer
       content in the order they are given in that file.  When	multiple  con-
       figuration files	have been specified, rule sequences from all files are
       matched against the buffer content (unless specified otherwise with Op-
       tions rules).  The matching order is determined by the order of config-
       uration	files  in  SEC	command	line.  For example, if the Perl	glob()
       function	returns	filenames in ascending ASCII order, and	 configuration
       files  /home/risto/A.conf,  /home/risto/B.conf2,	and /home/risto/C.conf
       are specified with --conf=/home/risto/*.conf --conf=/home/risto/*.conf2
       in SEC command line, then SEC first matches the input against the  rule
       sequence	 from  A.conf,	then  from  C.conf,  and finally from B.conf2.
       Also, note that even if A.conf contains a Suppress rule for a  particu-
       lar  event,  the	 event	is  still  processed by	rulesets in C.conf and
       B.conf2.	However, note that glob() might	return file names in different
       order if	locale settings	change.	 If you	want to	enforce	a fixed	 order
       for configuration file application in a portable	way, it	is recommended
       to  create a unique set for each	file with the Options rule, and	employ
       the Jump	rule for defining the processing order for sets, e.g.:

       # This rule appears in A.conf
       type=Options
       joincfset=FileA
       procallin=no

       # This rule appears in B.conf2
       type=Options
       joincfset=FileB
       procallin=no

       # This rule appears in C.conf
       type=Options
       joincfset=FileC
       procallin=no

       # This rule appears in main.conf
       type=Jump
       ptype=TValue
       pattern=TRUE
       cfset=FileA FileC FileB

       After the relevant input	buffer has been	updated	and  its  content  has
       been  matched  by  the rules, SEC handles caught	signals	and checks the
       status of  child	 processes.   When  the	 timeout  specified  with  the
       --cleantime  option has expired,	SEC also checks	the status of contexts
       and event correlation operations. Therefore,  relatively	 small	values
       should be specified with	the --cleantime	option,	in order to retain the
       accuracy	 of  the event correlation process.  If	the --cleantime	option
       is set to 0, SEC	checks event correlation operations and	contexts after
       processing every	input line, but	this consumes more CPU time.   If  the
       --poll-timeout  option  value exceeds the value given with --cleantime,
       the --poll-timeout option value takes precedence	 (i.e.,	 sleeps	 after
       unsuccessful polls will not be shortened).

       Finally,	 note that apart from the sleeps after unsuccessful polls, SEC
       measures	all time intervals and occurrence times	in seconds, and	always
       uses the	time(2)	system call for	obtaining the current time. Also,  for
       input  event  occurrence	 time SEC always uses the time it observed the
       event, *not* the	timestamp extracted from the event.

INTERNAL EVENTS	AND CONTEXTS
       In the action list of a context,	the context can	also be	referred  with
       the  internal context name _THIS. The name _THIS	is created and deleted
       dynamically by SEC and it points	to the context only during its	action
       list  execution.	  This feature is useful when the context has had sev-
       eral names during its lifetime (created with the	alias action), and  it
       is  hard	 to  determine which names exist when the context expires. For
       example,	if the context is created with create A	60 (report A /bin/mail
       root) which is immediately followed by alias A B	and unalias A, the re-
       port action will	fail since the name A no longer	refers to the context.
       However,	replacing the first action with	 create	 A  60	(report	 _THIS
       /bin/mail root) will produce the	correct	result.

       If  the --intevents command line	option is given, SEC will generate in-
       ternal events when it is	started	up, when it receives certain  signals,
       and  when it terminates normally. Inside	SEC, internal event is treated
       as if it	was a line that	was read from  a  SEC  input  file.   Specific
       rules  can  be  written to match	internal events, in order to take some
       action (e.g., start an external event  correlation  module  with	 spawn
       when SEC	starts up). The	following internal events are supported:

       SEC_STARTUP  - generated	when SEC is started (this event	will always be
       the first event that SEC	sees)

       SEC_PRE_RESTART - generated before  processing  of  the	SIGHUP	signal
       (this  event  will  be the last event that SEC sees before clearing all
       internal	data structures	and reloading its configuration)

       SEC_RESTART - generated after processing	of  the	 SIGHUP	 signal	 (this
       event will be the first event that SEC sees after clearing all internal
       data structures and reloading its configuration)

       SEC_PRE_SOFTRESTART - generated before processing of the	SIGABRT	signal
       (this  event  will be the last event that SEC sees before reloading its
       configuration)

       SEC_SOFTRESTART - generated after  processing  of  the  SIGABRT	signal
       (this  event  will be the first event that SEC sees after reloading its
       configuration)

       SEC_PRE_LOGROTATE - generated before processing of the  SIGUSR2	signal
       (this  event  will be the last event that SEC sees before reopening its
       log file	and closing its	outputs)

       SEC_LOGROTATE - generated after processing of the SIGUSR2 signal	 (this
       event  will  be	the  first event that SEC sees after reopening its log
       file and	closing	its outputs)

       SEC_SHUTDOWN - generated	when SEC receives the SIGTERM signal, or  when
       SEC  reaches all	EOFs of	input files after being	started	with the --no-
       tail option. With the --childterm option, SEC sleeps for	3 seconds  af-
       ter  generating SEC_SHUTDOWN event, and then sends SIGTERM to its child
       processes (if a child process was triggered by SEC_SHUTDOWN, this delay
       leaves the process  enough  time	 for  setting  a  signal  handler  for
       SIGTERM).

       Before  generating  an  internal	 event,	 SEC  sets  up a context named
       SEC_INTERNAL_EVENT, in order to disambiguate internal events from regu-
       lar input.  The SEC_INTERNAL_EVENT context is deleted immediately after
       the internal event has been matched against all rules.

       If the --intcontexts command line option	is given, or there is an --in-
       put option with a context specified, SEC	creates	 an  internal  context
       each time it reads a line from an input file or a synthetic event.  The
       internal	context	is deleted immediately after the line has been matched
       against	all  rules. For	all input files	that have the context name ex-
       plicitly	set with --input=<file_pattern>=<context>, the name of the in-
       ternal context is <context>. If the line	was read from the  input  file
       <filename>  for which there is no context name set, the name of the in-
       ternal context is _FILE_EVENT_<filename>.  For  synthetic  events,  the
       name  of	 the  internal context defaults	to _INTERNAL_EVENT, but	cspawn
       and cevent actions can be used for  generating  synthetic  events  with
       custom internal context names. This allows for writing rules that match
       data from one particular	input source only. For example,	the rule

       type=Suppress
       ptype=TValue
       pattern=TRUE
       context=[!_FILE_EVENT_/dev/logpipe]

       passes  only  the lines that were read from /dev/logpipe, and also syn-
       thetic events that were generated with the _FILE_EVENT_/dev/logpipe in-
       ternal context (e.g., with the action cevent _FILE_EVENT_/dev/logpipe 0
       This is a test event).  As another example, if  SEC  has	 been  started
       with the	command	line

       /usr/bin/sec --intevents	--intcontexts --conf=/etc/sec/my.conf \
		    --input=/var/log/messages=MESSAGES \
		    --input=/var/log/secure=SECURE \
		    --input=/var/log/cron=CRON

       and the rule file /etc/sec/my.conf contains the following rules

       type=Single
       ptype=RegExp
       pattern=^(?:SEC_STARTUP|SEC_RESTART)$
       context=[SEC_INTERNAL_EVENT]
       desc=listen on 10514/tcp	for incoming events
       action=cspawn MESSAGES /usr/bin/nc -l -k	10514

       type=Single
       ptype=RegExp
       pattern=.
       context=[MESSAGES]
       desc=echo everything from 10514/tcp and /var/log/messages
       action=write - $0

       then SEC	will receive input lines from the log files /var/log/messages,
       /var/log/secure,	 and  /var/log/cron, and will also run /usr/bin/nc for
       receiving input lines from the port 10514/tcp.  All  input  lines  from
       /var/log/messages  and  10514/tcp  are  matched	by the second rule and
       written to standard output.

CHILD PROCESSES
       The  SingleWithScript  rule  and	 shellcmd,  spawn,  cspawn,   cmdexec,
       spawnexec,  cspawnexec,	pipe, pipeexec,	report,	and reportexec actions
       fork a child process for	executing an external program.	For  the  Sin-
       gleWithScript  rule  with  shell=yes  setting  and for shellcmd,	spawn,
       cspawn, pipe, and report	actions, the following rule applies -- if  the
       program command line contains shell metacharacters, the command line is
       first  parsed by	the shell which	then starts the	program.  For the Sin-
       gleWithScript rule with shell=no	setting	and  for  cmdexec,  spawnexec,
       cspawnexec,  pipeexec, and reportexec actions, the program command line
       is not parsed by	shell, even if shell metacharacters are	present	in the
       command line.

       Disabling shell parsing for command lines can be	 useful	 for  avoiding
       unwanted	 side effects. For example, consider the following badly writ-
       ten rule	for sending an e-mail to a local user if 10 SSH	login failures
       have been observed for this user	from the same IP  address  during  300
       seconds:

       type=SingleWithThreshold
       ptype=RegExp
       pattern=sshd\[\d+\]: Failed .+ for (.+) from ([\d.]+) port \d+ ssh2
       desc=Failed SSH logins for user $1 from $2
       action=pipe 'Failed SSH logins from $2' /bin/mail -s alert $1
       window=300
       thresh=10

       Unfortunately,  the  above  rule	 allows	for the	execution of arbitrary
       command lines with the privileges of the	 SEC  process.	 For  example,
       consider	 the following malicious command line for providing fake input
       events for the rule:

       logger -p authpriv.info -t sshd -i 'Failed password for `/usr/bin/touch
       /tmp/test` from 127.0.0.1 port 12345 ssh2'

       When this command line is repeatedly executed, the attacker is able  to
       trigger	 the   execution  of  the  command  line  /bin/mail  -s	 alert
       `/usr/bin/touch /tmp/test`.  However, this command line	is  parsed  by
       shell  that triggers the	execution of the command line specified	by the
       attacker: /usr/bin/touch	/tmp/test.  For	fixing this  issue,  the  pipe
       action can be replaced with pipeexec which will disable the shell pars-
       ing:

       action=pipeexec 'Failed SSH logins from $2' /bin/mail -s	alert $1

       However,	 when  using that approach, you	*must* make sure that the data
       passed to an external program is	handled	without	 any  unexpected  side
       effects.

       As  another  workaround,	the regular expression pattern of the rule can
       be modified to match user names that do not contain  shell  metacharac-
       ters, for example:

       pattern=sshd\[\d+\]:  Failed  .+	 for  ([\w.-]+)	from ([\d.]+) port \d+
       ssh2

       SEC communicates	with its child processes through pipes	(created  with
       the pipe(2) system call).  When the child process is at the read	end of
       the  pipe,  data	 have to be written to the pipe	in blocking mode which
       ensures reliable	data transmission.  In order to	avoid  being  blocked,
       SEC  forks  another  SEC	process	for writing data to the	pipe reliably.
       The newly created SEC process will then fork the	child process,	manag-
       ing the child process on	behalf of the main SEC process (i.e., the main
       SEC  process is the grandparent process for the child). For example, if
       the SEC process that manages the	child receives the SIGTERM signal, the
       signal will be forwarded	to the	child  process,	 and  when  the	 child
       process	terminates,  its  exit	code  will be reported to the main SEC
       process.

       After forking an	 external  program,  SEC  continues  immediately,  and
       checks  the  program  status  periodically until	the program exits. The
       running time of a child process is not limited in  any  way.  With  the
       --childterm option, SEC sends the SIGTERM signal	to all child processes
       when  it	terminates.  If	some special exit procedures need to be	accom-
       plished in the child process (or	the child wishes to  ignore  SIGTERM),
       then  the  child	 must  install a handler for the SIGTERM signal.  Note
       that if the program command line	is parsed by shell, the	parsing	 shell
       will  run  as a child process of	SEC and	the parent process of the pro-
       gram. Therefore,	the SIGTERM signal will	be sent	to  the	 shell,	 *not*
       the  program.  In order to avoid	this, the shell's builtin exec command
       can be used (see	sh(1) for more information) which replaces  the	 shell
       with the	program	without	forking	a new process, e.g.,

       action=spawn exec /usr/local/bin/myscript.pl 2>/var/log/myscript.log

       Note  that  if  an action list includes two actions which fork external
       programs, the execution order these programs is not determined  by  the
       order of	actions	in the list, since both	programs are running asynchro-
       nously.	 In  order  to address this issue, the execution order must be
       specified explicitly (e.g., instead of  writing	action=shellcmd	 cmd1;
       shellcmd	cmd2, use the shell && operator	and write action=shellcmd cmd1
       && cmd2).

       Sometimes  it  is desirable to start an external	program	and provide it
       with data from several rules. In	order  to  create  such	 setup,	 named
       pipes  can be harnessed.	For example, if	/var/log/pipe is a named pipe,
       then

       action=shellcmd /usr/bin/logger -f /var/log/pipe	-p user.notice

       starts the /usr/bin/logger utility which	 sends	all  lines  read  from
       /var/log/pipe  to  the local syslog daemon with the "user" facility and
       "notice"	level. In order	to feed	events to /usr/bin/logger,  the	 write
       action  can  be used (e.g., write /var/log/pipe This is my event).  Al-
       though SEC keeps	the named pipe open across  different  write  actions,
       the pipe	will be	closed on the reception	of SIGHUP, SIGABRT and SIGUSR2
       signals.	  Since	 many UNIX tools terminate on receiving	EOF from stan-
       dard input, they	need restarting	after such signals have	 arrived.  For
       this  purpose,  the  --intevents	 option	and SEC	internal events	can be
       used. For example, the following	rule starts the	/usr/bin/logger	 util-
       ity  at	SEC startup, and also restarts it after	the reception of rele-
       vant signals:

       type=Single
       ptype=RegExp
       pattern=^(?:SEC_STARTUP|SEC_RESTART|SEC_SOFTRESTART|SEC_LOGROTATE)$
       context=SEC_INTERNAL_EVENT
       desc=start the logger tool
       action=free %emptystring; owritecl /var/log/pipe	%emptystring; \
	      shellcmd /usr/bin/logger -f /var/log/pipe	-p user.notice

       Note that if /var/log/pipe is never opened for writing by a  write  ac-
       tion,  /usr/bin/logger  will never see EOF and will thus	not terminate.
       The owritecl action opens and closes /var/log/pipe without writing  any
       bytes,  in  order to ensure the presence	of EOF in such cases. This al-
       lows any	previous /usr/bin/logger process to terminate before  the  new
       process is started.

PERL INTEGRATION
       SEC  supports  patterns,	context	expressions, and actions which involve
       calls to	the Perl eval()	function or the	execution of precompiled  Perl
       code.  The use of Perl code in SEC patterns and context expressions al-
       lows for	creating proper	match conditions for scenarios which can't  be
       handled by a simple regular expression match. For example, consider the
       following iptables syslog events:

       May    27    10:00:15	box1	kernel:	   iptables:	IN=eth0	  OUT=
       MAC=08:00:27:be:9e:2f:00:10:db:ff:20:03:08:00		 SRC=10.6.4.14
       DST=10.1.8.2  LEN=84  TOS=0x00  PREC=0x00  TTL=251  ID=61426 PROTO=ICMP
       TYPE=8 CODE=0 ID=11670 SEQ=2
       May   27	   10:02:22    box1    kernel:	  iptables:    IN=eth0	  OUT=
       MAC=08:00:27:be:9e:2f:00:10:db:ff:20:03:08:00		 SRC=10.6.4.14
       DST=10.1.8.2 LEN=52 TOS=0x00 PREC=0x00  TTL=60  ID=61441	 DF  PROTO=TCP
       SPT=53125 DPT=23	WINDOW=49640 RES=0x00 SYN URGP=0

       Depending  on  the  protocol  and the nature of the traffic, events can
       have a wide variety of fields, and parsing out all event	data with  one
       regular expression is infeasible. For addressing	this issue, a PerlFunc
       pattern	can  be	 used which creates match variables from all fields of
       the matching event, stores them in one Perl hash, and returns a	refer-
       ence  to	 this  hash. Outside the PerlFunc pattern, match variables are
       initialized from	the key-value pairs in the returned hash.  Suppose the
       following  Jump	rule  with  a  PerlFunc	 pattern  is  defined  in  the
       main.rules rule file:

       type=Jump
       ptype=PerlFunc
       pattern=sub { my(%var); my($line) = $_[0]; \
	       if ($line !~ /kernel: iptables:/g) { return 0; }	\
	       while ($line =~ /\G\s*([A-Z]+)(?:=(\S*))?/g) { \
		 $var{$1} = defined($2)?$2:1; \
	       } return	\%var; }
       varmap=IPTABLES
       desc=parse iptables event
       cfset=iptables

       For  example,  if the iptables event contains the fields	SRC=10.6.4.14,
       DST=10.1.8.2 and	SYN, the above PerlFunc	pattern	sets up	match variable
       $+{SRC} which holds  10.6.4.14,	match  variable	 $+{DST}  which	 holds
       10.1.8.2,  and  match  variable	$+{SYN}	 which holds 1.	 The Jump rule
       caches all created match	variables under	the name IPTABLES, and submits
       the matching event to iptables ruleset for further processing.  Suppose
       the iptables ruleset is defined in the iptables.rules rule file:

       type=Options
       procallin=no
       joincfset=iptables

       type=SingleWithThreshold
       ptype=Cached
       pattern=IPTABLES
       context=IPTABLES	:> ( sub { return $_[0]->{"PROTO"} eq "ICMP"; }	)
       desc=ICMP flood type $+{TYPE} code $+{CODE} from	host $+{SRC}
       action=logonly
       window=10
       thresh=100

       type=SingleWithThreshold
       ptype=Cached
       pattern=IPTABLES
       context=IPTABLES	:> ( sub { return exists($_[0]->{"SYN"}) && \
					  exists($_[0]->{"FIN"}) ; } )
       desc=SYN+FIN flood from host $+{SRC}
       action=logonly
       window=10
       thresh=100

       The  two	 SingleWithThreshold rules employ Cached patterns for matching
       iptables	events by looking up the IPTABLES entry	in the	pattern	 match
       cache (created by the above Jump	rule for each iptables event).	In or-
       der to narrow down the match to specific	iptables events, the rules em-
       ploy  precompiled Perl functions	in context expressions.	 The :>	opera-
       tor is used for speeding	up the matching, providing the function	with a
       single parameter	which refers to	the hash of variable name-value	 pairs
       for the IPTABLES	cache entry.

       The  first SingleWithThreshold rule logs	a warning message if within 10
       seconds 100 iptables events have	been observed for  ICMP	 packets  with
       the  same  type,	 code,	and source IP address.	The second SingleWith-
       Threshold rule logs a warning message if	within 10 seconds 100 iptables
       events have been	observed for TCP packets coming	from  the  same	 host,
       and having both SYN and FIN flag	set in each packet.

       Apart  from using action	list variables for data	sharing	between	rules,
       Perl variables created in Perl code can be employed for the  same  pur-
       pose. For example, when SEC has executed	the following action

       action=eval %a ($b = 1)

       the  variable  $b and its value become visible in the following context
       expression

       context=	=(++$b > 10)

       (with that expression one can implement event counting implicitly).  In
       order to	avoid possible clashes with variables inside the SEC code  it-
       self,  user-defined  Perl  code	is executed in the main::SEC namespace
       (i.e., inside the special package main::SEC).  By using the main:: pre-
       fix, SEC	data structures	can be accessed	and  modified.	 For  example,
       the  following  rules  restore and save contexts	with names MY_*	on SEC
       startup and shutdown, using Perl	Storable module	for saving and restor-
       ing relevant elements of	%main::context_list hash (since	the  following
       example does not	handle code references with Storable module, it	is as-
       sumed that context action lists do not contain lcall actions):

       type=Single
       ptype=SubStr
       pattern=SEC_STARTUP
       context=SEC_INTERNAL_EVENT
       continue=TakeNext
       desc=Load the Storable module and terminate if it is not	found
       action=eval %ret	(require Storable); \
	      if %ret (	logonly	Storable loaded	) else ( eval %o exit(1) )

       type=Single
       ptype=SubStr
       pattern=SEC_STARTUP
       context=SEC_INTERNAL_EVENT
       desc=Restore contexts MY_* from /var/lib/sec/SEC_CONTEXTS on startup
       action=lcall %ret -> ( sub { my($ref, $context);	\
	      $ref = Storable::retrieve("/var/lib/sec/SEC_CONTEXTS"); \
	      foreach $context (keys %{$ref}) {	\
		if ($context =~	/^MY_/)	\
		  { $main::context_list{$context} = $ref->{$context}; }	} } )

       type=Single
       ptype=SubStr
       pattern=SEC_SHUTDOWN
       context=SEC_INTERNAL_EVENT
       desc=Save contexts MY_* into /var/lib/sec/SEC_CONTEXTS on shutdown
       action=lcall %ret -> ( sub { my($context, %hash); \
	      foreach $context (keys %main::context_list) { \
		if ($context =~	/^MY_/)	\
		  { $hash{$context} = $main::context_list{$context}; } } \
	      Storable::store(\%hash, "/var/lib/sec/SEC_CONTEXTS"); } )

       However,	 note that modifying data structures within SEC	code is	recom-
       mended only for advanced	users  who  have  carefully  studied  relevant
       parts of	the code.

       Finally,	sometimes larger chunks	of Perl	code have to be	used for event
       processing  and	correlation.  However,	writing	many lines of code di-
       rectly into a rule is cumbersome	and may	decrease its  readability.  In
       such  cases  it	is recommended to separate the code into a custom Perl
       module which is loaded at SEC startup, and use  the  code  through  the
       module interface	(see perlmod(1)	for further details):

       type=Single
       ptype=SubStr
       pattern=SEC_STARTUP
       context=SEC_INTERNAL_EVENT
       desc=Load the SecStuff module
       action=eval %ret	(require '/usr/local/sec/SecStuff.pm');	\
	      if %ret (	none ) else ( eval %o exit(1) )

       type=Single
       ptype=PerlFunc
       pattern=sub { return SecStuff::my_match($_[0]); }
       desc=event '$0' was matched by my_match()
       action=write - %s

EXAMPLES
   Example 1 - a ruleset for Cisco events
       This  section  presents an example rulebase for managing	Cisco devices.
       It is assumed that the managed devices have syslog logging enabled, and
       that all	syslog messages	are sent to a central host and written to  log
       file(s) that are	monitored by SEC.

       # Set up	contexts NIGHT and WEEKEND for nights
       # and weekends. The context NIGHT has a lifetime
       # of 8 hours and	the context WEEKEND 2 days

       type=Calendar
       time=0 23 * * *
       desc=NIGHT
       action=create %s	28800

       type=Calendar
       time=0 0	* * 6
       desc=WEEKEND
       action=create %s	172800

       # If a router does not come up within 5 minutes
       # after it was rebooted,	generate event
       # "<router> REBOOT FAILURE". The	next rule matches
       # this event, checks the	router with ping and sends
       # a notification	if there is no response.

       type=PairWithWindow
       ptype=RegExp
       pattern=\s([\w.-]+) \d+:	%SYS-5-RELOAD
       desc=$1 REBOOT FAILURE
       action=event %s
       ptype2=RegExp
       pattern2=\s$1 \d+: %SYS-5-RESTART
       desc2=%1	successful reboot
       action2=logonly
       window=300

       type=SingleWithScript
       ptype=RegExp
       pattern=^([\w.-]+) REBOOT FAILURE
       script=/bin/ping	-c 3 -q	$1
       desc=$1 did not come up after reboot
       action=logonly $1 is pingable after reboot
       action2=pipe '%t: %s' /bin/mail root@localhost

       # Send a	notification if	CPU load of a router is	too
       # high (two CPUHOG messages are received	within 5
       # minutes); send	another	notification if	the load is
       # normal	again (no CPUHOG messages within last 15
       # minutes). Rule	is not active at night or weekend.

       type=SingleWith2Thresholds
       ptype=RegExp
       pattern=\s([\w.-]+) \d+:	%SYS-3-CPUHOG
       context=!(NIGHT || WEEKEND)
       desc=$1 CPU overload
       action=pipe '%t:	%s' /bin/mail root@localhost
       window=300
       thresh=2
       desc2=$1	CPU load normal
       action2=pipe '%t: %s' /bin/mail root@localhost
       window2=900
       thresh2=0

       # If a router interface is in down state	for less
       # than 15 seconds, generate event
       # "<router> INTERFACE <interface> SHORT OUTAGE";
       # otherwise generate event
       # "<router> INTERFACE <interface> DOWN".

       type=PairWithWindow
       ptype=RegExp
       pattern=\s([\w.-]+)  \d+:  %LINK-3-UPDOWN: Interface ([\w.-]+), changed
       state to	down
       desc=$1 INTERFACE $2 DOWN
       action=event %s
       ptype2=RegExp
       pattern2=\s$1 \d+: %LINK-3-UPDOWN: Interface $2,	changed	state to up
       desc2=%1	INTERFACE %2 SHORT OUTAGE
       action2=event %s
       window=15

       # If "<router> INTERFACE	<interface> DOWN" event	is
       # received, send	a notification and wait	for
       # "interface up"	event from the same router interface
       # for the next 24 hours

       type=Pair
       ptype=RegExp
       pattern=^([\w.-]+) INTERFACE ([\w.-]+) DOWN
       desc=$1 interface $2 is down
       action=pipe '%t:	%s' /bin/mail root@localhost
       ptype2=RegExp
       pattern2=\s$1 \d+: %LINK-3-UPDOWN: Interface $2,	changed	state to up
       desc2=%1	interface %2 is	up
       action2=pipe '%t: %s' /bin/mail root@localhost
       window=86400

       # If ten	"short outage" events have been	observed
       # in the	window of 6 hours, send	a notification

       type=SingleWithThreshold
       ptype=RegExp
       pattern=^([\w.-]+) INTERFACE ([\w.-]+) SHORT OUTAGE
       desc=Interface $2 at node $1 is unstable
       action=pipe '%t:	%s' /bin/mail root@localhost
       window=21600
       thresh=10

   Example 2 - hierarchically organized	rulesets for iptables and sshd events
       This section presents an	example	of hierarchically organized rules  for
       processing  Linux  iptables events from /var/log/messages and SSH login
       events from /var/log/secure. It is assumed that all rule	 files	reside
       in  the	/etc/sec directory and that the	rule hierarchy has two levels.
       The file	/etc/sec/main.rules contains first-level Jump rules for	match-
       ing and parsing events from input files and submitting them  to	proper
       rulesets	 for  further processing. All other rule files in the /etc/sec
       directory contain second-level rules which  receive  their  input  from
       first-level  Jump rules.	 Also, the example assumes that	SEC is started
       with the	following command line:

       /usr/bin/sec --conf=/etc/sec/*.rules --intcontexts \
		    --input=/var/log/messages --input=/var/log/secure

       #
       # the content of	/etc/sec/main.rules
       #

       type=Jump
       context=[ _FILE_EVENT_/var/log/messages ]
       ptype=PerlFunc
       pattern=sub { my(%var); my($line) = $_[0]; \
	       if ($line !~ /kernel: iptables:/g) { return 0; }	\
	       while ($line =~ /\G\s*([A-Z]+)(?:=(\S*))?/g) { \
		 $var{$1} = defined($2)?$2:1; \
	       } return	\%var; }
       varmap=IPTABLES
       desc=parse iptables events and direct to	relevant ruleset
       cfset=iptables

       type=Jump
       context=[ _FILE_EVENT_/var/log/secure ]
       ptype=RegExp
       pattern=sshd\[(?<pid>\d+)\]: (?<status>Accepted|Failed) \
       (?<authmethod>[\w-]+) for (?<invuser>invalid user )?\
       (?<user>[\w-]+) from (?<srcip>[\d.]+) port (?<srcport>\d+) ssh2$
       varmap=SSH_LOGIN
       desc=parse SSH login events and direct to relevant ruleset
       cfset=ssh-login

       type=Jump
       context=[ SSH_EVENT ]
       ptype=TValue
       pattern=True
       desc=direct SSH synthetic events	to relevant ruleset
       cfset=ssh-events

       #
       # the content of	/etc/sec/iptables.rules
       #

       type=Options
       procallin=no
       joincfset=iptables

       type=SingleWithThreshold
       ptype=Cached
       pattern=IPTABLES
       context=IPTABLES	:> ( sub { return exists($_[0]->{"SYN"}) && \
					  exists($_[0]->{"FIN"}) ; } ) \
	       && !SUPPRESS_IP_$+{SRC}
       desc=SYN+FIN flood from host $+{SRC}
       action=pipe '%t:	%s' /bin/mail -s 'iptables alert' root@localhost; \
	      create SUPPRESS_IP_$+{SRC} 3600
       window=10
       thresh=100

       type=SingleWithThreshold
       ptype=Cached
       pattern=IPTABLES
       context=IPTABLES	:> ( sub { return exists($_[0]->{"SYN"}) && \
					 !exists($_[0]->{"ACK"}) ; } ) \
	       && !SUPPRESS_IP_$+{SRC}
       desc=SYN	flood from host	$+{SRC}
       action=pipe '%t:	%s' /bin/mail -s 'iptables alert' root@localhost; \
	      create SUPPRESS_IP_$+{SRC} 3600
       window=10
       thresh=100

       #
       # the content of	/etc/sec/ssh-login.rules
       #

       type=Options
       procallin=no
       joincfset=ssh-login

       type=Single
       ptype=Cached
       pattern=SSH_LOGIN
       context=SSH_LOGIN :> ( sub { return $_[0]->{"status"} eq	"Failed" && \
					   $_[0]->{"srcport"} <	1024 &&	\
					   defined($_[0]->{"invuser"});	} )
       continue=TakeNext
       desc=Probe of invalid user $+{user} from	privileged port	of $+{srcip}
       action=pipe '%t:	%s' /bin/mail -s 'SSH alert' root@localhost

       type=SingleWithThreshold
       ptype=Cached
       pattern=SSH_LOGIN
       context=SSH_LOGIN :> ( sub { return $_[0]->{"status"} eq	"Failed" && \
					   defined($_[0]->{"invuser"});	} )
       desc=Ten	login probes for invalid users from $+{srcip} within 60s
       action=pipe '%t:	%s' /bin/mail -s 'SSH alert' root@localhost
       thresh=10
       window=60

       type=PairWithWindow
       ptype=Cached
       pattern=SSH_LOGIN
       context=SSH_LOGIN :> ( sub { return $_[0]->{"status"} eq	"Failed"; } )
       desc=User $+{user} failed to log	in from	$+{srcip} within 60s
       action=cevent SSH_EVENT 0 %s
       ptype2=Cached
       pattern2=SSH_LOGIN
       context2=SSH_LOGIN :> \
		  ( sub	{ return $_[0]->{"status"} eq "Accepted"; } ) && \
		$+{user} %+{user} $+{srcip} %+{srcip} -> \
		  ( sub	{ return $_[0] eq $_[1]	 &&  $_[2] eq $_[3]; }	)
       desc2=User $+{user} logged in successfully from $+{srcip} within	60s
       action2=logonly
       window=60

       #
       # the content of	/etc/sec/ssh-events.rules
       #

       type=Options
       procallin=no
       joincfset=ssh-events

       type=SingleWithThreshold
       ptype=RegExp
       pattern=User ([\w-]+) failed to log in from [\d.]+ within 60s
       desc=Ten	login failures for user	$1 within 1h
       action=pipe '%t:	%s' /bin/mail -s 'SSH alert' root@localhost
       thresh=10
       window=3600

ENVIRONMENT
       If the SECRC environment	variable is set, SEC expects it	to contain the
       name of its resource file. Resource file	lines which are	empty or which
       begin with the number sign (#) are ignored (whitespace may precede  #).
       Each  remaining line is appended	to the argv array of SEC as a *single*
       element.	 Also, the lines are appended to argv in the order they	appear
       in the resource file.  Therefore, if the	SEC command line option	has  a
       value,  the  option  name and the value must either be separated	by the
       equal sign (=) or a newline.  Here is a simple resource file example:

       # read events from standard input
       --input=-

       # rules are stored in /etc/sec/test.conf
       --conf
       /etc/sec/test.conf

       Note that although SEC rereads its resource file	at  the	 reception  of
       the SIGHUP or SIGABRT signal, adding an option that specifies a certain
       startup	procedure  (e.g.,  --pid or --detach) will not produce the de-
       sired effect at runtime.	Also note that the resource  file  content  is
       *not* parsed by shell, therefore	shell metacharacters are passed	to SEC
       as-is.

SIGNALS
       SIGHUP full  restart  --	 SEC will reinterpret its command line and re-
	      source file options, reopen its log and input files,  close  its
	      output files and sockets (these will be reopened on demand), re-
	      load  its	 configuration,	and drop *all* event correlation state
	      (all event correlation operations	will be	terminated,  all  con-
	      texts will be deleted, all action	list variables will be erased,
	      etc.).  With  the	 --childterm  option,  SEC  will also send the
	      SIGTERM signal to	its child processes.

       SIGABRT
	      soft restart -- SEC will reinterpret its command	line  and  re-
	      source  file  options, reopen its	log file, and close its	output
	      files and	sockets	(these will be reopened	 on  demand).  If  the
	      --keepopen  option  is  specified, previously opened input files
	      will remain open across soft restart, otherwise all input	 files
	      will  be	reopened.   SEC	 will (re)load configuration from rule
	      files which have been modified (file modification	time  returned
	      by stat(2) has changed) or created after the previous configura-
	      tion load.  SEC will also	terminate event	correlation operations
	      started from rule	files that have	been modified or removed after
	      the  previous  configuration  load.  Other operations and	previ-
	      ously loaded configuration from unmodified rule files  will  re-
	      main  intact.  Note that on some systems SIGIOT is used in place
	      of SIGABRT.

       SIGUSR1
	      detailed information about the current state of SEC (performance
	      and rule matching	statistics, running event  correlation	opera-
	      tions,  created  contexts, etc.) will be written to the SEC dump
	      file.

       SIGUSR2
	      SEC will reopen its log file (useful for log file	rotation), and
	      also close its output files and sockets which will  be  reopened
	      on demand.

       SIGINT SEC will increase	its logging level by one; if the current level
	      is  6, the level will be set back	to 1. Please note this feature
	      is available only	if SEC is running non-interactively (e.g.,  in
	      daemon mode).

       SIGTERM
	      SEC  will	terminate gracefully. With the --childterm option, all
	      SEC child	processes will receive SIGTERM.

BUGS
       With some locale	settings, single quotes	(') in this man	page might  be
       displayed  incorrectly. As a workaround,	set the	LANG environment vari-
       able to C when reading this man page (e.g., env LANG=C man sec).

AUTHOR
       Risto Vaarandi (firstname d0t lastname at gmail d0t c0m)

ACKNOWLEDGMENTS
       The author is grateful to SEB Estonia for supporting  this  work.   The
       author also thanks the following	people for supplying software patches,
       documentation  fixes,  and  suggesting  new features: Al	Sorrell, Brian
       Mielke, David Lang, James Brown,	Jon  Frazier,  Mark  D.	 Nagel,	 Peter
       Eckel,  Rick  Casey, and	William	Gertz.	Last but not least, the	author
       expresses his profound gratitude	to John	P. Rouillard  for  many	 great
       ideas and creative discussions that have	helped to develop SEC.

SEE ALSO
       cron(8),	 crontab(1), execvp(3),	fork(2), mail(1), perl(1), perlmod(1),
       perlre(1), pipe(2),  sh(1),  snmptrap(1),  stat(2),  strftime(3),  sys-
       log(3), time(2),	umask(2)

SEC 2.9.3			 November 2024				sec(1)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=sec&sektion=8&manpath=FreeBSD+Ports+15.0>

home | help