From 3af98f4b3de1f572148fadd548241742a59408a8 Mon Sep 17 00:00:00 2001 From: Tomas Plesnik <plesnik@ics.muni.cz> Date: Fri, 8 Feb 2013 11:10:53 +0100 Subject: [PATCH] zmena umisteni do contrib --- src/warden-server/bin/wardenWatchdog.pl | 271 ------------------------ 1 file changed, 271 deletions(-) delete mode 100755 src/warden-server/bin/wardenWatchdog.pl diff --git a/src/warden-server/bin/wardenWatchdog.pl b/src/warden-server/bin/wardenWatchdog.pl deleted file mode 100755 index 001a169..0000000 --- a/src/warden-server/bin/wardenWatchdog.pl +++ /dev/null @@ -1,271 +0,0 @@ -#!/usr/bin/perl -# -# WardenWatchdog.pl -# -# Copyright (C) 2011-2012 Cesnet z.s.p.o -# -# Use of this source is governed by a BSD-style license, see LICENSE file. - - -#use WardenConf; -use strict; -use warnings; -use DBI; -use DBD::mysql; -use DateTime; -use Email::Simple; -use Sys::Hostname; -use Data::Dumper; - -sub sendmail_wrapper{ - my $message = shift; - if(open(my $sendmail, '|/usr/sbin/sendmail -oi -t')){ - print $sendmail $message; - close $sendmail; - return 1; - } else { - return (0, "Sending email failed: $!"); - } -} - -# Array of hashes -#{query => ; text => ; contact => } - -sub send_report{ - - my $input_data = shift; - my $contact = $$input_data{'contact'}; - my $domain = $$input_data{'domain'}; - my $text = $$input_data{'text'}; - - my $from_hostname; - my $message; - - if(!($contact)){ - return (0, "Empty 'To' email header!\n"); - } - - $domain =~ s/\./\./; - eval{ - $from_hostname = hostname(); - if(!($from_hostname =~ m/^$domain$/gi)){ - $from_hostname = $domain; - } - 1; - } or do { - return (0, "Can't retrive hostname for 'From' header!\n"); - }; - - eval{ - $message = Email::Simple->create( - header => [ - To => $contact, - From => 'warden_watchdog@'.$from_hostname, - Subject => "Kotrola stavu udalosti warden serveru na stroji $domain"], - body => $text); - } or do { - return (0, "Can't create email message\n"); - }; - - my ($rc, $err) = sendmail_wrapper($message->as_string); - if(!$rc){ - return (0, $err); - } - return 1; -} - -sub connect_to_DB { - - my $dbPlatform = 'mysql'; - my $dbName = 'warden'; - my $dbHostname = 'localhost'; - my $dbUser = 'root'; - my $dbPasswd = 'w4rd3n&r00t'; - - my $dbhRef = shift; - my $dbh; - - if($dbh = DBI->connect( "dbi:$dbPlatform:database=$dbName;host=$dbHostname", $dbUser, $dbPasswd, {RaiseError => 1, mysql_auto_reconnect => 1})){ - $$dbhRef = $dbh; - return 1; - } - else{ - return (0,"Cannot connect to database! ".DBI->errstr); - } -} - - -sub update_procedures{ - - my $procRef = shift; - - my @procedures = @{$procRef}; - my $dbh; - - # connect to DB - my ($rc,$err) = connect_to_DB(\$dbh); - if (!$rc){ - return (0,'update_procedures can\'t connect do DB: '.$err); - } - - foreach my $proc (@procedures) { - $dbh->do($proc); - } - - # disconnect to DB - $dbh->disconnect; - - return 1; -} - - -sub send_query{ - - my $configRef = shift; - my $eventsRef = shift; - - my @config = @{$configRef}; - my %bad_events; - my ($rc,$err); - my $dbh; - - my $i = 0; - # connect to DB - ($rc,$err) = connect_to_DB(\$dbh); - if (!$rc){ - return (0,'send_query can\'t connect do DB: '.$err); - } - - while ($i < scalar(@config)) { - # run DB query -> requestor, client name - my $sth; - if (defined($config[$i]{query})){ - $sth = $dbh->prepare($config[$i]{query}); - } - else{ - return (0, "No query availble\n"); - } - - if (!($sth->execute)){ - return (0, "Couldn't get data from my database: $sth->errstr\n"); - }; - - my @result; - my $contact; - my $msg_text = 1; - while(@result = $sth->fetchrow()){ - if (defined($config[$i]{contact})){ - $contact = $config[$i]{contact}; - if($msg_text){ - $bad_events{$contact} .= $config[$i]{text} . "\n\n"; - $msg_text = 0; - } - $bad_events{$contact} .= join(", ",@result) . "\n"; - } - else{ - $contact = "from_db\@$result[0]"; - $bad_events{$contact} .= $config[$i]{text} . "\n\n"; - $bad_events{$contact} .= join(", ",@result) . "\n"; - } - } - foreach my $key (keys %bad_events){ - $bad_events{$key} .= "\n\n"; - } - - $sth->finish; - $i++; - } - # disconnect to DB - $dbh->disconnect; - - %$eventsRef = %bad_events; - - return 1; -} - - -sub run{ - - my $domain = shift; - my $period = shift; - - my $date; - - eval{ - my $dt = DateTime->now(); - $dt = DateTime->now()->subtract(days => $period); - $date = $dt->date(); - } or do { - #print "Warden watchdog - can't work with date\n"; - syslog("err|Warden watchdog - can't work with date\n"); - }; - - # stored procedures - # iptest - is ip from private network - - my @procedures = ('DROP FUNCTION IF EXISTS iptest;', 'CREATE FUNCTION iptest(ip VARCHAR(15)) RETURNS TINYINT(1) DETERMINISTIC -BEGIN - SET @nip = INET_ATON(ip); - IF( - ISNULL( @nip) OR - @nip BETWEEN 0 AND 16777216 OR - @nip BETWEEN 167772160 AND 171966464 OR - @nip BETWEEN 2130706432 AND 2130706433 OR - @nip BETWEEN 2851995648 AND 2851995649 OR - @nip BETWEEN 2886729728 AND 2886729729 OR - @nip BETWEEN 3221225472 AND 3221225473 OR - @nip BETWEEN 3221225984 AND 3221225985 OR - @nip BETWEEN 3227017984 AND 3227017985 OR - @nip BETWEEN 3232235520 AND 3232235521 OR - @nip BETWEEN 3323068416 AND 3323068417 OR - @nip BETWEEN 3325256704 AND 3325256705 OR - @nip BETWEEN 3405803776 AND 3405803777 OR - @nip BETWEEN 3758096384 AND 3758096385 OR - @nip BETWEEN 4026531840 AND 4026531841 OR - @nip > 4294967295) THEN - RETURN TRUE; - ELSE - RETURN FALSE; - END IF; -END;'); - - # {query => ; text => ; contact => } - # Time of last event of each client. - # Is it unsupported type of event? - # Is event from the future? - # Martane - Is IP from the private network? - my @configuration = ( - {query => "SELECT hostname, service, MAX(received) FROM events WHERE valid = 't' GROUP BY hostname, service ORDER BY MAX(received) ASC;", text => "Uvedeny klient, nebo klienti jiz delsi dobu nereportovali zadne udalosti do Wardenu. Je mozne, ze nefunguji spravne.", contact => 'jakubcegan@cesnet.cz, ph@cesnet.cz'}, - {query => "SELECT requestor FROM clients WHERE service IN (SELECT service FROM events WHERE detected > '$date' AND type NOT IN ('portscan', 'bruteforce', 'probe', 'spam', 'phishing', 'botnet_c_c', 'dos', 'malware', 'copyright', 'webattack', 'test', 'other') AND valid = 't' GROUP BY service) GROUP BY requestor;", text => "Uvedeny klient, nebo klienti zasilaji nepodporovany nebo zastaraly typ udalosti na server Warden", contact => 'jakubcegan@cesnet.cz, ph@cesnet.cz'}, - {query => "SELECT hostname, service, type, COUNT(*) FROM events WHERE detected - received > 0 AND received > '$date' GROUP BY hostname, service, type;", text => "Uvedeny klient, nebo klienti odesilaji odesilaji udalosti s casem z budoucnosti. Cas prirazeny serverem pri prichodu udalosti (received) musi byt vzdy roven nebo vetsi casu detekce (detected).", contact => 'jakubcegan@cesnet.cz, ph@cesnet.cz'}, - {query => "SELECT hostname, service, received, source, count(source) AS c, min(received), max(received) FROM events WHERE valid = 't' AND source_type = 'IP' AND iptest(source) GROUP BY hostname, service, source ORDER BY c DESC;", text => "Uvedeni klient, nebo klienti odesilaji udalosti se zdrojovou adresou, ktera by se nemela objevit v internetu (privatni rozsah), nebo je neplatna (prazdny oktet, oktet je vetsi nez 255, apod.). kvuli omezeni verzi MySQL serveru funguje zatim pouze pro IPv6.", contact => 'jakubcegan@cesnet.cz, ph@cesnet.cz'}); - - my ($rc,$err) = update_procedures(\@procedures); - if (!$rc){ - #print "Warden watchdog - $err\n"; - syslog("err|Warden watchdog - $err\n"); - } - - my %bad_events; - my $i = 0; - while ($i < scalar(@configuration)) { - my ($rc,$err) = send_query(\@configuration,\%bad_events); - if (!$rc){ - #print "Warden watchdog - $err\n"; - syslog("err|Warden watchdog - $err\n"); - } - $i++; - } - - while (my ($contact, $text) = each(%bad_events)){ - my %input = (contact => $contact, domain => $domain, text => $text); - my ($rc,$err) = send_report(\%input); - if (!$rc){ - #print $err; - syslog("err|Warden client - networkReporter $err\n"); - } - } -} - -run('warden-dev.cesnet.cz',7); -1; -- GitLab