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を禁止させることができるかどうか、またどのようにしたらよいのでしょうか。
どんなガイダンスも歓迎します。ありがとう。
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
からのそのチェーン内のルールの番号です。
ホストが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
写真が添付されているように、ドロップパケットのカウントが増加していることがわかります。