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

Invia nuovo commento

Il contenuto di questo campo è privato e non verrà mostrato pubblicamente.
  • Indirizzi web o e-mail vengono trasformati in link automaticamente
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Linee e paragrafi vanno a capo automaticamente.

Maggiori informazioni sulle opzioni di formattazione.

CAPTCHA
Questa domanda serve per verificare che tu sia un visitatore umano (non un computer) e per prevenire lo spam
1 + 0 =
Solve this simple math problem and enter the result. E.g. for 1+3, enter 4.