OVH Community, votre nouvel espace communautaire.

[How-To] Fail2ban4ever


fugitif
17/04/2011, 12h37
Suggestion de petite correction ligne 91

Remplacer ligne 91:
Code:
for NBBAD_IP in `grep -c $BAD_IP $FAIL2BANLOG`
Par :
Code:
for NBBAD_IP in `grep -c "] Ban $BAD_IP" $FAIL2BANLOG`
Sinon fail2ban4ever comptera les IP qui sont Unban aussi comme une tentative. Hors c'est un Unban qui est effectuer.

Extrait d'un Ban / Unban du log
2011-04-13 18:12:45,215 fail2ban.actions: WARNING [modsecurity] Ban 208.80.194.37 US, United States
2011-04-16 14:28:04,604 fail2ban.actions: WARNING [modsecurity] Unban 208.80.194.37

Remplacer aussi ligne 125:

Code:
for NBBAD_IP in `grep -c $BAD_IP $FAIL2BANLOG`
Par :
Code:
for NBBAD_IP in `grep -c "] Ban $BAD_IP" $FAIL2BANLOG`

fugitif
16/04/2011, 07h18
Ta version modifier match bien les IP déjà banni car tu là modifier.
Un petit diff entre ta version et l'original.
Code:
93c93
<             if [ "`echo $BAD_IP`" = "`iptables-save | grep -e "ever -s $BAD_IP" | cut -d " " -f4 | cut -d "/" -f1`" ]
---
>             if [ "`echo $BAD_IP`" = "`iptables-save | grep -e "$BAD_IP" | cut -d " " -f4`" ]
119c119
<     # On scanne le fichier log de fail to ban pour lister les IP déjà bannie temporairement
---
>     # On scanne le fichier log de fail to ban pour lister les IP déjà  bannie temporairement
126c126
<              if [ "`echo $BAD_IP`" = "`iptables-save | grep -e "ever -s $BAD_IP" | cut -d " " -f4 | cut -d "/" -f1`" ]
---
>              if [ "`echo $BAD_IP`" = "`iptables-save | grep -e "$BAD_IP" | cut -d " " -f4`" ]
192a193,194
> 
>
Je vais donc plutôt utiliser ta version merci

DaRk56
11/01/2011, 17h32
Pour la tache Cron pour passez l'étape ou il faut écrire oui vous faite comment ? ( a par en modifiant le script)

DaRk56
11/01/2011, 17h06
Merci tu gère super script

Googley
11/01/2011, 16h27
Pas mal, j'avais fait un petit script pour bannir moi même facilement mais j'trouvais pas comment faire via fail2ban.
Un p'tit cron pour lancer ça et hop.

Merci.

Nowwhat
21/12/2010, 22h00
Vous avez fail2ban ?
Alors, ajoute '4ever'.

Ce script, que j'ai trouvé ici http://www.crashdump.fr/codes-sources/ utilise le log de fail2ban, et vous propose de inclure définitivement les IP's que vous souhaitez bloquer 'pour de bon' dans iptables.
Après un restart de fail2ban son travail ne sera plus perdu.

Vous pouvez "afficher|bannir|purger".

Exemple:
papy-team:~# ./fail2ban4ever.sh afficher
+-----------------------------------------------------------------------+
| Fail2Ban4Ever v0.0.6 |
| |
+-----------------------------------------------------------------------+
+-IP: 173.201.254.93(ip-173-201-254-93.ip.secureserver.net.): 2 -> DEJA BANNIE
+-IP: 174.120.141.49(31.8d.78ae.static.theplanet.com.): 3 -> DEJA BANNIE
+-IP: 186.22.52.234(cpe-186-22-52-234.telecentro-reversos.com.ar.): 2 -> DEJA BANNIE
+-IP: 222.235.203.158(): 2 -> DEJA BANNIE
+-IP: 89.212.41.182(broj1.studiokham.com.): 2 -> DEJA BANNIE
+-IP: 91.121.11.59(ns38129.ovh.net.): 2 -> DEJA BANNIE
+-IP: 94.23.197.155(rps8795.ovh.net.): 4 -> DEJA BANNIE
+-IP: 96.9.170.30(mail3.premierbrandsweeps.com.): 10 -> DEJA BANNIE
papy-team:~#
Pour moi (bash+Debain), le script de base me semble "quasi parfait" mais j'ai trouvé quelques bugs.
Après une formation ultra rapide coté 'scripting' avec bash j'ai pu ajouter quelques corrections.

Me voilà la version qui marche bien (pour moi):
Code:
#!/bin/sh

#
# Nom         : fail2ban4ever.sh
# Description : Extrait des logs de fail2ban les IP les plus bannies
#               pour ensuite les ajouter définitivement a iptables.
# OS          : Debian
# Requires    : iptables, fail2ban
# Licence     : GPL
# Version     : 0.0.6
# Author      : Adrien Pujol 
# Web site    : http://www.crashdump.fr/
#

#-----> VARIABLES A CONFIGURER <----------------------------------------#

# Chemin vers iptables
IPT=/sbin/iptables

# Chemin vers le log de fail2ban
FAIL2BANLOG=/var/log/fail2ban.log

# Fonction date du système
DATE=`date -R`;

# Nombre de fois avant le ban définitif
NB_BEFOREBAN=2

#----- RIEN A TOUCHER APRES --------------------------------------------#

# Un peu de couleur
# 31=rouge, 32=vert, 33=jaune,34=bleu, 35=rose, 36=cyan, 37= blanc
color()
{
  #echo [$1`shift`m$*[m
  printf '\033[%sm%s\033[m\n' "$@"
}

# Helper function to get hostname(s) from variable
get_shost()
{
  # Get variable from stdin
  read hosts_ports

  CHK_HOST="$(echo "$hosts_ports" |awk -F: '{ print $1 }')"
  # IP or hostname?
  if [ -n "$(echo "$CHK_HOST" |grep -i -e '\.' -e '[a-z]')" ]; then
    echo "$CHK_HOST"
    return 0
  else
    echo "0/0"
    return 1
  fi
}

# Helper function to resolve an IP to a DNS name
# $1 = IP. stdout = DNS name
get_hostname()
{
  if [ -n "$(echo "$1" |grep '/')" ]; then
    return 1
  else
    printf "$(dig +short +tries=1 +time=1 -x "$1" 2>/dev/null |grep -v "^;;" |head -n1)"
  fi

  return 0
}

echo "+-----------------------------------------------------------------------+"
echo "|   Fail2Ban4Ever v0.0.6                                                |"
echo "|                                                   |"
echo "+-----------------------------------------------------------------------+"

# seul root peux executer ce script
if test `id -u` != "0"; then
    echo -n "`color 31 "[Erreur]"` Vous n'etes pas root, desole..."
    exit
fi

if [ ! -f "$FAIL2BANLOG" ]; then
    echo "`color 31 "[Erreur]"` Fichier $FAIL2BANLOG Introuvable"
    exit
fi

case $1 in

afficher)
    for BAD_IP in `grep "] Ban" $FAIL2BANLOG | cut -d " " -f7 | sort -u`
    do
        for NBBAD_IP in `grep -c $BAD_IP $FAIL2BANLOG`
        do
            # On vérifie quelle nest pas deja presente dans iptables
            if [ "`echo $BAD_IP`" = "`iptables-save | grep -e "ever -s $BAD_IP" | cut -d " " -f4 | cut -d "/" -f1`" ]
            then
                 echo "+-IP: `color 32 "$BAD_IP"`(`get_hostname "$BAD_IP"`): `color 32 "$NBBAD_IP -> DEJA BANNIE"`"
            # Sinon on affiche
            elif [ `echo $NBBAD_IP` -ge `echo $NB_BEFOREBAN` ]
            then
                echo "+-IP: `color 31 "$BAD_IP"`(`get_hostname "$BAD_IP"`): `color 31 "$NBBAD_IP <- TO BAN"`"
            else
                echo "| IP: `color 33 "$BAD_IP"`(`get_hostname "$BAD_IP"`): `color 33 "$NBBAD_IP"`"
            fi
        done
    done
;;

bannir)
    # Verification de la presence de la Chain dans iptables.. sinon on cree
    echo "Verification de la presence de la chaine dans iptables:"
    if [ "`iptables -L -nv --line-numbers | grep -e "Chain fail2ban4ever" | cut -d\  -f 2`" = "fail2ban4ever" ]
    then
        echo "Chaine "fail2ban4ever" trouvée dans iptables... [ `color 32 "Ok"` ]"
    else
        echo "Chaine "fail2ban4ever" non-trouvée dans iptables... [ `color 32 "Création"` ]"
        iptables -N fail2ban4ever
        iptables -I INPUT -j fail2ban4ever
    fi

    # On scanne le fichier log de fail to ban pour lister les IP déjà* bannie temporairement
    for BAD_IP in `grep "] Ban" $FAIL2BANLOG | cut -d " " -f7 | sort -u`
    do
         # On compte le nombre de fois qu elle apparait !
         for NBBAD_IP in `grep -c $BAD_IP $FAIL2BANLOG`
         do
             # On vérifie quelle nest pas deja presente dans iptables
             if [ "`echo $BAD_IP`" = "`iptables-save | grep -e "ever -s $BAD_IP" | cut -d " " -f4 | cut -d "/" -f1`" ]
             then
                 echo "+-IP: `color 32 "$BAD_IP"`(`get_hostname "$BAD_IP"`): `color 32 "$NBBAD_IP -> DEJA BANNIE"`";
             # Si c est supérieur au nombre choisi et non presente dans iptables, on peut lancer le choix
             elif [ `echo $NBBAD_IP` -ge `echo $NB_BEFOREBAN` ]
             then    
                
                 echo "+-IP: `color 31 "$BAD_IP"`(`get_hostname "$BAD_IP"`): `color 31 "$NBBAD_IP -> A BANNIR"`";
                 printf "+-----> Bannir définitivement IP (OUI/non):"
                 read CHOIX
                 case $CHOIX in
                 oui)
                     echo "+-----> `color 32 "Ajoutée au /var/log/message:"` [$0] $DATE - Drop de IP : $BAD_IP(`get_hostname "$BAD_IP"`)"
                     echo "[$0] $DATE - Drop de IP : $BAD_IP(`get_hostname "$BAD_IP"`)" >> /var/log/messages;
                     echo "+-----> `color 32 "Ajoutée au regles iptables:"` iptables -I fail2ban4ever -p ALL -s $BAD_IP -j DROP"
                     iptables -I fail2ban4ever -p ALL -s $BAD_IP -j DROP -m comment --comment "generated by fail2ban4ever.sh after $NBBAD_IP attacks"
                 ;;
                 non)
                     echo "+-----> `color 31 "NON BANNIE /!\"`"
                 ;;
                 *)
                     echo "+-----> `color 32 "Ajoutée au /var/log/message:"` [$0] $DATE - Drop de IP : $BAD_IP(`get_hostname "$BAD_IP"`)"
                     echo "[$0] $DATE - Drop de IP : $BAD_IP(`get_hostname "$BAD_IP"`)" >> /var/log/messages;
                     echo "+-----> `color 32 "Ajoutée au regles iptables: "` iptables -I fail2ban4ever -p ALL -s $BAD_IP -j DROP"
                     iptables -I fail2ban4ever -p ALL -s $BAD_IP -j DROP -m comment --comment "generated by fail2ban4ever.sh after $NBBAD_IP attacks"
                 ;;
                 esac
             # Sinon on affiche le nombre de fois quelle apparais
             else
                 echo "| IP: `color 33 "$BAD_IP"`(`get_hostname "$BAD_IP"`): `color 33 "$NBBAD_IP"`";
             fi        
         done
    done 
exit
;;

purger)
    if [ "`iptables -L -nv --line-numbers | grep -e "Chain fail2ban4ever" | cut -d\  -f 2`" = "fail2ban4ever" ]
    then
        echo "Chaine "fail2ban4ever" trouvée dans iptables... [ `color 32 "Suppression"` ]"

        if [ "`iptables -L INPUT -nv --line-numbers | grep -e "fail2ban4ever" | cut -b1`" != "" ]
        then
            for FBRNB in `iptables -L fail2ban4ever -nv --line-numbers | grep -e " --" | cut -b1`
            do
                iptables -D fail2ban4ever 1
            done
            iptables -D INPUT `iptables -L INPUT -nv --line-numbers | grep -e "fail2ban4ever" | cut -b1`
            iptables -X fail2ban4ever
        else
            for FBRNB in `iptables -L fail2ban4ever -nv --line-numbers | grep -e " --" | cut -b1`
            do
                iptables -D fail2ban4ever 1
            done
            iptables -X fail2ban4ever
        fi
    else
        echo "Chaine "fail2ban4ever" non-trouvée dans iptables... [ `color 32 "Ok"` ]"
    fi
;;

*)
    echo ""
    echo "Syntaxe : $0 afficher|bannir|purger"
    exit
;;
esac