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
23/11/2011
autovodafone versione 0.2: URL-encoding completo e meccanismi di controllo
Come avevo già preannunciato in questo post, ecco la versione 0.2 dello script bash per l'invio di MMS gratis mediante Vodafone.it:
#!/bin/bash
#File di log
FILELOG=/var/log/autovodafone
ROOT_UID=0
#Controllo che lo script venga eseguito da root
if [ "$UID" -ne "$ROOT_UID" ];then
ERRORE1="Errore 1: Devi essere root per eseguire lo script"
echo $ERRORE1
echo "$(date) $ERRORE1" >> $FILELOG
exit 1
fi
data=$(date)
echo "Inserisci il destinatario:"
read destinatario
echo "Inserisci l'oggetto del messaggio:"
read oggetto
echo "Inserisci il testo del messaggio:"
read testo
echo "$testo" > text
cat text | sed -f urlencoding.sed > encoded
enc=$(cat encoded)
curl -c cookiev.txt -F "username=vostrousername" -F "password=vostrapassword" https://www.vodafone.it/190/trilogy/jsp/login.do 2&>1
curl -b cookiev.txt --data "recipient=$destinatario&subjecttosend=$oggetto&SmilName=&TextName=$enc&ImageName=&AudioName=&nextPage=/web/servletresult.html" http://mmsviaweb.net.vodafoneomnitel.it/WebComposer/web/elaborapop.jsp | grep -o -E '"s*(.*)>(.*)"' > out
sed -n '2p' out > out1
sed -e s/"//g out1 > out2
sed -e "s/ /+/g" out2 > out3
url="http://mmsviaweb.net.vodafoneomnitel.it"
url1=$(cat out3)
url2=$(echo "$url$url1")
curl -b cookiev.txt $url2 > result
if grep -q "SendMessage=1" result;then
echo "$data: messaggio inviato" >> $FILELOG
else
echo "$data: il messaggio non e' stato inviato" >> $FILELOG
fi
rm out
rm cookiev.txt
rm text
rm encoded
rm result
exit 0
Nella fattispecie, ho creato il file urlencoding.sed per la codifica del testo relativo all'MMS, il cui contenuto è il seguente:
s/%/%25/g
s/ /%20/g
s/ /%09/g
s/!/%21/g
s/"/%22/g
s/#/%23/g
s/$/%24/g
s/&/%26/g
s/'''/%27/g
s/(/%28/g
s/)/%29/g
s/*/%2a/g
s/+/%2b/g
s/,/%2c/g
s/-/%2d/g
s/./%2e/g
s///%2f/g
s/:/%3a/g
s/;/%3b/g
s//%3e/g
s/?/%3f/g
s/@/%40/g
s/[/%5b/g
s//%5c/g
s/]/%5d/g
s/^/%5e/g
s/_/%5f/g
s/`/%60/g
s/{/%7b/g
s/|/%7c/g
s/}/%7d/g
s/~/%7e/g
s/ /%09/g
Ho voluto avvalermi di sed per omogeneità, ciò non significa che tale operazione non sia fattibile attraverso linguaggi di scripting esterni (ad esempio perl).
Inoltre, mediante le seguenti righe di codice:
if grep -q "SendMessage=1" result;then
echo "$data: messaggio inviato" >> $FILELOG
else
echo "$data: il messaggio non e' stato inviato" >> $FILELOG
fi
ho previsto dei controlli (molto basilari) relativi all'esito dell'operazione di inoltro degli MMS, il cui risultato verrà salvato sul file di log (con data e ora).
Qualunque suggerimento per estendere e/o migliorare lo script rimane comunque il benvenuto.
A presto.
09:00 Scritto da: nazarenolatella in SO: Linux | Link permanente | Commenti (0) | Segnala | Tag: mms gratis, bash, script, scripting, vodafone, url-encoding, sed | OKNOtizie |
Facebook
09/11/2011
Script per il forward automatico della porta SSH sul router Cisco 837
La IOS C837-K9O3Y6-M sviluppata per il router Cisco 837 ha un bug, ovvero è possibile che dopo qualche reload si "dimentichi" di una o più PAT translations che riguardano porte più alte delle well-known (per intenderci, superiori alla 1023).
Nel mio caso, il problema ha iniziato a verificarsi da quando ho deciso di mettere in ascolto SSH su una porta non standard, in modo da risparmiarmi i tentativi di attacco lanciati dagli script kiddie di turno.
Inoltre, per motivi di sicurezza, ho consentito l'accesso via SSH al router solo dagli host della LAN, quindi, nel caso in cui dovessi accedere alla sua configurazione, atterro sul server e da lì mi collego al router.
Ovviamente, se la porta SSH non è forwardata non posso atterrare sul server, dunque l'unica soluzione praticabile consiste nell'andare fisicamente dal cliente e ricreare la regola per il PAT.
E qui viene il bello: poichè mi sono stancato di dover perdere almeno un'ora per andare dal cliente, riconfigurare il tutto e tornarmene a casa, ho deciso di creare il seguente script, il quale si collega al router tre volte al giorno e ricrea la regola per l'SSH.
Ecco lo script:
#!/usr/bin/expect
set password1 "<password1>"
set password2 "<password2>"
spawn ssh -l <username> <IP del router>
expect "*?assword:*"
send "$password1r"
expect ">"
send "enar"
expect "Password:"
send "$password2r"
expect "#"
send "conf tr"
expect "(config)#"
send "no ip nat inside source static tcp <ip> <porta> interface Dialer0 <porta>r"
expect "(config)#"
send "ip nat inside source static tcp <ip> <porta> interface Dialer0 <porta>r"
expect "(config)#"
send "exitr"
expect "#"
send "copy run startr"
expect "?"
send "r"
expect "#"
send "exitr"
expect eof
Come al solito, mancano i backslash prima della r perchè myblog li filtra.
Una volta che avete creato lo script, convertitelo in eseguibile lanciando il comando:
nightfly@nightbox:~$ sudo chmod +x ssh_autoforward
e salvatelo nella directory /usr/bin:
nightfly@nightbox:~$ sudo mv ssh_autoforward /usr/bin
A questo punto potete creare la regola per cron, in modo da schedulare l'esecuzione dello script alle 6, alle 12 ed alle 18:
nightfly@nightbox:~$ sudo nano /etc/crontab
00 06,12,18 * * * root ssh_autoforward
Riavviamo cron:
nightfly@nightbox:~$ sudo service cron restart
ed abbiamo finito.
A presto.
PS: non preoccupatevi se lo script entra in esecuzione mentre siete loggati sul server: la regola per il forward dell'SSH non verrà rimossa poichè la state già utilizzando, quindi niente perdita di connessione.
10:00 Scritto da: nazarenolatella in Networking | Link permanente | Commenti (0) | Segnala | Tag: bug, ios, cisco 837, cron, script, expect, c837-k9o3y6-m | OKNOtizie |
Facebook

















