【Linux】fail2banを構成してFirewallを強化してみる!【セキュリティ】

#サーバ
written by パイン

こんにちは!サーバーエンジニアのパインです。
すでにそうめんがおいしい季節ですね!我が家は2人暮らしにも関わらず揖保乃糸をもう2袋消費しました。。。

Firewallについて少し補足

前回はLinuxのFirewalldについて少し触れました。
【Linux】Firewalldを構成してみる【セキュリティ】
Firewallですが基本的に「許可」or「拒否」しかできず、DDoS攻撃やブルートフォース攻撃など不正アクセスを自動で防いでくれるものではありません。企業HPやECサイトなどは広範囲に公開するWebサイトになるため、どうしてもTCP80/443は攻撃対象になりがちです。
攻撃元のIPアドレスを片っ端からブロックしていくにしても運用し続ける手間やコストを考えると微妙です。

そこで今回はfail2banというソフトウェアを追加して自動で攻撃元IPアドレスをFirewalldに追加してアクセスできないように対処していきます。

環境情報

前回の環境にfail2banを追加します。
AlmaLinux 8.5 (minimal install)
– firewalld 0.9.3
– httpd 2.4.37
– fail2ban 0.11.2 ←New!

システムのイメージ図は下記になります。

fail2banをインストールする

まずfail2banのインストールにあたってEPELリポジトリを追加しておく必要があります。

# dnf install epel-release

次にfail2banをインストールします。

# dnf install fail2ban

インストール後、下記コマンドでバージョン確認ができればOK!

# fail2ban-server --version
Fail2Ban v0.11.2
# fail2ban-client --version
Fail2Ban v0.11.2
# fail2ban-regex --version
fail2ban-regex 0.11.2
# fail2ban-python --version
Python 3.6.8

fail2banを構成する

実際にfail2banを設定して不正(と思われる)トラフィックを遮断していきます。
fail2banに独自ルールを設定する際はjail.confではなくjail.localというファイルを作成して定義します。
今回はとりあえず「自動でルール追加してブロックする」動作を確認できればいいので、400番台のレスポンスコードを返す通信のソースIPをブロックするようにします。

# vi /etc/fail2ban/jail.local
[http]
enabled = true
bantime = 600
findtime = 10
maxretry = 2
port = http
logpath = /var/log/httpd/access_log
filter = http-4xx-filter

フィルタールールに正規表現で監視したいメッセージを書きます。

# vi /etc/fail2ban/filter.d/http-4xx-filter.conf
[Definition]
failregex = ^<HOST> -.*"GET .*HTTP/1.1" 4[0-9]{2}
ignoreregex =

fail2banを起動します。fail2ban-clientコマンドでもいいのですが、再起動後も常駐させたいのでsystemctlコマンドで起動します。

# systemctl start fail2ban
# systemctl enable fail2ban

fail2banにBANされてみる

Apacheにテストページを追加しました。(デフォルトのwelcomeページが403返すため)

access_logを見るとちゃんと200が返されてますね。

192.168.2.105 - - [30/Apr/2022:02:23:07 -0400] "GET /test.html HTTP/1.1" 200 10 "-"

fail2ban.logには特にメッセージは出ていないのでフィルターに引っかかっていないことがわかります。
次はデフォルトのwelcomeページにアクセスしてみます。

access_logには403で記録されています。

192.168.2.105 - - [30/Apr/2022:02:30:01 -0400] "GET / HTTP/1.1" 403 4681 "-"

fail2ban.logを見るとちゃんと検知できていますね。

2022-04-30 02:30:01,904 fail2ban.filter [50222]: INFO [http] Found 192.168.2.105 - 2022-04-30 02:30:01

BANしてもらいたいので何回かリロードしてみます。すると。。。

2022-04-30 02:32:47,943 fail2ban.actions [50222]: NOTICE [http] Ban 192.168.2.105

BANされました。ブラウザからもアクセスできません。

firewalldのルールを確認するとRichルールに追加されて拒否されていることがわかります。

# firewall-cmd --list-all
public (active)
~略~
rich rules:
rule family="ipv4" source address="192.168.2.105" port port="http" protocol="tcp" reject type="icmp-port-unreachable"

最後に

今回はLinuxサーバーのサイトセキュリティ高める手法としてfirewalld+fail2banで自動ブロックする構成を紹介しました。
ルール策定や正規表現など高度な知識を要求されますが、クラウド・VPSのオプションサービスを利用することなく無料で実装できるので試してみてはいかがでしょうか。

外部リンク

fail2ban Wiki