Uno script per controllare gli accessi alla porta 22

Un semplice e spartano script trovato in rete e rimaneggiato per controllare i tentavi di accesso sulla porta 22 di server linux (in particolare ubuntu / debian) esposti verso internet.
Lo script puo essere lanciato regolarmente da cron con la cadenza preferita (ogni 10 minuti ad es.)e va a controllare quanti sono i tentativi d'accesso falliti compiuti da ciascun ip che ha tentato di connettersi alla porta 22. Se il numero di tentativi falliti supera il valore impostato nel parametro BADCOUNT l'ip del richiedente viene aggiunto nel file hosts.deny e gli viene preclusa ogni possibilità di accesso. Le attività svolte dallo script vengono scritte in /var/log/auth.log.
Nota: questo script va preso come esempio o come applicazione ad uso didattico. Non lo consiglio in ambiti produttivi perchè può dare più noie. Esistono metodi certamente migliori per garantire la sicurezza della porta 22 e vanno comunque analizzati attentamente prima di essere adottati.
#!/bin/bash
# se ci sono almeno $BADCOUNT tentati accessi di utenti non validi oppure almeno $BADCOUNT errate password per uno stesso ip. l'ip viene bannato e viene inviata una email di notifica
LOGFILE="/var/log/auth.log"
HOSTSDENY="/etc/hosts.deny"
BADCOUNT="5"
WARNINGCOUNT="3"
TEMPFILE=/tmp/.blockssh.txt
ONEDONE=N
rm -f $TEMPFILE &> /dev/null
touch $TEMPFILE
#counto le password errate
grep "sshd" $LOGFILE | grep -v "invalid" | grep "Failed password" | cut -d':' -f 4 | cut -d' ' -f 7 | sort | uniq -c >> $TEMPFILE
#conto gli invalid user con password errata
grep "sshd" $LOGFILE | grep "invalid user" |cut -d':' -f4|cut -d' ' -f9 | sort | uniq -c >> $TEMPFILE
cat $TEMPFILE | while read i
do
count=`echo $i | cut -d" " -f1`
ip=`echo $i | cut -d" " -f2`
if [ $ip != $count ]
then
#echo "count="$count
#echo "ip="$ip
already=`grep $ip $HOSTSDENY | grep sshd`
if [ -z "$already" ]
then
if [ "$count" -ge "$WARNINGCOUNT" -a "$count" -le "$BADCOUNT" ]
then
#echo -e "WARNING: ${WARNINGCOLOR}$ip${NORMALCOLOR} has tryed to log in $count times !"
WARN="WARNING: $ip has tryed to log in $count times !"
echo $WARN | wall
echo $WARN | mail -s "$HOSTNAME : ssh warning" root
ONEDONE=Y
fi
if [ "$count" -ge "$BADCOUNT" ]
then
#echo -e "ERROR: ${BANCOLOR}$ip${NORMALCOLOR} has been banned because it tried for $count times !"
ERROR="ERROR: $ip has been banned cause it tried for $count times !"
echo $ERROR | wall
echo $ERROR | mail -s "$HOSTNAME : banned ip" root
echo "sshd: "$ip >> $HOSTSDENY
#modifico le righe dal file di log
#in questo modo se "de-banno" qualche entry in hosts.deny non me le ritrovo di nuovo bannate al parsing successivo
#cerco le righe che contengono l'ip bannato e genero un file privo di quelle righe
for line in `grep -n $ip $LOGFILE |cut -d: -f1`
do
string=$string$line"d;"
done
sed "$string" $LOGFILE > /tmp/authlog && mv /tmp/authlog $LOGFILE
/etc/init.d/sysklogd reload
ONEDONE=Y
fi
fi
fi
done
if [ ONDONE = "Y" ]
then
echo -e $NORMALCOLOR
fi - blog di dam
- 5515 letture

Invia nuovo commento