Le Forum Non Officiel de la DEDIBOX
Vous n'êtes pas identifié.
Salut à tous,
voici un petit script qui nous aide bien pour contrer les attaques que subissent la dédibox. Ce script permet de mettre a jour en temps reel (ou presque) l'iptable pour banir toutes les ip qui font des tentatives de connexion avec un mauvais mot de passe ou un mauvais user...
Il n'est pas parfait, loin de là. Ce script doit tourner en permanence sur le serveur puisque qu'il se fie au fichier auth.log
Le mieux et de le faire lancer avec le boot de la machine.
#!/bin/ksh
##########################################################################################
#
# Script qui permet de limiter les scan ssh
#
#########################################################################################
date=`date`
while true
do
################################################################################
#Partie qui gere les mauvais users
################################################################################
i=1
cat /var/log/auth.log | grep invalid | tail -$4 | awk '{ print $13 }' > /tmp/invalid_user.trc
while read log
do
logn=$log
case $i in
1) log1=$logn;;
2) log2=$logn;;
3) log3=$logn;;
4) log4=$logn;;
esac
i=`expr $i + 1`
done</tmp/invalid_user.trc
if [[ "$log1" = "$log2" && "$log2" = "$log3" && "$log3" = "$log4" ]]
then
ip_ban=$log1
exist=`iptables -L | grep $ip_ban | wc -l`
if [[ "$exist" = "0" ]]
then
iptables -A INPUT -s $ip_ban -j DROP
echo "L'IP $ip_ban a ete bannie le $date" >> /var/log/secure.log
fi
fi
##################################################################################
#Partie qui gere les mauvais mot de passe
##################################################################################
i=1
cat /var/log/auth.log | grep Faild | tail -$4 | awk '{ print $11 }' > /tmp/invalid_pswd.trc
while read log
do
logn=$log
case $i in
1) log1=$logn;;
2) log2=$logn;;
3) log3=$logn;;
4) log4=$logn;;
esac
i=`expr $i + 1`
done</tmp/invalid_pswd.trc
if [[ "$log1" = "$log2" && "$log2" = "$log3" && "$log3" = "$log4" ]]
then
ip_ban=$log1
exist=`iptables -L | grep $ip_ban | wc -l`
if [[ "$exist" = "0" ]]
then
iptables -A INPUT -s $ip_ban -j DROP
echo "L'IP $ip_ban a ete bannie le $date" >> /var/log/secure.log
fi
fi
sleep 180
donevoila, profitez ![]()
Hors ligne
ouep pareil j'allais le dire fail2ban ? c'est bien se truc aussi ... ![]()
Mais en tous cas bravo pour ton script ![]()
amicalement iva
Hors ligne
Merci pour le script, moi perso je colle fail2ban sur chacun de mes serveurs et je change le port ssh ![]()
Hors ligne
je ne connaissais pas la fonction (ou le prg) fail2ban... Je vais voir à quoi cela ressemble ![]()
En tout cas j'ai vu que je peux encore faire du tri dans les log car y'a pas mal d'attaques sur mon serveur.... donc voyons ca de plus près ^^
Mais bon j'aime bien réinventer la roue.... c'est interressant ^^ et puis on apprend des choses ![]()
Hors ligne
effectivement je viens de voir ce fail2ban et il fait en mieux ce que je faisait ![]()
du coup hop il remplace mon script (pour info, je le lancais toutes les minutes depuis la crontab... et la IPTABLE commencait déjà a bien grossir.....
en tout cas merci pour l'info sur ce magnifique petit package ![]()
Hors ligne
Pour le plaisir, voici une petite évolution du script qui fonctionne mieux (oublie moins de chose) et ne prends casiment rien en ressource. Le seul hic c'est qu'il créé des doublons dans l'iptables.... Si quelqu'un voit comment éviter les doublons je suis preneur ![]()
Voici le code.... seule la 1ere exécution est longue, les suivante sont très rapides (si la crontab exécute le script toute les minutes).
#!/bin/ksh
##########################################################################################
set +x
#
# Script qui permet de limiter les scan ssh
#
#########################################################################################
# Definition des variables
#########################################################################################
repertoire=/var/log
fic_tmp=/tmp/secure.lst
fic_ip=/tmp/ip_ban.lst
fic_ip1=/tmp/ip_ban1.lst
list2ban=/tmp/list2ban.lst
liste_ban=/tmp/listebanie.list
max_atpt=4
mon_ip=.116
touch $fic_ip1
touch $liste_ban
#########################################################################################
# Creation du fichier temporaire de log
#########################################################################################
cat $repertoire/auth.log > $fic_tmp
cat $repertoire/mail*>> $fic_tmp
cat $repertoire/apache2/* >> $fic_tmp
#########################################################################################
# Recuperation des ip frauduleuses
#########################################################################################
cat $fic_tmp | grep "without hostname" | cut -d[ -f4|cut -d] -f1 | cut -d' ' -f2 > $fic_ip
cat $fic_tmp | grep "File does not exist" | cut -d[ -f4|cut -d] -f1 | cut -d' ' -f2 | grep -v "66.249.66.50" >> $fic_ip
cat $fic_tmp | grep "/main.php" | cut -d' ' -f1 | grep -v "66.249.66.50" | >> $fic_ip
cat $fic_tmp | grep "Failed password" | grep -v "invalid" | awk '{ print $11}' >> $fic_ip
cat $fic_tmp | grep "invalid user" | awk '{ print $13 }' >> $fic_ip
sort $fic_ip > ${fic_ip}.tmp
cat ${fic_ip}.tmp | grep -v $mon_ip > $fic_ip
rm ${fic_ip}.tmp
diff $fic_ip1 $fic_ip | cut -d">" -f 2 > $list2ban
#########################################################################################
# Debut du traitement pour les bans
#########################################################################################
ip1=0
while read ligne
do
ip_scan=$ligne
if [[ "$ip1" = "$ip_scan" ]]
then
i=`expr $i + 1`
if [[ "$i" > "$max_atpt" ]]
then
exist=`cat $liste_ban | grep $ip_scan | wc -l`
if [[ "$exist" = "0" ]]
then
echo $ip_scan banie >> $liste_ban
iptables -A INPUT -s $ip_scan -j DROP
fi
fi
else
i=0
fi
ip1=$ip_scan
done<$list2ban
cat $fic_ip>$fic_ip1Enjoy ![]()
Et si c'est améliorables faites moi signe... En tout cas je me suis éclaté pour faire ce script ![]()
Dernière modification par cyrilpop (2008-06-27 20:31:33)
Hors ligne