06/01/2012
Controllare lo stato di iptables mediante Nagios
Recentemente su uno dei miei server ho lanciato il comando:
nightfly@nightbox:~$ sudo iptables -L
e con mio enorme disappunto mi sono accorto che le regole di firewalling che il server avrebbe dovuto caricare all'avvio erano praticamente assenti (eccezion fatta per fail2ban), indi per cui ho deciso di monitorare lo stato di iptables mediante Nagios.
Lo script che ho utilizzato per i check potete scaricarlo da qui. Inoltre, poichè tale script è piuttosto bacato, ho deciso di apportare qualche piccola correzione. Di seguito la versione originale dello script:
PARAM1=$1
TABLE=$2
MINRULES=$3
PARAM4=$4
LOG=/var/log/iptables/iptables.log
CHKIPTBLS=`/sbin/iptables -n -t filter -L |wc -l`
#
# Parameter Validation
##
if [ "$PARAM1" != "-T" -o "$TABLE" == "" -o "$MINRULES" != "-r" -o "$PARAM4" == "" ]; then
echo "Usage: $0 -T <table> -r <min rules>"
echo ""
exit 3
# Nagios exit code 3 = status UNKNOWN = orange
if [ "$PARAM1" == "-h" ]; then
echo ""
echo " -h = Display's this Help"
echo " -T = Table to check"
echo " Available Tables:"
echo " nat"
echo " mangle"
echo " filter"
echo " -r = Minimun quantity of rules"
echo ""
# Nagios exit code 3 = status UNKNOWN = orange
exit 3
fi
fi
##
# DO NOT MODIFY ANYTHING BELOW THIS
##
$CHKIPTBLS >/dev/null 2>/dev/null
if [ "$CHKIPTBLS" == 0 ]; then
TOTRULES=$CHKIPTBLS
else
TOTRULES=$[$CHKIPTBLS-8]
fi
if [ "$TOTRULES" -gt "$PARAM4" ]; then
echo "OK - Iptables are OK the table $TABLE has $TOTRULES rules configured"
# Nagios exit code 0 = status OK = green
exit 0
else
echo " CRITICAL - Iptables are CRITICAL the table $TABLE has $TOTRULES rules configured"
for i in `w -h | cut -f1 -d" " | sort | uniq`
do
echo "`date '+%d/%m/%Y - %H:%M:%S'` - CRITICAL - $i is logged in and there are only $TOTRULES loaded" >> $LOG
done
# Nagios exit code 2 = status CRITICAL = red
exit 2
fi
Punto primo: la seconda condizione dell'if non ha praticamente senso, in quanto la prima è sempre verificata.
E' bastato invertire le due condizioni e trattarle separatamente:
#
# Parameter Validation
##
if [ "$PARAM1" == "-h" ]; then
echo ""
echo " -h = Display's this Help"
echo " -T = Table to check"
echo " Available Tables:"
echo " nat"
echo " mangle"
echo " filter"
echo " -r = Minimun quantity of rules"
echo ""
# Nagios exit code 3 = status UNKNOWN = orange
exit 3
fi
if [ "$PARAM1" != "-T" -o "$TABLE" == "" -o "$MINRULES" != "-r" -o "$PARAM4" == "" ]; then
echo "Usage: $0 -T <table> -r <min rules>"
echo ""
exit 3
# Nagios exit code 3 = status UNKNOWN = orange
fi
Punto secondo: la variabile CHKIPTBLS utilizza sempre e comunque la tabella filter, dunque il parametro -T non ha senso di esistere. Possiamo però ovviare a tale mancanza, permettendo all'utente di scegliere su quale tabella (tra filter, mangle e nat) effettuare i controlli, modificando la variabile citata in precedenza nel seguente modo:
CHKIPTBLS=`sudo /sbin/iptables -n -t "$TABLE" -L |wc -l`
Punto terzo: la condizione
if [ "$TOTRULES" -gt "$PARAM4" ]; then
controlla che il numero di regole caricate sia strettamente maggiore di quello definito mediante il parametro -r. Questo però cozza con quanto dichiarato dall'autore dello script, ovvero:
OK - The number of Iprules equal o more than the minimun that we setup on the -r variable
Per ovviare a tale errore, occorre sostituire la condizione riportata in precedenza con questa:
if [ "$TOTRULES" -ge "$PARAM4" ]; then
Punto quarto: nagios non ha i permessi per lanciare iptables, ergo dobbiamo effettuare delle modifiche al file /etc/sudoers, inserendo la entry:
nagios ALL = NOPASSWD: /sbin/iptables
alla fine del file.
In definitiva, lo script per controllare lo stato di iptables dovrà essere il seguente:
PARAM1=$1
TABLE=$2
MINRULES=$3
PARAM4=$4
LOG=/var/log/check_iptables.log
CHKIPTBLS=`sudo /sbin/iptables -n -t "$TABLE" -L |wc -l`
#
# Parameter Validation
##
if [ "$PARAM1" == "-h" ]; then
echo ""
echo " -h = Display's this Help"
echo " -T = Table to check"
echo " Available Tables:"
echo " nat"
echo " mangle"
echo " filter"
echo " -r = Minimun quantity of rules"
echo ""
# Nagios exit code 3 = status UNKNOWN = orange
exit 3
fi
if [ "$PARAM1" != "-T" -o "$TABLE" == "" -o "$MINRULES" != "-r" -o "$PARAM4" == "" ]; then
echo "Usage: $0 -T <table> -r <min rules>"
echo ""
exit 3
# Nagios exit code 3 = status UNKNOWN = orange
fi
##
# DO NOT MODIFY ANYTHING BELOW THIS
##
$CHKIPTBLS >/dev/null 2>/dev/null
if [ "$CHKIPTBLS" == 0 ]; then
TOTRULES=$CHKIPTBLS
else
TOTRULES=$[$CHKIPTBLS-8]
fi
if [ "$TOTRULES" -ge "$PARAM4" ]; then
echo "OK - Iptables is OK The Table $TABLE has $TOTRULES rules configured"
# Nagios exit code 0 = status OK = green
exit 0
else
echo " CRITICAL - Iptables is CRITICAL The Table $TABLE has $TOTRULES rules configured"
for i in `w -h | cut -f1 -d" " | sort | uniq`
do
echo "`date '+%d/%m/%Y - %H:%M:%S'` - CRITICAL - $i is logged in and there are only $TOTRULES loaded" >> $LOG
done
# Nagios exit code 2 = status CRITICAL = red
exit 2
fi
Se il file /var/log/check_iptables.log non esiste, dovrete crearlo mediante il comando:
nightfly@nightbox:~$ sudo touch /var/log/check_iptables.log
A questo punto possiamo rinominare lo script:
nightfly@nightbox:~$ mv check_iptables_status.sh check_iptables_status
rendondolo successivamente eseguibile:
nightfly@nightbox:~$ chmod +x check_iptables_status
Spostiamolo nella directory /usr/lib/nagios/plugins:
nightfly@nightbox:~$ sudo mv check_iptables_status /usr/lib/nagios/plugins
Creiamo il file iptables.cfg nella directory /etc/nagios-plugins/config:
nightfly@nightbox:/etc/nagios-plugins/config$ sudo nano iptables.cfg
il cui contenuto dovrà essere il seguente:
# 'check_iptables_status' command definition
define command{
command_name check_iptables_status
command_line /usr/lib/nagios/plugins/check_iptables_status -T '$ARG1$' -r '$ARG2$'
}
infine aggiungiamo la seguente direttiva al file dell'host su cui vogliamo monitorare lo stato di iptables (tale file è presente nella directory /etc/nagios3/conf.d):
define service{
use generic-service ; Name of service template to use
host_name localhost
service_description iptables
check_command check_iptables_status!filter!84
}
Dove 84 è il numero minimo di regole di firewalling attive.
Infine, riavviamo nagios:
nightfly@nightbox:~$ sudo service nagios3 restart
ed abbiamo finito.
Alla prossima.
14:51 Scritto da: nazarenolatella in Networking | Link permanente | Commenti (0) | Segnala | Tag: firewall, iptables, nagios, monitoring, rules, script, bash, log | OKNOtizie |
Facebook
11/08/2011
Tuning di snort 2.9.0.5 (rules)
In questo post ho spiegato come effettuare un tuning minimale dei preprocessori di cui si avvale snort 2.9.0.5. Ora, invece, vedremo come disabilitare tutte quelle regole che potrebbero generare dei falsi positivi.
Per prima cosa posizioniamoci nella directory /etc/snort/rules:
nightfly@nightbox:~$ cd /etc/snort/rules
Lanciamo un ls per visualizzare il contenuto della dir:
nightfly@nightbox:/etc/snort/rules$ ls
il cui outuput sarà simile al seguente:
attack-responses.rules misc.rules snmp.rules
backdoor.rules multimedia.rules specific-threats.rules
bad-traffic.rules mysql.rules spyware-put.rules
blacklist.rules netbios.rules sql.rules
ecc.
Come è facile intuire, esiste un file *.rules per ogni possibile minaccia, dove ciascun file contiene tutta una serie di regole che identificano i tentativi di attacco. Ad esempio, analizzando il file attack-responses.rules, noteremo delle entry del tipo:
alert tcp $HOME_NET any -> $EXTERNAL_NET any (msg:"ATTACK-RESPONSES directory listing"; flow:established; content:"Volume Serial Number"; classtype:bad-unknown; sid:1292; rev:9;)
alert tcp $HTTP_SERVERS $HTTP_PORTS -> $EXTERNAL_NET any (msg:"ATTACK-RESPONSES command completed"; flow:established; content:"Command completed"; nocase; metadata:policy balanced-ips drop, policy security-ips drop, service http; reference:bugtraq,1806; classtype:bad-unknown; sid:494; rev:13;)
alert tcp $HTTP_SERVERS $HTTP_PORTS -> $EXTERNAL_NET any (msg:"ATTACK-RESPONSES command error"; flow:established; content:"Bad command or filename"; nocase; classtype:bad-unknown; sid:495; rev:10;)
E' possibile disabilitare una qualunque entry semplicemente commentandola (ovvero inserendo un # ad inizio riga). Però, per evitare che tale entry ritorni attiva dopo l'aggiornamento delle regole mediante oinkmaster, dobbiamo operare direttamente sul file /etc/oinkmaster.conf:
nightfly@nightbox:/etc/snort/rules$ sudo nano /etc/oinkmaster.conf
aggiungendo la direttiva disablesid seguita dal sid dell'alert che ci interessa (ad esempio 1292 per ATTACK-RESPONSES directory listing):
disablesid 1292
Salviamo il file, riavviamo snort con un sudo service snort restart ed abbiamo finito.
A presto.
11:55 Scritto da: nazarenolatella in Sicurezza | Link permanente | Commenti (0) | Segnala | Tag: snort 2.9.0.5, rules, oinkmaster, tuning, falsi positivi | OKNOtizie |
Facebook
09/08/2011
Aggiornare snort alla versione 2.9.0.5 su *buntu
L'installazione di snort 2.9.0.5 su *buntu non è affatto banale. Infatti, occorre installare delle specifiche librerie e degli specifici strumenti per poter compilare il codice sorgente dell'IDS in questione.
Per prima cosa scarichiamo la tarball mediante CLI usando wget:
nightfly@nightbox:~$ wget -O snort-2.9.0.5.tar.gz http://www.snort.org/downloads/867
Scompattiamola e posizioniamoci nella dir appena creata:
nightfly@nightbox:~$ tar -xzvf snort-2.9.0.5.tar.gz
nightfly@nightbox:~$ cd snort-2.9.0.5/
Stoppiamo la versione obsoleta di snort presente sulla nostra macchina:
nightfly@nightbox:~$ sudo service snort stop
Installiamo adesso alcune librerie necessarie per la compilazione di snort:
nightfly@nightbox:~/snort-2.9.0.5$ sudo apt-get install libpcap0.8-dev
nightfly@nightbox:~/snort-2.9.0.5$ sudo apt-get install libpcre3 libpcre3-dev
nightfly@nightbox:~/snort-2.9.0.5$ sudo apt-get install libdumbnet-dev libdnet libdnet-dev
Creiamo quindi un link simbolico all'header dumbnet.h poichè il file configure di snort va alla ricerca del file dnet.h:
nightfly@nightbox:~/snort-2.9.0.5/$ sudo ln -s /usr/include/dumbnet.h /usr/include/dnet.h
Installiamo l'ultima libreria che ci occorre, ovvero daq-0.5, disponibile direttamente sul sito www.snort.org:
nightfly@nightbox:~/snort-2.9.0.5/$ wget -O daq-0.5.tar.gz http://www.snort.org/downloads/860
nightfly@nightbox:~/snort-2.9.0.5/$ tar -xzvf daq-0.5.tar.gz
nightfly@nightbox:~/snort-2.9.0.5/$ cd daq-0.5/
Per compilare questa libreria è necessario utilizzare l'accoppiata flex/bison. Dunque procediamo con la loro installazione:
nightfly@nightbox:~/snort-2.9.0.5/daq-0.5$ sudo apt-get install flex bison
Possiamo ora compilare la libreria daq-0.5:
nightfly@nightbox:~/snort-2.9.0.5/daq-0.5$ ./configure
nightfly@nightbox:~/snort-2.9.0.5/daq-0.5$ sudo make
nightfly@nightbox:~/snort-2.9.0.5/daq-0.5$ sudo make install
nightfly@nightbox:~/snort-2.9.0.5/daq-0.5$ cd ..
Adesso passiamo alla compilazione di snort e successivamente sostituiamo il file di configurazione delle versioni precedenti con quello della release in questione:
nightfly@nightbox:~/snort-2.9.0.5$ sudo make
nightfly@nightbox:~/snort-2.9.0.5$ sudo make install
nightfly@nightbox:~/snort-2.9.0.5$ cd etc
nightfly@nightbox:~/snort-2.9.0.5/etc$ sudo cp snort.conf /etc/snort
Posizioniamoci nella dir /etc/snort ed apriamo il file snort.conf in scrittura:
nightfly@nightbox:~/snort-2.9.0.5/etc$ cd /etc/snort
nightfly@nightbox:/etc/snort$ sudo nano snort.conf
ed effettuiamo le seguenti sostituzioni:
1) ipvar con var (poichè non abbiamo compilato snort con la flag --enable-ipv6)
2) var RULE_PATH ../rules
var SO_RULE_PATH ../so_rules
var PREPROC_RULE_PATH ../preproc_rules
con
var RULE_PATH /rules
var SO_RULE_PATH /so_rules
var PREPROC_RULE_PATH /preproc_rules
3) Commentiamo le seguenti direttive:
#dynamicdetection directory /usr/local/lib/snort_dynamicrules
#include $RULE_PATH/local.rules
#inspect_gzip
#unlimited_decompress
#preprocessor normalize_ip4
#preprocessor normalize_tcp: ips ecn stream
#preprocessor normalize_icmp4
#preprocessor normalize_ip6
#preprocessor normalize_icmp6
4) Rimuoviamo le direttive:
compress_depth 65535 decompress_depth 65535
Ora occorre eliminare tutte le vecchie rules di snort ed installare quelle nuove. Per fare ciò digitiamo i seguenti comandi:
nightfly@nightbox:/etc/snort$ cd rules
nightfly@nightbox:/etc/snort/rules$ sudo rm *
Successivamente installiamo le nuove regole mediante oinkmaster, configurandolo opportunamente affinchè possa scaricare le rules della versione 2.0.9.5:
nightfly@nightbox:/etc/snort/rules$ sudo nano /etc/oinkmaster.conf
ed inseriamo la stringa:
url = http://www.snort.org/pub-bin/oinkmaster.cgi/<vostro oinkcode>/snortrules-snapshot-2905.tar.gz
Adesso possiamo procedere con l'installazione vera e propria delle regole:
nightfly@nightbox:/etc/snort/rules$ sudo oinkmaster -o /etc/snort/rules
Ad installazione completata, prima di lanciare snort, modifichiamo il file /etc/ld.so.conf aggiungendo la direttiva:
include /usr/local/lib
Infine, rendiamo effettiva tale modifica lanciando il comando:
nightfly@nightbox:/etc/snort/rules$ sudo ldconfig
A questo punto lanciamo uno snort -V il cui output dovrebbe essere:
,,_ -*> Snort! <*-
o" )~ Version 2.9.0.5 (Build 135)
'''' By Martin Roesch & The Snort Team: http://www.snort.org/snort/snort-team
Copyright (C) 1998-2011 Sourcefire, Inc., et al.
Using libpcap version 1.0.0
Using PCRE version: 7.8 2008-09-05
Copiamo l'eseguibile presente in /usr/local/bin/snort all'interno della dir /usr/sbin/snort:
nightfly@nightbox:/etc/snort/rules$ sudo cp /usr/sbin/snort /usr/local/bin/snort
Verifichiamo che la configurazione di snort non contenga errori digitando:
nightfly@nightbox:/etc/snort/rules$ sudo snort -T -c /etc/snort/snort.conf
Se l'output visualizzato è il seguente:
Snort successfully validated the configuration!
allora possiamo lanciare un sudo service snort start ed iniziare ad avvalerci di questo potentissimo IDS.
A presto.
15:54 Scritto da: nazarenolatella in SO: Linux | Link permanente | Commenti (0) | Segnala | Tag: snort 2.0.9.5, snort.conf, oinkmaster, rules, ids | OKNOtizie |
Facebook

















