Magazine Informatica

Controllare lo stato di iptables mediante Nagios

Creato il 06 gennaio 2012 da Nightfly

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.

iptables.jpg

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.


Potrebbero interessarti anche :

Ritornare alla prima pagina di Logo Paperblog

Possono interessarti anche questi articoli :