fail2ban não pode proibir ip em todas as portas se já estiver banido por porta específica

3

Estou usando um filtro personalizado no fail2ban para pesquisar em seu próprio log e banir um ip após 5 proibições de qualquer um dos filtros comuns. Estou usando iptables-allports como ação para isso. Todos os outros filtros estão configurados com iptables-multiport .

Esta é a configuração específica em jail.conf

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

Meu filtro fail2ban.conf se parece com isso (comentários redundantes removidos)

[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 é o padrão que veio com o fail2ban 0.8.6-3 para o Ubuntu 12.04.2

O problema é que sempre que um ip é banido de um dos filtros comuns, digamos sshd, ele é banido por 10 minutos. Mas a quinta vez que o mesmo endereço é banido, o filtro fail2ban deve banir esse ip por 30 dias, mas como já está banido na cadeia do fail2ban-ssh ele falha.

Talvez o problema seja mais fácil de entender se você observar esse log

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

Como você pode ver, o fail2ban vê o ip como já banido, mesmo sendo para uma porta diferente (ou melhor: uma porta específica, 22, ao invés do genérico "all ports") e, portanto, não faz nada.

Eu estou querendo saber se, e como, você pode fazer o fail2ban banir o ip no fail2ban-chain, mesmo que ele já seja banido por ssh?

Qualquer orientação é apreciada. Obrigado.

    
por Simon Kjellberg 20.03.2013 / 14:09

2 respostas

1

Enquanto o fail2ban cria uma cadeia iptables por serviço (por exemplo, fail2ban-ssh ), a verificação de uma proibição existente é baseada no endereço IP. Uma possibilidade para consertar o problema é fazer com que o fail2ban unban um IP (ticket) se ele já esteja na lista de banidos antes que ele seja banido (novamente)

Essas ações acontecem no script python localizado (quando instalado via apt-get install ) em

/usr/share/fail2ban/server

edite o arquivo actions.py , você deve ver o seguinte código para a definição __checkban

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

modificar / substituir a definição por

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

e reinicie o fail2ban (por exemplo, /etc/init.d/fail2ban restart ), embora provavelmente não seja necessário ...

Nota: se você quiser 'brincar' com isso, você pode listar as regras do firewall (iptables)

iptables -L

e exclua a regra que foi criada por fail2ban para acessar e forçar um "novo banimento"

iptables -D fail2ban-ssh xxxx

em que xxxx é o número da regra nessa cadeia da lista iptables -L fail2ban-ssh

    
por 20.03.2013 / 16:25
0

se o seu host estiver atrás do NAT, o bloqueio do ip no INPUT não funcionará. você tem que escolher FORWARD em vez disso.

por exemplo, estou usando o Asterisk no Docker, então bloquear o INPUT não funcionará. Eu fiz papel de prisão assim:

[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

Eu posso ver a contagem de pacotes de drop aumenta como pic anexo.

insira a descrição da imagem aqui

    
por 05.05.2019 / 20:54