Script de surveillance de connections pour proftpd

Salut à tous

C’est mon premier post dans “programmation”… Je suis ému. Il sera assez long, j’éspère que certains auront le courage d’aller jusqu’au bout.

Voila, étant l’heureux possesseur d’un serveur FTP (proftpd) uniquement accessible aux personnes disposant du login et du mot de passe, j’ai remarqué que certaines IP essayaient des logins pour se connecter sur mon serveur (en moyenne une "attaque ttes les 24 heures). Bon, ils ne trouvent jamais ni le login ni le mot de passe, mais j’ai voulu bannir ces IP ( par pur geekisme ).

J’ai donc créé un script “veilleur” ( qui marche sans pb, mais sans doute mal écrit, d’où mon post) qui est lancé ttes les 10 mn grâce à cron, et qui effectue les tâches suivantes:
:arrow_right: isole dans /var/log/proftpd.log les IP qui correspondent au critère suivant:
se sont loguées avec un mauvais “user”, mais pas “anonymous” ( je suis forcé d’accepté les anonymous, même si elles sont déjà bannies dans /etc/ftpusers, car même qqu’un qui a le bon user et le bon mot de passe apparaît d’abord en anonymous dans le fichier /var/log/proftpd.log )
:arrow_right: si une de ces IP a tenté plus de 50 fois de se connecter, elle est bannie ( iptables -A INPUT -s IP_bannie -j DROP)

voilà mon script:

[quote=“veilleur”]#! /bin/sh

## dossier où sont mis les logs de veilleur
veilleur_log="/home/yann/scripts"

## création de cible_tmp.txt: fichier texte contenant les IP de proftpd.log dont le user est inconnu et différent de anonymous
# 1) extraction des lignes contenant “no such user '” du log de proftpd et création de log_foireux.txt
cat /var/log/proftpd.log |grep no\ such\ user\ “’” > $veilleur_log/log_foireux.txt
# 2) extraction des lignes contenant “no such user ‘anonymous’” du log de proftpd et création de log_anonymous.txt
cat /var/log/proftpd.log |grep no\ such\ user\ “’” |grep anonymous > $veilleur_log/log_anonymous.txt
# 3) on ne garde que les “no such user” excepté les anonymous, et tt ça dans veilleFTP_tmp.txt
diff $veilleur_log/log_foireux.txt $veilleur_log/log_anonymous.txt > $veilleur_log/veilleFTP_tmp.txt
# suppression de log_foireux.txt et log_anonymous.txt
rm $veilleur_log/log_foireux.txt
rm $veilleur_log/log_anonymous.txt
# réorganisation de veilleFTP_tmp.txt: seules les IP sont conservées et mises dans veilleFTP.txt
cat $veilleur_log/veilleFTP_tmp.txt | cut -d[ -f3 | cut -d] -f1 | cut -d: -f4 | grep “.” > $veilleur_log/veilleFTP.txt
rm $veilleur_log/veilleFTP_tmp.txt
# réorganistaion de veilleFTP.txt : suppression des répétitions d’IP et création de cible_tmp.txt
B="“
for i in cat $veilleur_log/veilleFTP.txt ; do
if [ “$i” != “$B” ] ; then
B=”$i"
echo $i >> $veilleur_log/cible_tmp.txt
fi
done

[color=red]## vérification du nb de tentatives de connexions des IP de cible_tmp.txt : si tentatives de connections > 50 l’IP est rajoutée

à banni_tmp.txt[/color]

for i in cat $veilleur_log/cible_tmp.txt ; do
if [ grep -c $i $veilleur_log/veilleFTP.txt -ge 50 ] ; then
echo $i >> $veilleur_log/banni_tmp.txt
fi
done
## si le fichier banni.txt (contenant ttes les IP précédemments bannies dans la journée) n’existe pas , on le créé
if [ ! -e $veilleur_log/banni.txt ] ; then
touch $veilleur_log/banni.txt
fi

## réactu de iptables
# iptables_début et iptables_fin sont les règles “immuables” de mon parefeu
# on créé iptables_updated en y mettant le contenu de iptables_début
cat $veilleur_log/iptables_début > $veilleur_log/iptables_updated
# on rajoute les anciennes IP déjà bannies
for i in cat $veilleur_log/banni.txt ; do
echo “iptables -A INPUT -s $i -j DROP” >> $veilleur_log/iptables_updated
done
# si de nvlles IP sont apparues dans banni_tmp.txt par rapport à banni.txt, on les rajoute
compte="0"
for i in cat $veilleur_log/banni_tmp.txt ; do
if [ grep -c $i $veilleur_log/banni.txt = 0 ] ; then
echo “$i” >> $veilleur_log/banni.txt
echo “iptables -A INPUT -s $i -j DROP” >> $veilleur_log/iptables_updated
compte="1"
fi
done
# on rajoute la fin des règles perso
cat $veilleur_log/iptables_fin >> $veilleur_log/iptables_updated
# s’il y eu de nvlles IP de rajoutées, on met à jour iptables
if [ “$compte” = “1” ] ; then
echo "réactu netfilter"
cp $veilleur_log/iptables_updated /etc/network/if-pre-up.d/iptables-start
/etc/network/if-pre-up.d/iptables-start
echo "### banni.txt ###"
cat $veilleur_log/banni.txt
fi

rm $veilleur_log/banni_tmp.txt
rm $veilleur_log/cible_tmp.txt[/quote]

Voilà, voilà…
Que pensez-vous de tout ça ? Etait-ce utile de faire ça ? Vaut-il mieux que j’arrête de jouer à faire des scripts, et que je retourne jouer dans mon bac à sable ??

hello,

Je le trouve nickel ton script, ceci dit inclus un temps pendant lequel les ip sont bannis, ensuite tu les ‘dé’-bannis, je vais te dire, dans ma boite, on nous communique d’abord les ip distantes et ensuite on les autorises a ce connecter, ça évite d’être attaquer par n’importe qui, tu me diras un coup de spoofing et hop…

Merci pour ces encouragements :slightly_smiling: . Effectivement, je me posais la question de savoir s’il fallait bannir définitivement les IP ou pas. Je vais plutôt suivre ton conseil, et les dé-bannir au bout d’un certain temps.
Mais ce sera pas pour tout de suite la modif …

Connais pas ça: “spoofing”. J’vais faire un tour sur wikipedia :wink:
…Ah ouais, effectivement, un coup de spoofing, et hop, mon veilleur n’y voit que du feu …