Le mardi 9 octobre 2007, Miklos Aubert a écrit :
> Encore une autre solution, le daemon Fail2ban, qui surveille en permanence
> auth.log pour détecter ce genre d'attaques et paramétrer automatiquement
> iptables pour bloquer les adresses ip d'où elles proviennent.
[...]

J'ai cette maladie aussi ;-). Une autre maladie (refaire à la main ce qui 
existe déjà) m'a d'ailleurs conduit à commettre ce petit script il y a un 
moment. Mon objectif était de limiter la pollution des logs par des 
tentatives bêtes et répétées de login. Ça marche plutôt bien. 
Seul regret, je n'ai pas réussi à le faire correctement avec un pipe syslog, 
cela faisant planter ce dernier (coredump). Je suis donc passé par tail. Ce 
qui m'a d'ailleurs permit de découvrir une option que je ne connaissais pas 
(follow) et qui est intéressante pour survivre à la rotation des logs qu'on 
surveille.

Si ça peut servir ou amuser, le voici : 

-----------------------------8<---------------------------------------------
#!/bin/sh
# october 2005
# S. Renard
# This script is released under the GPL (http://www.gnu.org)
#
# Read daemon log from a fifo to adapt iptables rules
# Supported daemon : sshd
#

# named pipe to read syslogd logs
#FIFO=/var/log/sshpipe

# Named pipe breaks syslog...
# Using tail --follow=name /var/log/messages is better...

# path to iptables
IPTABLES=/usr/sbin/iptables

# Debug ? (1=yes)
DEBUG=0

# Daemon list (for early grep'ing)
DAEMON="sshd"

# Debug function
debug()
{
        if [ $DEBUG -eq 1 ]; then
                echo $*
        fi
}

# Create logreact iptables rules if needed
create_rule()
{
        $IPTABLES -L logreact >/dev/null 2>&1
        if [ $? != 0 ]; then
                $IPTABLES --new-chain logreact
        fi
        $IPTABLES -I INPUT -j logreact
}

# Read log and dispatch actions
read_log()
{
while read LOG
do
        debug "DEBUG: $LOG"
        case $(echo $LOG | awk ' { print $5 }' | cut -d\[ -f1) in
        sshd)
                debug "DEBUG: sshd !"
                IP=$(echo $LOG | awk '/sshd.*Invalid user/ { print $10 }')
                ;;
        *)
                IP=""
                ;;
        esac
        debug "DEBUG: IP=$IP"
        if [ "$IP" != "" ]; then
                create_rule
                debug "DEBUG: add rule for $IP"
                logger "Attack response from logreact : add rule for $IP"
                $IPTABLES -A logreact -p tcp --dport ssh -s $IP -j DROP
        fi
done
#< $FIFO
}

logger "logreact is starting"
tail --follow=name /var/log/messages | read_log
logger "Warning : logreact exiting"

-----------------------------8<---------------------------------------------

A+
-- 
Sébastien
_________________________________
Linux mailing list
[email protected]
http://lists.parinux.org/mailman/listinfo/linux

Répondre à