Com\’è dura la professione!

13 giugno 2006

Nagios e Snort

Filed under: Amministrazione di sistema,Nagios — lbell @ 20:56

Sto iniziando a lavorare sull'integrazione dell'IDS piu' noto (snort) con Nagios. Il problema e' che da snort sarebbe possibile scatenare un comando asincrono di Nagios, ma snort sarebbe bloccato per troppo tempo da questa operazione. Una soluzione può essere quella di far scrivere gli allarmi di snort in alcuni files di log e far controllare da un job schedulato da cron la variazione di data di modifica di tale file. Dato che abbiamo gia' Nagios che svolge egregiamente questo tipo di lavoro, perché non chiamarlo in causa? Dobbiamo solamente creare un semplice plugin che controlli la data di variazione del file di log. Tutto molto semplice, ma questa soluzione ha un difetto: possono venire monitorati solo i files locali o su percorsi accessibili a meno di metter in piedi qualcosa di più complicato. Ecco il codice di esempio del plugin:

#! /bin/sh
#
# check_file_time Copyright (C) 2006 Luca Bellonda <lbell_at_tsc4.com>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty
# of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# you should have received a copy of the GNU General Public License
# along with this program (or with Nagios);  if not, write to the
# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
# Boston, MA 02111-1307, USA
# Out: State|LastTime=value;

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin

PROGNAME=`basename $0`
PROGPATH=`echo $0 | sed -e 's,[/][^/][^/]*$,,'`
REVISION=`echo '$Revision: 1.0 $' | sed -e 's/[^0-9.]//g'`

. $PROGPATH/utils.sh

#DEBUG="1"

print_usage() {
	echo "Usage: $PROGNAME (-f|--filename) file_name (-l|--lasttime)time"
}

print_help() {
	print_revision $PROGNAME $REVISION
	echo ""
	print_usage
	echo ""
	echo "This plugin checks if file modification time differs from last check."
	echo ""
	support
	exit 0
}

esegui_plugin()
{
    #check the command line
    while test $# -gt 0
    do
	case "$1" in
		-l|--lasttime)
			if [ -n "$last_time" ]
			then
				echo "Only one --lasttime argument is used"
                                print_usage
                                exit $STATE_UNKNOWN
			fi
			shift
			last_time="`echo $1|tr "," "|"`"
			last_time="`echo $last_time|cut -d '=' -f 2`"
			;;
		-f|--filename)
			if [ -n "$file_name" ]
			then
				echo "Only one --filename argument is used"
                                print_usage
                                exit $STATE_UNKNOWN
			fi
			shift
			file_name="`echo $1|tr "," "|"`"
			;;
		*)
			echo "Unknown argument $1"
			print_usage
			exit $STATE_UNKNOWN
			;;
	esac
	shift
    done
    #no time -> no work
    #if( test last_time_seen false -eq 0 ) then si puo' fare anche cosi'
    if [ ! -n "$last_time" ]; then
	last_time=0
	#echo "No last time argument"
	#print_usage
	#exit $STATE_UNKNOWN
    fi
    if [ ! -n "$file_name" ]; then
	echo "No file name argument"
	print_usage
	exit $STATE_UNKNOWN
    fi

# do the work
    last_check_time="echo $last_time | cut -d "=" -f 1"
    if [ ! -e "$file_name" ]; then
	echo 'File does not exists|LastTime=0'
	exit $STATE_UNKNOWN
    fi

time_of_actual_check=`stat --format=%Y $file_name`
    if [ "a$time_of_actual_check" != "a$last_time" ]
    then
        echo "ALERT|LastTime=$time_of_actual_check"
	exit $STATE_CRITICAL
    else
	echo "OK|LastTime=$time_of_actual_check"
	exit $STATE_OK
    fi

#echo "Errore generico|LastTime=$time_of_actual_check"
    #exit $STATE_CRITICAL
}

case "$1" in
	--help)
		print_help
		exit 0
		;;
	-h)
		print_help
		exit 0
		;;
	--version)
	   	print_revision $PROGNAME $REVISION
		exit 0
		;;
	-V)
		print_revision $PROGNAME $REVISION
		exit 0
		;;
	*)
		esegui_plugin $@
		exit 0
		;;
esac

1 commento »

  1. Se Nagios fosse installato su un Log Server, tutti i logs dei diversi *NIX server sarebbero disponibili all’analisi del tuo pluggin.

    Trasformare un Linux in un Log Server è semplice, basta eseguire il demone syslog con il parametro -r.

    P.S. Complimenti per il tuo blog!

    Commento di calore — 18 luglio 2006 @ 11:20 | Rispondi


RSS feed for comments on this post. TrackBack URI

Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

Crea un sito o un blog gratuitamente presso WordPress.com.

%d blogger cliccano Mi Piace per questo: