-
Notifications
You must be signed in to change notification settings - Fork 1
logNOT is application that implements simple tool that can be instructed to track and measure frequency of textual log items, and to trigger specific action/command when ever frequency of monitored log item or items goes above or bellow defined frequency limits
License
fkasumovic/logNOT
Folders and files
| Name | Name | Last commit message | Last commit date | |
|---|---|---|---|---|
Repository files navigation
LOGS NOTIFICATION TOOL - logNOT
Abstract
logNOT is application that implements simple tool that can be
instructed to track and measure frequency of textual log items,
and to trigger specific action/command when ever frequency of
monitored log item or items goes above or bellow defined
frequency limits. Frequency is defined as number of item
occurrence per time period. logNOT can process logs in “real-time”
at moment immediately after logs are writhed to log file. Action
or command that will be triggered by logNOT is defined by user,
can be any executable program or shell script. What this action
will do depends on user. Other words it is building block of
larger system implementation, and its goal is to simplify that
implementation, removing one of the problems that disrupt big
picture. logNOT is very lightweight application that dose not add
any significant payload to system.
Table of Contents
0.1 Introduction
0.2 Important requirements and dependencies
0.3 Features
0.4 Installation
0.4.1 Running
0.5 Log file monitoring
0.6 Logs filtering
0.6.1 Log file permissions
0.7 logNOT configuration
0.7.1 Command line options
Usage:
0.7.2 Configuration file
0.7.3 Reloading configuration
0.8 Summary
0.9 Examples
0.9.1 Notifying on system errors
0.9.2 SSH brute force attack detection
0.9.3 Log size notification
0.1 Introduction
Motivation behind this project is to get simple reliable way of
fetching logs of interest at “real-time” for monitoring or
indexing purpose. Concept of real-time here is “soft real-time”,
there is no guarantee that logNOT will respond within strict
deadline, but in most cases it will respond in hundreds of
second, except in cases of extra ordinary load which can cause
such slow response of all applications. Purpose of log monitoring
is ability to define and extract certain events of interest from
the system. Such as brute force attack detection on service,
detection of possible system problems, and so on. Once this is
done, left to do is handling this events, like providing
notifications or any action required. The other possible aspect
of logNOT is to serve as middle connection between logs and
indexing service. logNOT already knows to track and extract
events from logs. The other part of logNOT can be implementation
of ability to pass all and/or filtered logs to specific service
that will serve for further analyser of log content. But this is
not primary goal for initial launch of this project.
0.2 Important requirements and dependencies
• logNOT is designed and implemented only to work on Linux
systems
• libpcre 8.02 or higher (Perl Compatible Regular Expressions C
library)
• Linux kernel 2.6.18 or higher
• INOTIFY feature enabled in Linux kernel.
Symbol: INOTIFY [=y]
Prompt: Inotify file change notification support
Defined at fs/notify/inotify/Kconfig:1
Location:
-> File systems
Selected by: AUDIT_TREE [=n] && AUDITSYSCALL [=n]
Symbol: INOTIFY_USER [=y]
Prompt: Inotify support for userspace
Defined at fs/notify/inotify/Kconfig:16
Location:
-> File systems
Selects: FSNOTIFY [=y]
0.3 Features
• Real-time monitoring of log files.
• Down-bound and and up-bound frequency of logs notification.
• Log file size notification.
• Filtering logs with PCRE (Perl Compatible Regular Expressions).
• Frequency count by CRC (Cycle Redundancy Check) of logs match.
(Meaning explained later)
• Automatic handling of logrotate. There is no need to configure
logrotate to send SIGHUP signal to logNOT for files monitored
by logNOT. Actually, if you send SIGHUP signal to logNOT it
will only reopen its own log file.
0.4 Installation
Currently logNOT is distributed as source code package that can
be fetched from https://github.com/fkasumovic/logNOT. After
fetching logNOT package it must be extracted
~# tar zxf lognot-0.1.tar.gz
After extraction with above command in current working directory
will be created lognot-0.1 directory. Change directory to newly
extracted directory:
~# cd lognot-0.1
Execute autogen.sh script in directory:
~# ./autogen.sh
Next step is to run configure script:
~# ./configure --prefix=/usr
For debug version run configure following way:
~# ./configure --prefix=/usr --enable-debug
To include additional debug features as dead lock detection and
additional logs, export CXXFLAGS=” -D_DEBUG” variable:
~# export CXXFLAGS=" -D_DEBUG"; ./configure --enable-debug
In order to compile run:
~# make all
And as final step install logNOT by executing:
~# make install
0.4.1 Running
To run logNOT you basically need to create configuration file
that will be specified. Sample configuration file 'sample.conf'
is distributed with source code. By default logNOT will execute
in foreground and write its output to syslog as in following
example:
~# lognot -c sample.conf
By default, if configuration file is not specified logNOT will
search for it at /etc/lognot.conf, if configuration file is not
found logNOT will exit with error. If you want logNOT to write on
standard output specify -s flag as following:
~# lognot -c sample.conf -s
If you want to specify log file where logNOT should write its
logs use -l <file path> flag. And finally to run logNOT as daemon
specify -d flag:
~# lognot -d -c sample.conf
Above will run logNOT as background process which will use
sample.conf as configuration and write its own logs to syslog.
More options like running under specific user account and so on
is explained in logNOT configuration section of this document. If
logNOT hangs at startup, check the log or run it with -s flag to
see error message.
0.5 Log file monitoring
logNOT will perform “real-time” monitoring from moment it opens
log file for reading. It will position at end of log file
ignoring all logs from history. When ever content of file
changes, logNOT will read all new lines till end of last
completed line, and process each of extracted lines. If there is
no changes logNOT will not execute at all. It will not do
periodic checks for changes as similar tools do, rather it will
wait for kernel notification about current state of file. This
cycle will repeat for all time logNOT is running. History in the
logs that appears in file before logNOT starts to monitor it, are
not subject of interest, monitoring in this case is about knowing
what is going on at presence, what was happen before is subject
of logs history analysis. Mixing this two leads to logical
issues, and presents miss approach to problem.
0.6 Logs filtering
Detecting specific log items in the log is defined using perl
compatible regular expressions. Any log item that match to
specified regular expression will be counted. More than one
criteria are allowed to be defined per single log. logNOT is
configured trough ini configuration, each log item that need to
be monitored is specified by ini section, multiple ini section
can refer to single log, that way you can monitor multiple log
items per single log, and define different behaviour for each of
them. Following example represents configuration for ssh brute
force attack detection.
[SSH_AUTH]
regex=error: PAM: Authentication failure for illegal user (.*)
from (.*)$
path = /var/log/messages
usecrc=TRUE
upbound_action = /root/block_source "$2"
upbound_freq=5/30
[SSH_IU]
regex=\]: Invalid user (.*) from (.*)$
path = /var/log/messages
usecrc=TRUE
upbound_action = /root/block_source "$2"
upbound_freq=5/30
Meaning of above example is that if there is more then 5 failed
authentication attempts within 30 seconds then, call the script
that will block source ip. Another example would be to define
upbound_action to block source address matched from log item, by
calling iptables directly.
upbound_action=/sbin/iptables -I SSHD -s $2 -j DROP
In above example:
regex parameter defines filter for logs by specifying perl
regular expression
upbound_freq defines how many times log must repeat in some
time period, in format count/time in seconds
path defines monitored log file location
upbound_action specifies command to execute on matching
criteria regex and upbound_freq
usecrc will cause logNOT to trigger notification only if log
repeats more then 5 times from same IP
logNOT have ability to pass regular expression matches from
matched log item in form $#, where $1 is first match $2 second
and so on... Above expression is defined to extract ip for which
asterisk was reported, failed registration. If you need to use $
character in action specification escape it with \ character as
'\$', if you need to specify \ character specify it as '\\'. In
general case, there can be multiple different messages that match
to same regular expression, that's why logNOT takes crc of each
match and counts per this crc. For example, if you have many
users and all they authenticate at same time it will not trigger
logNOT if 6 different users miss type password or username. But
if you have more then 5 authentication attempts failed from same
ip address in 30 seconds that will trigger logNOT. Cause of this,
special care must be taken when specifying expression with usecrc
option enabled, if it includes date time part of message for
example that will change for almost each new log item, it may not
work as expected to work. Almost any log includes date and time,
but its easy to avoid this issue, cause logNOT will not crc whole
log item but part of it that is exact match to what is specified
by match_expr. Specifying $@ will pass complete log item, this
can be used for passing filtered logs (or even all logs) to
another application if required. logNOT also allows to specify
down bound frequency, that will trigger action if specified log
item is less frequent then downbound_freq. Reason behind this is
that you may expect logs from some applications on regular base,
and if they are not present would mean that something is wrong
and some action should be taken in that case. Setting 0/0 for
frequency, either for up bound or down bound frequency disables
frequency detection and notification will be triggered on every
match.
0.6.1 Log file permissions
logNOT requires read permissions on files it monitors, and read
permissions on directory where log file is placed if log will be
rotated. Cause it is using inotify Linux kernel feature that can
only watch inode if you have read permissions on it.
0.7 logNOT configuration
There is two types of configuration parameters to logNOT, and
each is used for appropriate options. There are command line
options to start logNOT with, and configuration file.
0.7.1 Command line options
Usage:
lognot --config <filename> [options] lognot --test <regexp>
Options:
-h --help Display this usage information and
exit.
-c --config <filename> This is configuration file location
(required).
-l --logfile <filename> Write logs in to this file.
-d --daemon Start as background application.
-s --stdout Write logs to standard output.
-u --uid <uid> Change uid
-g --gid <gid> Change gid
-w --chdir <directory> Change working directory
-p --pid <full path> Set process pid file path. Applies
with --daemon only.
-t --test <filename> Test specified configuration file.
-T --retest <reg expr> Test specified regular expression
on line/s from standard input.
-v --verbose Run as debug.
(Careful! frequent logs)
-V --version Print version information and exit.
0.7.2 Configuration file
As already shown, logNOT configuration is simple ini file. Each
section of ini file defines single log item to monitor, and as we
stated before multiple items can refer to same log file. Meaning
of each configuration file options is described in following
list.
[general] Is a special section, meant to be used for global
configuration parameters and default configuration values.
Following are global options which apply only to [general]
section:
athread_count Specify number of action threads. logNOT notifies
by executing specified action. Each action is first pushed to
execution queue, actions pending in the queue are fetched by
action threads and executed. If there is only one thread and
multiple actions triggered at same time, actions would be
executed sequentially one by one. If there is more then one
action thread, then more then one action can be triggered at
same time. Default value is 2.
uid Allows you to specify effective user id for logNOT process.
Command line option overrides configuration file if specified.
gid Allows you to specify effective group id for logNOT
process. Command line option overrides configuration file if
specified.
All other options can be specified in [general] section, and they
will stand for default in all other log items sections where this
options are not specified. logNOT is configuration is organized
per monitored items, each new item creates as new section in
configuration file [item name]. Bellow list of options can be
specified per each item:
path This option is to specify location of monitored file. This
options is required, if not specified logNOT will fail at start
up with error.
regex Specify here with perl regular expression what are the
logs of interest, if you want all logs simple set .* for the
value, or don't specify at all cause default value is .* . For
more options please refer to PCRE documentation, and examples.
upbound_action Is to specify what should be executed, other
words specify how to notify about watched log events. It allows
to specify shell command which will be executed by calling
system() function from C standard library. This option also
allows to pass regular expression matches to specified shell
commands, respectively $0 stands for match 0, $1 for match 1,
and so on in array of matches from regular expression (refer to
PCRE documentation for more information). If you want to pass
complete current log line where event triggered with use $@. If
$ character is otherwise used and not to specify argument it
should be escaped with backslash \ escape.
upbound_freq If not specified upbound_action will be executed
on each match. Otherwise it defines how many times monitored
log item ca repeat in some time period specified in seconds
units before logNOT will execute up bound action. Frequency is
specified in format <count>/<time seconds>.
downbound_action Is equivalent to upbound_action, with
difference its executed in case monitored item frequency drops
bellow value specified with downbound_freq option and it dose
not accept arguments from regular expression match, simple
cause it actives when no logs that match.
downbound_freq Define down limit for frequency expected for
monitored log item to appear. If not specified or specified as
0/<time> option is disabled.
usecrc This option accepts 0,1,yes,no,true or false values, and
is case insensitive. If enabled it will tell logNOT to measure
frequency per CRC (Cycle Redundancy Check) of $0 match. This is
useful if you want to trigger action only if repeated logs are
exactly same.
size Specify size of file on which if reached logNOT needs to
notify by executing command specified by size_action. logNOT
will also notify when ever size of file reaches 2xsize, 3xsize
and so on, on each value which is multiple of size. This is not
exact accurate on level of single byte, especially for small
values of size, simple cause writhed data at once can reach
multiple of size in single event and in that case logNOT will
notify only once. Its easy to check, simple set size to 1B (1
byte) and write some text line to monitored file it will
definitely be more then one byte. Value is specified as
<number><unit>, where unit can be B - for bytes, K - for
kilobytes, M - for megabytes and only on 64 bit systems G - for
gigabytes. If unit not specified but only number default unit
is byte.
size_action Allows to define action to be executed when ever
monitored file reaches multiple of size value option.
0.7.3 Reloading configuration
There is situations when its useful to change configuration of
logNOT with shortest interrupt possible on its current
monitoring. Sending SIGUSR1 signal to logNOT will cause it to
reload its configuration file. If there is errors in
configuration, logNOT will log errors and continue with original
configuration without interrupt. If everything is ok with new
configuration, logNOT will reinitialize to monitor per new
configuration settings. Always check if configuration is
successfully reloaded after making changes.
0.8 Summary
logNOT is meant to be simple, easy to manage and control. logNOT
can be deployed as stand alone application for monitoring logs,
and also can be easily integrated as part of bigger system.
logNOT can monitor for occurrence of specific log item/s,
specified by regular expressions, and allows to specify any
desired log item frequency as additional condition for firing
action. And logNOT provides mechanism for filtering, extracting
and passing information from logs, and as well passing of
complete log items.
0.9 Examples
0.9.1 Notifying on system errors
This is simplest example used to detect any logs that contains
word error. Following is content of logNOT configuration file.
[messages]
path=/var/log/messages
regex=error
upbound_action = /root/scripts/email_warning $@
/root/scripts/email_warning is a shell script you can create
using sendmail or similar tools for emailing warning message
about potential issues on the system. One example would be
following:
#!/bin/bash
cat | sendmail -t <<EOF
from: system1@domainname
to: user@domainname
subject: System Warning
There is following error message in the log:
$@
EOF
exit $?
0.9.2 SSH brute force attack detection
Following example demonstrate how to block source ip for 15
minutes if ssh authentication fails more then 3 times in one
minute.
[SSH_AUTH]
regex=error: PAM: Authentication failure for (.*) from (.*)$
path = /var/log/messages
usecrc=TRUE
upbound_action = /root/block_source "$2"
upbound_freq=3/60
[SSH_IU]
regex=\]: Invalid user (.*) from (.*)$
path = /var/log/messages
usecrc=TRUE
upbound_action = /root/block_source "$2"
upbound_freq=3/60
Script block_source used above as part of upbound_action can be
something like following:
#!/bin/bash
if [ -z "$1" ];then
# script requires argument
exit 0
fi
# log can contain domain name instead ip address and we want to
resolve to ip
# it dosen't metter if ping replies or not
ip=`ping -c 1 -i 0.1 $1 | pcregrep "^PING" | awk '{ print $3 }'`
ip=${ip##\(} ip=${ip%%\)}
#make log about this action and block source ip
logger -t "ssh_bf_detection" "BLOCKING IP: $ip"
iptables -I INPUT -s $ip -j DROP
# unblock ip after 15 minutes
chain=`iptables -n --line-numbers -L INPUT | grep "$ip" | awk
'{print $1}'`
echo "iptables -D INPUT $chain" | at now + 15 minutes
exit 0
0.9.3 Log size notification
In this example we simple track size of log and we want to email
warning message if log size goes above 100 megabytes:
[messages]
path=/var/log/messages
size=100M
size_action=/root/scripts/email_warning “Message about log size”
About
logNOT is application that implements simple tool that can be instructed to track and measure frequency of textual log items, and to trigger specific action/command when ever frequency of monitored log item or items goes above or bellow defined frequency limits
Resources
License
Stars
Watchers
Forks
Packages 0
No packages published