web-dev-qa-db-ja.com

fail2banは、特定のポートですでに禁止されている場合、すべてのポートでIPを禁止することはできません

Fail2banでカスタムフィルターを使用して、独自のログを検索し、通常のフィルターのいずれかから5回禁止された後にIPを禁止しています。このためのアクションとしてiptables-allportsを使用しています。他のすべてのフィルターはiptables-multiportで構成されます。

これはjail.confの特定の構成です

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

私のフィルターfail2ban.confは次のようになります(冗長なコメントは削除されました)

[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は、Ubuntu12.04.2のfail2ban0.8.6-3に付属のデフォルトです。

問題は、IPが通常のフィルターの1つ、たとえばsshdから禁止されるたびに、10分間禁止されることです。しかし、同じアドレスが5回禁止されると、fail2banフィルターはそのIPを30日間禁止することになっていますが、fail2ban-sshチェーンですでに禁止されているため、失敗します。

このログを見れば、問題が理解しやすいかもしれません

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

ご覧のとおり、fail2banは、別のポート(つまり、一般的な「すべてのポート」ではなく特定のポート22)を対象としている場合でも、IPをすでに禁止されていると見なし、何もしません。

すでにsshで禁止されている場合でも、fail2banにfail2banチェーンのIPを禁止させることができるかどうか、またどのようにしたらよいのでしょうか。

どんなガイダンスも歓迎します。ありがとう。

3
Simon Kjellberg

Fail2banはサービスごとにiptablesチェーンを作成しますが(例:fail2ban-ssh)、既存の禁止のチェックはIPアドレスに基づいています。この問題を修正する可能性は、fail2ban nban IP(チケット)を禁止する直前にすでに禁止リストに含まれている場合(再び)にすることです。

これらのアクションは、(apt-get installを介してインストールされた場合)にあるpythonスクリプトで発生します)

/usr/share/fail2ban/server

ファイルactions.pyを編集すると、__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

定義を変更/置換

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

そして、おそらく必要ではないのに、fail2ban(例:/etc/init.d/fail2ban restart)を再起動します。

注:これを「いじくり回す」場合は、ファイアウォール(iptables)ルールを一覧表示できます。

iptables -L

「再禁止」にアクセスして強制するために、fail2banによって作成されたルールを削除します

iptables -D fail2ban-ssh xxxx

ここで、xxxxは、リストiptables -L fail2ban-sshからのそのチェーン内のルールの番号です。

1
Ring Ø

ホストがNATの背後にある場合、INPUTでIPをブロックしても機能しません。代わりにFORWARDを選択する必要があります。

たとえば、DockerでAsteriskを使用しているため、INPUTのブロックは機能しません。私はこのような刑務所の役割を果たしました:

[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

写真が添付されているように、ドロップパケットのカウントが増加していることがわかります。

ここに画像の説明を入力してください

0
user950641