Rocky Linux 9でNginxサーバーをFail2Banで保護する方法

イントロダクション

ウェブサーバーを設定する際には、アクセス制限を設けたい場合がしばしばあります。ウェブアプリケーションは独自の認証や認可方法を提供することが一般的ですが、それらが不十分または利用できない場合には、ウェブサーバー自体を使用してアクセス制御を行うことができます。しかしながら、ウェブサーバーの認証は攻撃者によるアクセス試行の予測可能な攻撃面や攻撃経路となる場合もあります。

ネットワークに公開されているどんなサービスも、この方法において潜在的な攻撃対象となります。一般的なトラフィックがあるウェブサーバーのログを確認すると、ユーザーやボットによる繰り返された、組織的なログイン試行がしばしば見られます。これらはブルートフォース攻撃を表しています。

この責任が完全に受け入れられない大規模な実装では、通常、プライベートエンドポイントの前にWireGuardなどのVPNを導入します。これにより、追加のソフトウェア抽象化やゲートウェイなしに外部インターネットからこれらのURLに直接接続することは不可能になります。これらのVPNソリューションは大いに信頼されていますが、複雑さを増し、一部の自動化や他の小規模なソフトウェアフックを壊す可能性があります。

完全なVPNセットアップに先立ち、またはそれに加えて、Fail2banというツールを導入することができます。Fail2banは、特定のIPアドレスが一定回数のログイン試行失敗を行った後、自動的にファイアウォールの設定を変更して該当IPをブロックするルールを作成することで、総当たり攻撃を大幅に軽減します。これにより、あなたが介入することなく、サーバーはこのようなアクセス試行に対して自己強化することができます。

このガイドでは、Rocky Linux 9 サーバーに fail2ban をインストールして、Nginx のログを監視し侵入の試みを検知する設定方法を学びます。

前提条件

  • Access to an Rocky Linux 9 server environment with a non-root user with sudo privileges in order to perform administrative tasks. To learn how to create such a user, follow the Rocky Linux 9 initial server setup guide.
  • Nginx installed on your system, following Steps 1 and 2 of this guide on how to install Nginx on Rocky Linux 9.
  • Nginx installed and configured with password authentication following How To Set Up Password Authentication with Nginx on Rocky Linux 9.

ステップ1:Fail2banのインストールと設定

Fail2banはRockyのデフォルトのソフトウェアリポジトリでは利用できません。しかし、Red HatやRocky Linuxで一般的に使用されるサードパーティのパッケージのためのEPEL(Enhanced Packages for Enterprise Linux)リポジトリでは利用できます。もしまだシステムのパッケージソースにEPELを追加していない場合、他のパッケージをインストールするようにdnfを使用してリポジトリを追加することができます。

  1. sudo dnf install epel-release -y

 

新しいソフトウェアをインストールする際、dnfパッケージマネージャーはデフォルトのパッケージソースに加えてEPELも確認します。Fail2banをインストールします。

  1. sudo dnf install fail2ban -y

 

Fail2banがインストールされると、自動的にバックグラウンドサービスが設定されますが、デフォルトでは無効になっています。デフォルトの設定のいくつかが望ましくない効果を引き起こす可能性があるためです。systemctlコマンドを使用して、これを確認することができます。

  1. systemctl status fail2ban.service

 

Output

○ fail2ban.service – Fail2Ban Service Loaded: loaded (/lib/systemd/system/fail2ban.service; disabled; vendor preset: disabled Active: inactive (dead) Docs: man:fail2ban(1)

すぐにFail2banを有効にすることもできますが、まずはその機能のいくつかを確認してみましょう。

fail2banサービスは、その設定ファイルを/etc/fail2banディレクトリに保管しています。jail.confというデフォルトのファイルがあります。そのディレクトリに移動して、head -20を使ってそのファイルの最初の20行を表示してください。

  1. cd /etc/fail2ban
  2. head -20 jail.conf

 

Output

# # WARNING: heavily refactored in 0.9.0 release. Please review and # customize settings for your setup. # # Changes: in most of the cases you should not modify this # file, but provide customizations in jail.local file, # or separate .conf files under jail.d/ directory, e.g.: # # HOW TO ACTIVATE JAILS: # # YOU SHOULD NOT MODIFY THIS FILE. # # It will probably be overwritten or improved in a distribution update. # # Provide customizations in a jail.local file or a jail.d/customisation.local. # For example to change the default bantime for all jails and to enable the # ssh-iptables jail the following (uncommented) would appear in the .local file. # See man 5 jail.conf for details. # # [DEFAULT]

以下は、ファイルの最初の数行がコメントアウトされていることがわかります。これらの行は、#文字で始まるため、設定ではなくドキュメンテーションとして読まれることを示しています。また、これらのコメントは、このファイルを直接変更しないように指示しています。代わりに、2つのオプションがあります。jail.d/ディレクトリ内の複数のファイルにFail2banの個別のプロファイルを作成するか、jail.localファイルにすべてのローカル設定を作成して収集します。Fail2ban自体が更新されるたびにjail.confファイルも定期的に更新され、作成していない既定の設定の元として使用されます。

このチュートリアルでは、jail.localを作成します。jail.confをコピーすることでそれが可能です。

  1. sudo cp jail.conf jail.local

 

今、設定変更を開始することができます。Rocky Linux 9にはviというデフォルトのテキストエディタが付属しています。viは非常にパワフルなテキストエディタですが、それに慣れていないユーザーにとってはやや分かりにくいかもしれません。Rocky Linux 9サーバーの設定ファイルを編集するために、nanoのようなよりユーザーフレンドリーなエディタをインストールすることをおすすめします。

  1. sudo dnf install nano -y

 

今では、Nginxの設定ファイルを編集するためにnanoを使うことができます。

  1. sudo nano jail.local

 

デフォルト値の変更

最初に、ファイル内で設定されているデフォルト値を評価することから始めます。これらはファイル内の[DEFAULT]セクションの下に見つかります。これらの項目は一般的なポリシーを設定し、アプリケーションごとに上書きすることができます。nanoを使用している場合、Ctrl+Wを押してファイル内で検索することができます。検索文字列を入力してエンターキーを押します。

最初に注目すべきアイテムの一つは、fail2banポリシーの対象外となるクライアントのリストです。これはignoreipディレクティブで設定されます。自分のIPアドレスやネットワークを例外リストに追加することは、自分自身をロックアウトすることを避けるために良いアイデアです。これはSSHよりもWebサーバーのログイン時にはあまり問題になりません。なぜなら、シェルアクセスを維持できる場合は常に禁止を解除することができるからです。既存のリストに対して、この行のコメントアウトを解除し、追加のIPアドレスやネットワークをスペースで区切って追加することができます。

以下の文章を日本語で上手に言い換えてください。唯一のオプションで結構です:
「/etc/fail2ban/jail.local」
[DEFAULT]

. . .
#ignoreip = 127.0.0.1/8 your_home_IP

他の調整が必要な項目は、bantimeです。これは、違反したメンバーが禁止される秒数を制御します。悪意のある自動化された試みに対しては、十分な長さに設定するのが理想的ですが、ユーザーが間違いを修正するために十分に短く設定する必要もあります。デフォルトでは、10分に設定されていますが、この値を増減することができます。

/etc/fail2ban/jail.localを日本語で言い換えると、 「/etc/fail2ban/jail.local」となります。
[DEFAULT]

. . .
bantime = 10m

次の2つの項目は、違反クライアントを特定するために使用されるログ行の範囲を決定します。findtimeは秒単位の時間を指定し、maxretryディレクティブはその間に許容される試行回数を示します。クライアントがfindtimeで設定された時間内にmaxretry回以上の試行を行った場合、そのクライアントは禁止されます。

/etc/fail2ban/jail.localを日本語でパラフレーズすると,「/etc/fail2ban/jail.local」となります。
[DEFAULT]

. . .
findtime = 10m
maxretry = 5

アクションパラメータは、Fail2banが禁止を実施する際に取るアクションを設定します。値action_は、このパラメータの直前のファイルで定義されています。デフォルトのアクションは、禁止時間が経過するまで、問題のホストからのトラフィックを拒否するためにファイアウォールの設定を更新することです。

「/etc/fail2ban/jail.local」
[DEFAULT]
. . .
action = $(action_)s
. . .

上記の$(action_)を置き換えることができる、デフォルトで提供されている他のアクション_スクリプトがあります。

以下の文を日本語で言い換えると、
「/etc/fail2ban/jail.local」というファイルです。」
…
# ban & send an e-mail with whois report to the destemail.
action_mw = %(action_)s
            %(mta)s-whois[sender="%(sender)s", dest="%(destemail)s", protocol="%(protocol)s", chain="%(chain)s"]

# ban & send an e-mail with whois report and relevant log lines
# to the destemail.
action_mwl = %(action_)s
             %(mta)s-whois-lines[sender="%(sender)s", dest="%(destemail)s", logpath="%(logpath)s", chain="%(chain)s"]
…

次のステップでは、Nginx固有の設定に移ります。

ステップ2- Fail2Banを設定して、Nginxログを監視します。

一般的なfail2banの設定がいくつか済んでいるので、特定のパターンをモニターするためにNginx専用のjailsを有効にすることができます。

設定ファイル内の各刑務所は、角かっこ内の刑務所名を含むヘッダーで表示されています。[DEFAULT] セクション以外のすべてのセクションは、特定の刑務所の設定を示しています。デフォルトでは、[ssh] 刑務所のみが有効になっています。

Nginxのログイン試行の監視を有効にするため、[nginx-http-auth]ジェイルを有効にしてください。このセクションにはenabled = trueのディレクティブを追加してください。

/etc/fail2ban/jail.localを日本語で言い換えると、以下のようになります:
「/etc/fail2ban/jail.local」
…
[nginx-http-auth]

enabled  = true
port     = http,https
logpath = %(nginx_error_log)s
. . .

修正が完了したら、ファイルを保存して閉じてください。もしnanoを使用している場合は、Ctrl+Xを押し、プロンプトが表示されたらYを入力し、次にEnterを押してください。次に、nginx-http-authのフィルター設定を確認します。

ステップ3 – Nginxジェイルのフィルターの確認を行います。

jail.localにおいて、[nginx-http-auth]ブロックにはNginxに特定のルールが含まれていないことに気付いたかもしれません。これらのルールはFail2ban内に自動的にハードコードされているわけではありません。実際には、[nginx-http-auth]ヘッダーはFail2banのfilter.dディレクトリ内のファイル名と直接対応しています。このディレクトリの内容をリストアップすると、必要な場合に使用できる他の事前パッケージ化されたフィルターが見えるでしょう。

  1. ls /etc/fail2ban/filter.d

 

Output

3proxy.conf freeswitch.conf proftpd.conf apache-auth.conf froxlor-auth.conf pure-ftpd.conf apache-badbots.conf gitlab.conf qmail.conf apache-botsearch.conf grafana.conf recidive.conf apache-common.conf groupoffice.conf roundcube-auth.conf apache-fakegooglebot.conf gssftpd.conf scanlogd.conf apache-modsecurity.conf guacamole.conf screensharingd.conf apache-nohome.conf haproxy-http-auth.conf selinux-common.conf apache-noscript.conf horde.conf selinux-ssh.conf apache-overflows.conf ignorecommands sendmail-auth.conf apache-pass.conf kerio.conf sendmail-reject.conf apache-shellshock.conf lighttpd-auth.conf sieve.conf assp.conf mongodb-auth.conf slapd.conf asterisk.conf monit.conf softethervpn.conf bitwarden.conf murmur.conf sogo-auth.conf …

今のところ、nginx-http-auth.confを見てみてください。 (Ima no tokoro, nginx-http-auth.conf o mite mite kudasai.)

  1. cat /etc/fail2ban/filter.d/nginx-http-auth.conf

 

Output

# fail2ban filter configuration for nginx [Definition] failregex = ^ \[error\] \d+#\d+: \*\d+ user “(?:[^”]+|.*?)”:? (?:password mismatch|was not found in “[^\”]*”), client: <HOST>, server: \S*, request: “\S+ \S+ HTTP/\d+\.\d+”, host: “\S+”(?:, referrer: “\S+”)?\s*$ ignoreregex = datepattern = {^LN-BEG} …

これらのファイルには、ログ内の行が認証失敗の試みであるかどうかを判別するための正規表現(テキスト解析の一般的な略記法)が含まれています。必要に応じて直接修正することができます。

次の手順では、Fail2banを有効にしてテストします。

ステップ4 – Nginxジェイルのアクティベーション

この段階では、Fail2banサービスを有効にして、今後自動的に実行されるようにすることができます。最初に、systemctl enableを実行してください。

  1. sudo systemctl enable fail2ban

 

それでは、最初の起動時にsystemctl startで手動で起動してください。

  1. sudo systemctl start fail2ban

 

systemctl status コマンドを使用して、実行中であることを確認できます。

  1. sudo systemctl status fail2ban

 

Output

● fail2ban.service – Fail2Ban Service Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled; vendor preset: enabled Active: active (running) since Wed 2022-09-14 20:48:40 UTC; 22h ago Docs: man:fail2ban(1) Main PID: 5962 (fail2ban-server) Tasks: 7 (limit: 2327) Memory: 12.6M CPU: 195ms CGroup: /system.slice/fail2ban.service └─5962 /usr/bin/python3 /usr/bin/fail2ban-server -xf start

Note

注意:将来の構成変更を実行するには、fail2banサービスを再起動する必要があります。sudo systemctl restart fail2banコマンドを使用して行うことができます。

有効な刑務所に関する情報を取得する

「fail2ban-client」コマンドを使用することで、有効化されているすべてのJailを表示することができます。

  1. sudo fail2ban-client status

 

有効な刑務所のリストが表示されるはずです。

Output

Status |- Number of jail: 2 `- Jail list: nginx-http-auth, sshd

もし、特定の刑務所で実施されている禁止事項の詳細を確認したい場合は、再びfail2ban-clientを使用してください。

  1. sudo fail2ban-client status nginx-http-auth

 

Output

Status for the jail: nginx-http-auth |- filter | |- File list: /var/log/nginx/error.log | |- Currently failed: 0 | `- Total failed: 0 `- action |- Currently banned: 0 | `- IP list: `- Total banned: 0

このチュートリアルの最後のステップでは、Fail2banの設定が正常に機能しているかを確認するために、意図的にアカウントが禁止されるテストを行います。

ステップ5:Fail2Banポリシーのテスト

Fail2banのポリシーが正しくトラフィックをブロックするかどうかを確認するために、テストすることが重要です。これを行うには、ローカルのウェブブラウザでサーバーに移動します。Nginxの認証プロンプトで、繰り返し間違った資格情報を入力してください。数回の試行の後、サーバーは接続が切断されたかのように完全に応答しなくなるはずです。

Chrome browser window unable to connect

nginx-http-authの設定の状態をfail2ban-clientで確認すると、自身のIPアドレスがサイトから禁止されていることがわかります。

  1. sudo fail2ban-client status nginx-http-auth

 

Output

Status for the jail: nginx-http-auth |- Filter | |- Currently failed: 0 | |- Total failed: 5 | `- File list: /var/log/nginx/error.log `- Actions |- Currently banned: 1 |- Total banned: 1 `- Banned IP list: 108.172.85.62

あなたが自分のルールが機能していることに満足したら、fail2ban-clientを使用してIPアドレスの禁止を手動で解除できます。

  1. sudo fail2ban-client set nginx-http-auth unbanip 108.172.85.62

 

今回は、もう一度認証を試みることができるはずです。

結論

Fail2banは、特定のセキュリティニーズに合わせたポリシーを作成するための非常に柔軟性のある機能を提供します。/etc/fail2ban/jail.localファイル内や、それに依存するファイルである/etc/fail2ban/filter.dおよび/etc/fail2ban/action.dディレクトリ内の変数とパターンを見ることで、ニーズに応じて調整や変更する要素を多く見つけることができます。fail2banでサーバーを保護することは、有益なセキュリティの基準を提供することができます。

Fail2Banのさまざまな使い方を発見するには、Rocky Linux 9上のLinuxサーバーでサービスを保護するFail2Banの仕組みを確認し、Fail2BanでSSHを保護する方法をチェックしてください。

コメントを残す 0

Your email address will not be published. Required fields are marked *