
マイコンピュータに正しいインストール、有効化、およびfail2ban
ルールがあります。すべてがうまくいきます。ssh
ssh-dos
recidive
最近、ブロック後にIPを切り替えて、「繰り返し」ルールを迂回する同じネットワーク上の複数のホストで繰り返し攻撃パターンが増加することを確認しました。
2015-01-25 11:12:11,976 fail2ban.actions: WARNING [ssh] Ban XXX.41.124.29
2015-01-25 11:12:13,165 fail2ban.actions: WARNING [ssh] Ban XXX.41.124.42
2015-01-25 11:12:16,297 fail2ban.actions: WARNING [ssh] Ban XXX.41.124.28
2015-01-25 11:12:20,446 fail2ban.actions: WARNING [ssh] Ban XXX.41.124.104
私はそれを検出し、これらすべてのタイプの攻撃をブロックする「recidive24」ルールを作成し、ブロック全体/24
を禁止したいと思います。
以下で提案を見つけました。Debian エラーファイルFail2banの場合はこれを適用しましたが、次のようになります。
/24
刑務所が発動したときに包括的な禁止を適用すると、ssh
同じネットワーク上の誰かが単一のIPで攻撃し、私を簡単にブロックできる問題に直面します。刑務所は
recidive
完璧ですが、StormがIPを変更しても刑務所は実行されません...
だから私はIPの最初の3バイトだけを見ることができるようにフィルタ仕様を変更したいのですが、ここで迷っていますrecidive
...禁止を実行する正規表現は(from /etc/fail2ban/recidive.conf
)です。
# The name of the jail that this filter is used for. In jail.conf, name the
# jail using this filter 'recidive', or change this line!
_jailname = recidive
failregex = ^(%(__prefix_line)s|,\d{3} fail2ban.actions:\s+)WARNING\s+\[(?!%(_jailname)s\])(?:.*)\]\s+Ban\s+<HOST>\s*$
...全体のIPと一致します。
質問:ホストIPの最初の3バイトのみに一致するように、この失敗正規表現をどのように変更できますか?
スパムIPが検出された場合、問題はサブネット全体をブロックするのではなく、比較的簡単です。問題は、subnet-recidive
同じサブネットに5つ以上のヒットがあると何かがトリガーされることです。recidive
別のデーモンを使用してFail2banログファイルをフィルタリングし、毎回最後のバイトが0の2番目のファイルに書き込んで、それを使用して再犯刑務所をトリガーしましたが、本当に不器用だったようです。
答え1
/24
/22
すべての刑務所のコマンドにこの魔法(一部は好きかもしれません)を追加する最も簡単な方法iptables
は、2つのファイルを追加することです。
/etc/fail2ban/action.d/iptables-multiport.local
/etc/fail2ban/action.d/iptables-allports.local
次のコンテンツが含まれています。
[Definition]
actionban = <iptables> -I f2b-<name> 1 -s <ip>/24 -j <blocktype>
actionunban = <iptables> -D f2b-<name> -s <ip>/24 -j <blocktype>
~のため発覚フィルタを修正する必要がある部分が...少し面倒です。しかし、良いことは - 必要はないということです!このサブネットブロッキング機能はうまく機能します。
答え2
Fail2banには、サブネット全体の攻撃を自動的にブロックするきちんとした機能はありません。しかし、最新バージョンのfailure2ban(私はv0.11を使用しています)、いくつかの簡単なfall2banスクリプト、および小さな純粋なpython3スクリプトを使用して実行できます。
注:問題は「フルサブネット」に関連しています(これをCIDRブロックまたはIP範囲と呼びます)。これは、攻撃者が制御するアドレスブロックのサイズがどれだけ大きいかわからないため、難しいことです。攻撃者は、中間アドレスが正当である間、誤って同じブロック内の少数のアドレスを制御する可能性があります。
ステップ1。ホストのCIDRのインポート
fall2banが監視するログファイルには、通常、CIDRブロック(127.0.0.0/24)またはIP範囲(127.0.0.0 - 127.0.0.255)ではないホスト(127.0.0.1など)が表示されます。
解決策は、最初に小さなCIDRブロックを想定し、次にログで誤動作しているホストがより多く報告されるにつれてブロックを増やすことです。明らかに、CIDRはこれらのホストが隣接するアドレスにある場合にのみ増加する必要があります。しかし、これは複雑であり、アルゴリズムがどんなに洗練されたとしても正当なアドレスをキャプチャできます。
代わりに、whoisでCIDRを簡単に照会することもできます。これにより、whois ルックアップが少し遅れ、いくつかのトラフィックが発生します。ただし、whoisを解析するスクリプトはCIDRをsyslogに書き込むことができます。その後、fall2banによって再キャプチャされる可能性があります。
注:このスクリプトを目的のaction.d/lorem-ipsum.confスクリプトのactionbanに接続することを忘れないでください。maxretry> 1の場合、ホストは一度だけ失敗したCIDRブロックをキャプチャできません。
#!/usr/bin/python
import sys, subprocess, ipaddress, syslog
def narrowest_cidr(cidrA, cidrB):
_ip, subA = cidrA.split('/')
_ip, subB = cidrB.split('/')
if int(subA) > int(subB):
return cidrA
else:
return cidrB
bad_ip = sys.argv[1]
cidrs = []
inetnums = []
ret = None
whois = subprocess.run(['whois', bad_ip], text=True,
stdout=subprocess.PIPE, check=True)
for line in whois.stdout.split('\n'):
if 'CIDR:' in line:
cidrs.append(line.replace('CIDR:', '').strip())
if 'inetnum:' in line:
inetnums.append(line.replace('inetnum:', '').strip())
if len(cidrs) >= 1:
if len(cidrs) == 1:
cidr = cidrs[0]
else:
cidr = narrowest_cidr(cidrs[0], cidrs[-1])
elif len(inetnums) > 0:
if len(inetnums) == 1:
inetnum = inetnums[0]
startip, endip = inetnum.split(' - ')
cidrs = [ipaddr for ipaddr in ipaddress.summarize_address_range(ipaddress.IPv4Address(startip), ipaddress.IPv4Address(endip))]
if len(cidrs) == 1:
cidr = cidrs[0]
else:
cidr = narrowest_cidr(cidrs[0], cidrs[-1])
else:
cidr = "no CIDR found"
syslog.openlog(ident="suspectrange")
syslog.syslog("{} has CIDR {}".format(bad_ip, cidr))
ステップ2。 CIDRをブロックするタイミングを決定する
動的CIDR決定がある場合は、許可しない項目を変更する必要があるため、少し複雑になる可能性があります。ただし、whoisクエリを使用すると、適切であると判断されたmaxretryとfindtimeに基づいて見つかったCIDRブロックを単純に抑制できます。私が使用する刑務所は次のとおりです。
[fail2ban-cidr-recidive]
filter = fail2ban-cidr-recidive
action = nftables-common[name=BADRANGE]
logpath = /var/log/everything/current
#5 bans in 12hrs is 48hr ban
maxretry = 5
findtime = 12h
bantime = 2d
含まれているフィルタ
[Definition]
failregex = \[suspectrange\] .* has CIDR <SUBNET>
Step 3. CIDRの実際のブロック
私はaction.d/nft-common.confを使用していることに気づきました。 nftablesを使用すると、個々のホストの代わりにCIDRブロックをブロックできます。これを行うには、ジョブスクリプトのactionstartセクションの最初の行を少し変更する必要があります。
actionstart = nft add set netdev f2b <set_name> \{ type ipv4_addr\; \}
次のように修正する必要があります。
actionstart = nft add set netdev f2b <set_name> \{ type ipv4_addr\; flags interval\; \}
答え3
Centos 7でこれを試しましたが、fail2ban
時にはIPアドレスをブロックできないことがわかりました。刑務所に追加し続けますが、まだsshdにアクセスできます。ファイアウォールといくつかの非互換性があります。
今は別のアプローチを使用しています。私は/etc/hosts.deny
これを次のように修正します:
SSHD: 43.*.*.* SSHD: 58.*.*.*
誤って自分のIPネットワークをそこに追加しないでください。
セキュリティログからIPアドレスを収集するには、次のようにします。
grep sshd /etc/hosts.deny
sshdログで最もアクティブな10個のIPアドレスとそのアクセス数を取得するには、次のようにします。
d=[0-9]{1,3}
s=[\.\-]
n=[^0-9]
ip="$d$s$d$s$d$s$d"
egrep $ip /var/log/secure | sed -r "s/^.*$n($ip).*$/\1/g" | sed s/-/./g | sort | uniq -c | sort -g | tail -10
答え4
Pythonのこのスクリプトは、crontab * / 5分以内に同様のIPをCIDR / 23から/ 32までのネットワーク範囲にグループ化するのに効果的ですが、IPTABLEを直接呼び出すこともできます。
https://github.com/WKnak/fail2ban-block-ip-range
このIPをグループ化します。
151 193.56.28.160
108 45.142.120.135
107 45.142.120.62
105 45.142.120.99
105 45.142.120.93
105 45.142.120.192
104 45.142.120.87
104 45.142.120.60
104 45.142.120.209
104 45.142.120.200
104 45.142.120.133
103 45.142.120.180
103 45.142.120.149
102 45.142.120.59
100 45.142.120.215
78 45.142.120.57
78 45.142.120.11
77 45.142.120.82
77 45.142.120.20
76 45.142.120.63
76 45.142.120.34
76 45.142.120.138
73 45.142.120.65
60 78.128.113.66
6 45.150.206.113
3 123.30.50.91
2 5.188.206.204
2 45.150.206.119
2 45.150.206.115
2 45.150.206.114
1 51.210.127.200
〜のように
fail2ban-client set postfix-sasl banip 78.128.113.66/32
fail2ban-client set postfix-sasl banip 45.142.120.0/24
fail2ban-client set postfix-sasl banip 193.56.28.160/32
fail2ban-client set postfix-sasl banip 45.150.206.112/29