4 votes

fail2ban ne peut pas interdire une IP sur tous les ports si elle est déjà interdite sur un port spécifique.

J'utilise un filtre personnalisé dans fail2ban pour rechercher dans son propre journal et bannir une IP après 5 bannissements à partir de n'importe lequel des filtres réguliers. J'utilise iptables-allports comme action pour cela. Tous les autres filtres sont configurés avec iptables-multiport .

Il s'agit de la configuration spécifique dans jail.conf

[fail2ban]
enabled  = true
filter   = fail2ban
action   = iptables-allports[name=fail2ban]
logpath  = /var/log/fail2ban.log
maxretry = 5
findtime = 604800
bantime  = 2592000

Mon filtre fail2ban.conf ressemble à ceci (commentaires redondants supprimés)

[Definition]
# Count all bans in the logfile
failregex = fail2ban.actions: WARNING \[(.*)\] Ban <HOST>
# Ignore our own bans, to keep our counts exact.
ignoreregex = fail2ban.actions: WARNING \[fail2ban\] Ban <HOST>

iptables-allports.conf est la valeur par défaut fournie avec fail2ban 0.8.6-3 pour Ubuntu 12.04.2.

Le problème est que lorsqu'une adresse IP est bannie par l'un des filtres réguliers, par exemple sshd, elle est bannie pendant 10 minutes. Mais la cinquième fois que la même adresse est bannie, le filtre fail2ban est censé bannir cette IP pour 30 jours, mais comme elle est déjà bannie dans la chaîne fail2ban-sshd, il échoue.

Le problème est peut-être plus facile à comprendre si vous regardez ce journal.

2013-03-19 16:28:34,304 fail2ban.actions: WARNING [ssh] Ban 202.191.128.252
2013-03-19 16:38:34,992 fail2ban.actions: WARNING [ssh] Unban 202.191.128.252
2013-03-19 22:08:58,961 fail2ban.actions: WARNING [ssh] Ban 202.191.128.252
2013-03-19 22:18:59,675 fail2ban.actions: WARNING [ssh] Unban 202.191.128.252
2013-03-20 03:52:25,005 fail2ban.actions: WARNING [ssh] Ban 202.191.128.252
2013-03-20 04:02:25,672 fail2ban.actions: WARNING [ssh] Unban 202.191.128.252
2013-03-20 09:29:51,020 fail2ban.actions: WARNING [ssh] Ban 202.191.128.252
2013-03-20 09:39:51,734 fail2ban.actions: WARNING [ssh] Unban 202.191.128.252
2013-03-20 12:34:01,832 fail2ban.actions: WARNING [ssh] Ban 202.191.128.252
2013-03-20 12:34:03,718 fail2ban.actions: WARNING [fail2ban] 202.191.128.252 already banned
2013-03-20 12:44:02,545 fail2ban.actions: WARNING [ssh] Unban 202.191.128.252

Comme vous pouvez le voir, fail2ban considère que l'IP est déjà interdite, même si elle concerne un port différent (ou plutôt : un port spécifique, 22, au lieu du générique "tous les ports") et ne fait donc rien.

Je me demande si, et comment, vous pouvez faire en sorte que fail2ban interdise l'ip dans la chaîne fail2ban, même si elle est déjà interdite pour ssh ?

Tout conseil est le bienvenu. Merci.

2voto

Déjà vu Points 5368

Alors que fail2ban crée un iptables chaîne par service (par exemple fail2ban-ssh ), la vérification d'une interdiction existante est basée sur l'adresse IP. Une possibilité de résoudre le problème est de faire en sorte que fail2ban débanner une IP (ticket) si elle est déjà dans la liste des bannis juste avant d'être bannie (à nouveau).

Ces actions se produisent dans le script Python situé (lorsqu'il est installé via apt-get install ) en

/usr/share/fail2ban/server

modifier le fichier actions.py vous devriez voir le code suivant pour l'élément __checkban définition

def __checkBan(self):
        ticket = self.jail.getFailTicket()
        if ticket != False:
                aInfo = dict()
                bTicket = BanManager.createBanTicket(ticket)
                aInfo["ip"] = bTicket.getIP()
                aInfo["failures"] = bTicket.getAttempt()
                aInfo["time"] = bTicket.getTime()
                aInfo["matches"] = "".join(bTicket.getMatches())
                if self.__banManager.addBanTicket(bTicket):
                        logSys.warn("[%s] Ban %s" % (self.jail.getName(), aInfo["ip"]))
                        for action in self.__actions:
                                action.execActionBan(aInfo)
                        return True
                else:
                       logSys.warn("[%s] %s already banned" % (self.jail.getName(), aInfo["ip"]))
        return False

modifier/remplacer la définition par

def __checkBan(self):
        ticket = self.jail.getFailTicket()
        if ticket != False:
                aInfo = dict()
                bTicket = BanManager.createBanTicket(ticket)
                aInfo["ip"] = bTicket.getIP()
                aInfo["failures"] = bTicket.getAttempt()
                aInfo["time"] = bTicket.getTime()
                aInfo["matches"] = "".join(bTicket.getMatches())
                # changes from here ...
                if not self.__banManager.addBanTicket(bTicket):
                        logSys.warn("[%s] first unban %s before ban" % (self.jail.getName(), aInfo["ip"]))
                        self.__unBan(ticket)
                        self.__banManager.addBanTicket(bTicket)
                logSys.warn("[%s] Ban %s" % (self.jail.getName(), aInfo["ip"]))
                for action in self.__actions:
                        action.execActionBan(aInfo)
                return True
                # else:
                #       logSys.warn("[%s] %s already banned" % (self.jail.getName(), 
                #                                                                                       aInfo["ip"]))
        #return False

et redémarrer fail2ban (par ex. /etc/init.d/fail2ban restart ) alors que ce n'est probablement pas nécessaire...

Note : si vous voulez jouer avec, vous pouvez lister les règles du pare-feu (iptables).

iptables -L

et supprimer la règle qui a été créée par fail2ban afin d'accéder et de forcer un "re-ban".

iptables -D fail2ban-ssh xxxx

où xxxx est le numéro de la règle dans cette chaîne de la liste iptables -L fail2ban-ssh

0voto

user950641 Points 1

Si votre hôte est derrière NAT, alors bloquer l'ip dans INPUT ne fonctionnera pas. vous devez choisir FORWARD à la place.

par exemple, j'utilise Asterisk dans Docker, donc bloquer INPUT ne fonctionnera pas. J'ai fait un rôle de prison comme ceci :

[asterisk]
enabled = true
filter = asterisk
action = iptables-allports[chain=FORWARD, name=asterisk, protocol=all, blocktype=DROP]
logpath = /home/asterisk/logs/messages
bantime = 10800
maxretry = 2

Je peux voir que le nombre de paquets perdus augmente comme sur la photo ci-jointe.

Entrez la description de l'image ici

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X