fail2banでサーバーへの不正アクセスしようとしている輩を全てのけ返す!

4 min read

こんにちは、無能です。前回の記事https://soulminingrig.com/blog/what-country-is-the-person-trying-to-gain-unauthorized-access-to-my-server-via-ssh/ここからたった一日であまりにも多いIPからのアクセス試行があることを確認出来ました。のほほんと今まで動かしてきて、実際に不正アクセスをされたことはありませんが対策はするべきです。
というか、流石にログファイルの蓄積が多くなり見づらくなるのもちょっと嫌です。というわけで昔にiRedMailをインストール時に依存関係として入ってきて興味のあったFail2Banを導入しようと思います。

なーにこれ?

ログ監査から設定した回数の試行があった場合にIPごとブロックすることが可能です。
また、試行があった場合のパケット自体をiptablesを介してロストをさせていくことも可能です。[インストール

今回はrootでログインしているためsudoは使いません。pkg searchしたら以下のパッケージで出てきたので入れていきます。

pkg install py311-fail2ban-1.1.0  
  

基本的に fail2ban.conf 自体の設定ファイルを変更することは推奨していなく、jail.confを作って記述せよ。とのことなので今回は
SSH, Postfix, Dovecot
この3つに関するログイン試行はとても嫌なので、設定していきます。
また、色々なサイト見ていると秒数だけでなく1w,1dでも設定可能みたいなのでド派手に設定してきます。容赦なく一週間Banもしちゃいます。

~ # cat /usr/local/etc/fail2ban/jail.local  
[sshd]  
enabled = true  
port    = ssh  
logpath = /var/log/auth.log  
bantime = 1w  
findtime = 1d  
maxretry = 5  
  
[postfix]  
enabled = true  
port    = smtp,ssmtp,submission  
logpath = /var/log/maillog  
bantime = 1w  
findtime = 1d  
maxretry = 10  
action = block-drop[name=postfix, port=smtp, protocol=tcp]  
  
[dovecot]  
enabled = true  
port    = pop3,pop3s,imap,imaps,submission  
logpath = /var/log/maillog  
bantime = 1w  
findtime = 1d  
maxretry = 10  
action = block-drop[name=dovecot, port=imap, protocol=tcp]  
  

[default]セクションを作った方が良いみたいなのですが一度様子見としてこの3つのみに対して行い、必要そうであれば追加しようと思います。ちなみに一週間にした理由は

  • そもそも今鍵認証から入っているので間違えようがない

  • メールサーバーには一回入ったらしばらくそのままログイン認証継続なので、手入力などで自分がログイン試行することがほとんどない

  • 一回banしたらパケットごとロストさせてしまいたい

  • 1日5回以上のログインミスはそもそもおかしい

ので結構厳しめ?なのかゆるいのか。あまりban期間短くしてリソースを食わせてしまうのも嫌なのでこうしました。ちなみに、HTTPサーバーでのGETメソッドのbanもできるみたいです。https://hana-shin.hatenablog.com/entry/2023/05/24/210949自分は中間サーバーとしての扱いでしかこのサーバーで動かしていないのでまだ導入していないですが、必要そうならいれてみようかなと思います。そして、追加で action = block-drop としていますがこちらの設定は以下。

# cat /usr/local/etc/fail2ban/action.d/block-drop.conf  
[Definition]  
  
actionstart = iptables -N f2b-&LTname>  
              iptables -A f2b-&LTname> -j DROP  
              iptables -I INPUT -p all -j f2b-&LTname>  
              iptables -I FORWARD -p all -j f2b-&LTname>  
  
actionstop = iptables -D INPUT -p all -j f2b-&LTname>  
             iptables -D FORWARD -p all -j f2b-&LTname>  
             iptables -F f2b-&LTname>  
             iptables -X f2b-&LTname>  
  
actioncheck = iptables -n -L INPUT | grep -q 'f2b-&LTname>[     ]'  
  
actionban = iptables -I f2b-&LTname> -s &LTip> -j DROP  
  
actionunban = iptables -D f2b-&LTname> -s &LTip> -j DROP  
  

基本的にbanしたらパケットごとDropさせるようにしています。Rejectもあったなーと思って改めてみたらhttps://serverfault.com/questions/157375/reject-vs-drop-when-using-iptables結果的にRejectは相手に拒否したことをわかるようにしたいときに使うべき、なので今回はbanなので容赦なくパケットごと闇に葬り去ることにしました。

起動と正常性確認

FreeBSDなのでコレで起動

service fail2ban start  
  

Server readyと出ればokです。ログを見てちゃんと動いているか確認します。

# tail /var/log/fail2ban.log  
2024-07-24 13:34:05,654 fail2ban.filter         [39963]: INFO    [sshd] Found  - 2024-07-24 13:34:05  
2024-07-24 13:34:05,755 fail2ban.filter         [39963]: INFO    [sshd] Found  - 2024-07-24 13:34:05  
2024-07-24 13:34:05,884 fail2ban.filter         [39963]: INFO    [sshd] Found  - 2024-07-24 13:34:05  
2024-07-24 13:34:06,000 fail2ban.filter         [39963]: INFO    [sshd] Found  - 2024-07-24 13:34:05  
2024-07-24 13:34:06,317 fail2ban.actions        [39963]: WARNING [sshd]  already banned  
2024-07-24 13:34:06,731 fail2ban.filter         [39963]: INFO    [sshd] Found  - 2024-07-24 13:34:06  
2024-07-24 13:37:14,327 fail2ban.filter         [39963]: INFO    [sshd] Found - 2024-07-24 13:37:14  
2024-07-24 13:42:12,266 fail2ban.filter         [39963]: INFO    [sshd] Found  - 2024-07-24 13:42:12  
2024-07-24 13:42:17,389 fail2ban.filter         [39963]: INFO    [sshd] Found  - 2024-07-24 13:42:17  
2024-07-24 13:42:23,357 fail2ban.filter         [39963]: INFO    [sshd] Found  - 2024-07-24 13:42:23  
  

本来はIPアドレス表示されますが、今回はちゃんと隠しています。早速Banされててかかったな!!!!小僧!!!!と心で叫んでます。
(どうせ相手はbotと機械相手に何を考えているんだか)とそんなしょうもないガッツポーズは地面に向けといて、自動起動してくれるように、/etc/rc.confに以下を追加します。

fail2ban_enable="YES"  
  

これでサーバー再起動でも自動でプロセスが上がってきてくれます。


ということで今日はここまで。ちなみに、今まで来たログでどんなユーザ名でログイン試行されたかもチャートに表示するのも面白いかなと思ったり。また、よろしくお願いします。