From d7ed9ad81e7cc9010f3a75b6ca5155d98c93ae7e Mon Sep 17 00:00:00 2001 From: Tomas Plesnik <plesnik@ics.muni.cz> Date: Tue, 13 Jan 2015 14:42:11 +0100 Subject: [PATCH] modul WardenClientSend.pm, WardenClientReceive.pm a funkce getClientInfo zahrnuty do jedine knihovny klienta WardenClient.pm --- src/warden-client/lib/WardenClient.pm | 225 ++++++++++++++++++++++++++ 1 file changed, 225 insertions(+) create mode 100755 src/warden-client/lib/WardenClient.pm diff --git a/src/warden-client/lib/WardenClient.pm b/src/warden-client/lib/WardenClient.pm new file mode 100755 index 0000000..74b777b --- /dev/null +++ b/src/warden-client/lib/WardenClient.pm @@ -0,0 +1,225 @@ +# WardenClient.pm +# +# Copyright (C) 2011-2015 Cesnet z.s.p.o +# +# Use of this source is governed by a BSD-style license, see LICENSE file. + +package WardenClient; + +use strict; +use warnings; + +use SOAP::Lite; +use File::Basename; +my $lib = File::Basename::dirname(__FILE__); +use lib $lib; +use WardenClientCommon; + +our $VERSION = "2.2"; + + +#------------------------------------------------------------------------------- +# saveNewEvent - send new event from detection scripts to warden server +#------------------------------------------------------------------------------- +sub saveNewEvent +{ + my $event_ref = shift; + + # prepare variables of event + my @event = @{$event_ref}; + my $service = $event[0]; + my $detected = $event[1]; + my $type = $event[2]; + my $source_type = $event[3]; + my $source = $event[4]; + my $target_proto = $event[5]; + my $target_port = $event[6]; + my $attack_scale = $event[7]; + my $note = $event[8]; + my $priority = $event[9]; + my $timeout = $event[10]; + + # Issue #596 - Should be removed in Warden client 3.0. + # check if obsolete event attribute 'Priority' is used + if ((defined $priority) && ($priority >= 0)) { + WardenClientCommon::errMsg('Event attribute "Priority" is now obsolete and will be removed in Warden client 3.0', 'warn'); + } + # check if obsolete event attribute 'Timeout' is used + if ((defined $timeout) && ($timeout >= 0)) { + WardenClientCommon::errMsg('Event attribute "Timeout" is now obsolete and will be removed in Warden client 3.0', 'warn'); + } + # end of Issue #596 + + # create SOAP data object + my $event; + eval { + $event = SOAP::Data->name( + event => \SOAP::Data->value( + SOAP::Data->name(SERVICE => $service), + SOAP::Data->name(DETECTED => $detected), + SOAP::Data->name(TYPE => $type), + SOAP::Data->name(SOURCE_TYPE => $source_type), + SOAP::Data->name(SOURCE => $source), + SOAP::Data->name(TARGET_PROTO => $target_proto), + SOAP::Data->name(TARGET_PORT => $target_port), + SOAP::Data->name(ATTACK_SCALE => $attack_scale), + SOAP::Data->name(NOTE => $note), + SOAP::Data->name(PRIORITY => $priority), + SOAP::Data->name(TIMEOUT => $timeout) + ) + ); + } # end of eval + or WardenClientCommon::errMsg('Unknown error when creating SOAP data object, ' . $@); + + # c2s() returns undef on fail + my $result = WardenClientCommon::c2s("saveNewEvent", $event); + + defined $result ? return 1 : return 0; + +} # End of saveNewEvent + + +#------------------------------------------------------------------------------- +# getNewEvents - get new events from warden server greater than last received ID +#------------------------------------------------------------------------------- +sub getNewEvents +{ + my @events; + + my $warden_path = shift; + my $requested_type = shift; + + my $vardir = $warden_path . "/var/"; + my $etcdir = $warden_path . "/etc/"; + my $libdir = $warden_path . "/lib/"; + + require $libdir . "WardenClientConf.pm"; + require $libdir . "WardenClientCommon.pm"; + + # read the config file + my $conf_file = $etcdir . "warden-client.conf"; + WardenClientConf::loadConf($conf_file); + + # set name of ID file for each client aplication + my ($caller_name) = ($FindBin::Script =~ /^(.*)$/); # untaint + my $id_file = $vardir . $caller_name . "-". ($requested_type || "any") . ".id"; + + #----------------------------------------------------------------------------- + # get last ID from ID file (if exist) or + # get last ID from warden server DB and save it into ID file + my $last_id; + if (-e $id_file) { + open(ID, "< $id_file") or return WardenClientCommon::errMsg("Cannot open ID file $id_file: $!"); + foreach(<ID>) { + $last_id = $_; + } + close ID; + } else { + # c2s() returns undef on fail + my $response = WardenClientCommon::c2s($WardenClientConf::URI, $WardenClientConf::SSL_KEY_FILE, $WardenClientConf::SSL_CERT_FILE, $WardenClientConf::SSL_CA_FILE, "getLastId"); + defined $response or return; # receive data or return undef + + $last_id = $response->result; + open(ID, "> $id_file") or return WardenClientCommon::errMsg("Cannot open ID file $id_file: $!"); + print ID $last_id; + close ID; + } + + #----------------------------------------------------------------------------- + # get new events from warden server DB based on gathered last ID + + my $request_data; + eval { + # create SOAP data object + $request_data = SOAP::Data->name( + request => \SOAP::Data->value( + SOAP::Data->name(REQUESTED_TYPE => $requested_type), + SOAP::Data->name(LAST_ID => $last_id), + SOAP::Data->name(MAX_RCV_EVENTS_LIMIT => $WardenClientConf::MAX_RCV_EVENTS_LIMIT) + ) + ) + } or return errMsg('Unknown error when creating SOAP data object, ' . $@); + + # call server method getNewEvents + my $response = WardenClientCommon::c2s($WardenClientConf::URI, $WardenClientConf::SSL_KEY_FILE, $WardenClientConf::SSL_CERT_FILE, $WardenClientConf::SSL_CA_FILE, "getNewEvents", $request_data); + defined $response or return; # connect to warden server or return undef + + # parse returned SOAP data object + my ($id, $hostname, $service, $detected, $type, $source_type, $source, $target_proto, $target_port, $attack_scale, $note, $priority, $timeout); + + my @response_list = $response->valueof('/Envelope/Body/getNewEventsResponse/event/'); + + while (scalar @response_list) { + my $response_data = shift(@response_list); + my @event; + + # parse items of one event + $id = $response_data->{'ID'}; + $hostname = $response_data->{'HOSTNAME'}; + $service = $response_data->{'SERVICE'}; + $detected = $response_data->{'DETECTED'}; + $type = $response_data->{'TYPE'}; + $source_type = $response_data->{'SOURCE_TYPE'}; + $source = $response_data->{'SOURCE'}; + $target_proto = $response_data->{'TARGET_PROTO'}; + $target_port = $response_data->{'TARGET_PORT'}; + $attack_scale = $response_data->{'ATTACK_SCALE'}; + $note = $response_data->{'NOTE'}; + $priority = $response_data->{'PRIORITY'}; + $timeout = $response_data->{'TIMEOUT'}; + + # push new event from warden server into @events which is returned + @event = ($id, $hostname, $service, $detected, $type, $source_type, $source, $target_proto, $target_port, $attack_scale, $note, $priority, $timeout); + push (@events, \@event); + + # set maximum received ID from current batch + if ($id > $last_id) { + $last_id = $id; + } + } #end of while loop + + # write last return ID + if (defined $last_id) { # must be defined for first check ID + open(ID, "> $id_file") or return WardenClientCommon::errMsg("Cannot open ID file $id_file: $!"); + print ID $last_id; + close ID; + } + + return @events; + +} # End of getNewEvents + + +#------------------------------------------------------------------------------- +# getClientInfo - retrieve information about other clients from Warden server +#------------------------------------------------------------------------------- +sub getClientInfo +{ + # obtain information about clients on Warden server + my $response = c2s("getClientInfo"); + defined $response or return; # receive data or return undef + + # parse server response (SOAP data object) + my @clients; + my @response_list = $response->valueof('/Envelope/Body/getClientInfoResponse/client/'); + + while (scalar @response_list) { + my $response_data = shift(@response_list); + my %client; + $client{'client_id'} = $response_data->{'CLIENT_ID'} ; + $client{'hostname'} = $response_data->{'HOSTNAME'}; + $client{'registered'} = $response_data->{'REGISTERED'}; + $client{'requestor'} = $response_data->{'REQUESTOR'}; + $client{'service'} = $response_data->{'SERVICE'}; + $client{'client_type'} = $response_data->{'CLIENT_TYPE'}; + $client{'type'} = $response_data->{'TYPE'}; + $client{'receive_own_events'} = $response_data->{'RECEIVE_OWN_EVENTS'}; + $client{'description_tags'} = $response_data->{'DESCRIPTION_TAGS'}; + $client{'ip_net_client'} = $response_data->{'IP_NET_CLIENT'}; + push (@clients,\%client); + } + + return @clients; +} # End of getClientInfo + +1; -- GitLab