-
Notifications
You must be signed in to change notification settings - Fork 1
/
README
609 lines (409 loc) · 19.8 KB
/
README
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
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”