Rocky Linux 8でFail2Banを使用してSSHを保護する方法

導入

SSHはクラウドサーバーへの接続のデファクト方法です。耐久性があり、拡張性があります。新しい暗号化基準が開発されると、これらは新しいSSHキーの生成に使用され、コアプロトコルのセキュリティが確保されます。しかし、どんなプロトコルやソフトウェアスタックも完全に防御可能ではなく、SSHがインターネット全体で広く展開されているため、非常に予測可能な攻撃面または攻撃ベクトルを提供します。攻撃対象表面または攻撃ベクトル

ネットワークに公開されている任意のサービスは、このように潜在的なターゲットです。広くトラフィックのあるサーバーで実行されているSSHサービスのログを確認すると、ユーザーやボットによる繰り返された体系的なログイン試行がよく見られます。これらの攻撃の成功率をほぼゼロに近づけるために、SSHキーを優先してパスワード認証を無効にするなど、SSHサービスを最適化することができますが、それでもわずかながら持続的な責任を負う可能性があります。

大規模な本番展開では、この責任を完全に受け入れられない場合、通常、WireGuardなどのVPNを実装してSSHサービスの前に配置します。これにより、外部インターネットからデフォルトのSSHポート22に直接接続することが不可能になり、追加のソフトウェア抽象化またはゲートウェイが必要です。これらのVPNソリューションは広く信頼されていますが、複雑さを増し、一部の自動化やその他の小さなソフトウェアフックを壊す可能性があります。

完全なVPNセットアップに踏み切る前または追加で、Fail2banと呼ばれるツールを実装することができます。Fail2banは、一定回数の失敗したログイン試行後に特定のIPを禁止するようにファイアウォール構成を自動的に変更するルールを作成することで、総当たり攻撃を大幅に緩和できます。これにより、サーバーはあなたの介入なしにこれらのアクセス試行に対して自己を強化することができます。

このガイドでは、Rocky Linux 8サーバーにFail2banをインストールして使用する方法を説明します。

前提条件

このガイドを完了するには、次のものが必要です:

  • Rocky Linux 8サーバーとsudo特権を持つ非rootユーザーが必要です。これらの特権を持つユーザーを設定する方法については、当社のRocky Linux 8の初期サーバーセットアップガイドをご覧ください。また、サーバーでfirewalldが実行されている必要がありますが、これは当社の初期サーバーセットアップガイドでカバーされています。

  • オプションで、最初のサーバーに接続できる第二のサーバーがあると便利です。これは、意図的に禁止されることをテストするために使用します。

ステップ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をすぐに有効にすることもできますが、まずその機能のいくつかを確認します。

ステップ2 – Fail2banの設定

Fail2banサービスは、その設定ファイルを/etc/fail2banディレクトリに保持しています。デフォルトの設定が含まれたファイルがjail.confと呼ばれています。そのディレクトリに移動し、head -20を使用してそのファイルの最初の20行を印刷します:

  1. cd /etc/fail2ban
  2. head -20 jail.conf
Output
# #警告:0.9.0リリースで大幅にリファクタリングされました。設定を見直して #あなたのセットアップにカスタマイズしてください。 # #変更:ほとんどの場合、この #ファイルを変更する必要はありませんが、jail.localファイルにカスタマイズを提供し、 #jail.d/ディレクトリ内の別々の.confファイル、例: # #JAILのアクティベーション方法: # #このファイルを変更しないでください。 # #おそらく配布更新で上書きされるか、改善されます。 # # jail.localファイルまたはjail.d/customization.localでカスタマイズを提供します。 #たとえば、すべてのJAILのデフォルトのbantimeを変更し、 # ssh-iptablesジェイルを有効にするには、次の(コメント解除された)ものが.localファイルに表示されます。 #詳細については、man 5 jail.confを参照してください。 # # [DEFAULT]

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

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

  1. sudo cp jail.conf jail.local

これで設定変更を開始できます。ファイルをviやお好みのテキストエディタで開いてください:

  1. sudo vi jail.local

ファイルをスクロールしている間に、このチュートリアルでは更新したいオプションをいくつか確認します。ファイルの先頭付近にある[DEFAULT]セクションの下にある設定は、Fail2banがサポートするすべてのサービスに適用されます。ファイルの他の場所には、[sshd]や他のサービスのヘッダーがあり、これにはデフォルトの設定を上書きするサービス固有の設定が含まれています。

/etc/fail2ban/jail.local
[DEFAULT]
. . .
bantime = 10m
. . .

bantimeパラメータは、クライアントが正しく認証できなかった場合にクライアントが禁止される期間を設定します。これは秒単位で測定されます。デフォルトでは、これは10分に設定されています。

/etc/fail2ban/jail.local
[DEFAULT]
. . .
findtime = 10m
maxretry = 5
. . .

次の2つのパラメータはfindtimemaxretryです。これらは、クライアントが不正なユーザーであると見なされ、禁止される条件を確立するために一緒に動作します。

maxretry変数は、findtimeで定義された時間枠内で何回クライアントが認証を試みるかを設定します。デフォルトの設定では、fail2banサービスは10分間に5回の認証失敗を試みたクライアントを禁止します。

/etc/fail2ban/jail.local
[DEFAULT]
. . .
destemail = root@localhost
sender = root@<fq-hostname>
mta = sendmail
. . .

Fail2banがアクションを起動した際にメールアラートを受信する必要がある場合は、destemailsendername、およびmtaの設定を評価する必要があります。 destemailパラメータは、禁止メッセージを受信するメールアドレスを設定します。 sendernameは、メールの「From」フィールドの値を設定します。 mtaパラメータは、メールを送信するために使用されるメールサービスを設定します。デフォルトでは、これはsendmailですが、Postfixや他のメールソリューションを使用したい場合があります。

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

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

上記の$(action_)に置き換えて使用できる他のaction_スクリプトがデフォルトで提供されています:

/etc/fail2ban/jail.local
…
# 禁止とwhoisレポートをdestemailにメール送信
action_mw = %(action_)s
            %(mta)s-whois[sender="%(sender)s", dest="%(destemail)s", protocol="%(protocol)s", chain="%(chain)s"]

# 禁止とwhoisレポート、および関連するログ行をdestemailにメール送信
# 送信先メールアドレスへ。 
action_mwl = %(action_)s
             %(mta)s-whois-lines[sender="%(sender)s", dest="%(destemail)s", logpath="%(logpath)s", chain="%(chain)s"]

# このアクションを使用するタイミングの重要な注意事項に関するaction.d/xarf-login-attackの重要な注意事項を参照してください
#
# 禁止とIPアドレスの濫用連絡先にxarfメールを送信し、関連するログ行をdestemailに含めます
# 送信先メールアドレスへ。 
action_xarf = %(action_)s
             xarf-login-attack[service=%(__name__)s, sender="%(sender)s", logpath="%(logpath)s", port="%(port)s"]

# CloudFlareでIPを禁止し、whoisレポートと関連するログ行をdestemailにメール送信
# 送信先メールアドレスへ。 
action_cf_mwl = cloudflare[cfuser="%(cfemail)s", cftoken="%(cfapikey)s"]
                %(mta)s-whois-lines[sender="%(sender)s", dest="%(destemail)s", logpath="%(logpath)s", chain="%(chain)s"]
…

たとえば、action_mw はアクションを実行してメールを送信し、action_mwl はアクションを実行し、メールを送信し、ログを含めます。そして、action_cf_mwl は上記すべてを行い、さらに、アカウントに関連付けられたCloudflare APIにも更新を送信して、そこでも加害者を禁止します。

個別の刑務所設定

次に、個々のサービスに関する設定ファイルの部分です。これらは、[sshd] のようなセクションヘッダーで指定されます。

これらのセクションのそれぞれは、ヘッダーの下に enabled = true の行を追加することで個別に有効にする必要があります。

/etc/fail2ban/jail.local
[jail_to_enable]
. . .
enabled = true
. . .

このチュートリアルでは、SSHの刑務所を有効にします。個別の刑務所設定の先頭にあるはずです。それ以外はデフォルトのパラメーターが機能しますが、[sshd] ヘッダーの下に enabled = true という設定行を追加する必要があります。

/etc/fail2ban/jail.local
#
# JAILS
#

#
# SSHサーバー
#

[sshd]

# より積極的なsshdモードを使用するには、jail.local内のfilterパラメーター "mode" を設定します:
# normal (デフォルト), ddos, extra または aggressive (すべてを組み合わせたもの)。
# 使用例と詳細については、"tests/files/logs/sshd" または "filter.d/sshd.conf" を参照してください。
#mode   = normal
enabled = true
port    = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s

ここで設定されている他の設定には、ログ内の行が認証の失敗を示すかどうかを決定するために使用されるfilterと、その特定のサービスのログが配置されている場所をfail2banに伝えるlogpathがあります。

filterの値は実際には/etc/fail2ban/filter.dディレクトリにあるファイルへの参照であり、その.conf拡張子が除かれています。これらのファイルには、ログ内の行が失敗した認証試行であるかどうかを決定する正規表現(テキスト解析のための一般的な短縮形)が含まれています。このガイドではこれらのファイルを詳細に説明しませんが、それらはかなり複雑であり、事前定義された設定が適切な行に一致しています。

ただし、そのディレクトリを調べることで利用可能なフィルタの種類を確認できます。

  1. ls /etc/fail2ban/filter.d

使用しているサービスに関連するように見えるファイルがある場合は、テキストエディタで開いてください。ほとんどのファイルにはかなりの数のコメントがあり、少なくともスクリプトが何の条件を守るために設計されたかを判断できるはずです。これらのフィルタのほとんどには、必要に応じてjail.localファイルで有効にできる適切な(無効になっている)セクションがjail.confファイルにあります。

たとえば、Nginxを使用してウェブサイトを提供しており、サイトのパスワードで保護された部分がログイン試行で負荷がかかっていることに気付いた場合、fail2banに/var/log/nginx/error.logファイル内のこの条件をチェックするためにnginx-http-auth.confファイルを使用するように指示できます。

実際には、/etc/fail2ban/jail.confファイルの[nginx-http-auth]セクションにすでに設定されています。単にenabledパラメーターを追加する必要があります:

/etc/fail2ban/jail.local
. . .
[nginx-http-auth]

enabled = true
. . .

編集が終了したら、ファイルを保存して閉じます。もしviを使用している場合は、:xを使用して保存して終了します。この時点で、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: disabled Active: active (running) since Mon 2022-06-27 19:25:15 UTC; 3s ago Docs: man:fail2ban(1) Main PID: 39396 (fail2ban-server) Tasks: 5 (limit: 1119) Memory: 12.9M CPU: 278ms CGroup: /system.slice/fail2ban.service └─39396 /usr/bin/python3.6 -s /usr/bin/fail2ban-server -xf start Jun 27 19:25:15 fail2ban22 systemd[1]: Started Fail2Ban Service. Jun 27 19:25:15 fail2ban22 fail2ban-server[39396]: Server ready

次のステップでは、Fail2banの動作を実証します。

ステップ 3 — バンポリシーのテスト(オプション)

今後Fail2banサーバーにログインする必要がない別のサーバーから、その2番目のサーバーを禁止するルールをテストできます。2番目のサーバーにログインした後、Fail2banサーバーにSSHで接続しようとしてみます。存在しない名前を使用して接続しようとしてください:

  1. ssh blah@your_server

パスワードプロンプトにランダムな文字を入力します。これを数回繰り返します。いつか、受け取っているエラーがPermission deniedからConnection refusedに変わるはずです。これは、2番目のサーバーがFail2banサーバーから禁止されていることを示します。

Fail2banサーバーで、fail2ban-clientの出力を確認することで、新しいルールが見えます。fail2ban-clientは、その実行構成を確認するためにFail2banが提供する追加のコマンドです。

  1. sudo fail2ban-client status
Output
Status |- Number of jail: 1 `- Jail list: sshd

fail2ban-client status sshdを実行すると、SSHから禁止されたIPのリストが表示されます:

  1. sudo fail2ban-client status sshd
Output
Status for the jail: sshd |- Filter | |- Currently failed: 2 | |- Total failed: 7 | `- Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd `- Actions |- Currently banned: 1 |- Total banned: 1 `- Banned IP list: 134.209.165.184

禁止されたIPリストの内容は、あなたの2番目のサーバーのIPアドレスを反映するはずです。

結論

これで、いくつかの禁止ポリシーをサービスに設定できるはずです。Fail2banは、認証を使用するあらゆる種類のサービスを保護する便利な方法です。fail2banの動作について詳しく知りたい場合は、fail2banのルールとファイルの動作に関する当社のチュートリアルを参照してください。

他のサービスを保護するためにfail2banを使用する方法の情報については、Fail2BanでNginxサーバーを保護する方法Fail2BanでApacheサーバーを保護する方法を読んでください。

Source:
https://www.digitalocean.com/community/tutorials/how-to-protect-ssh-with-fail2ban-on-rocky-linux-8