Ubuntu 22.04でFail2Banを使用してSSHを保護する方法

導入

SSHはクラウドサーバーに接続するための事実上の方法です。それは耐久性があり、拡張性があります。新しい暗号化基準が開発されると、それらを使用して新しいSSHキーを生成することができ、基本プロトコルが安全であることを保証します。ただし、どんなプロトコルやソフトウェアスタックも完全に万全であるわけではなく、SSHがインターネット全体に広く展開されているため、非常に予測可能な攻撃手段や攻撃ベクトルを表します。攻撃対象または攻撃ベクトル

ネットワークに公開されている任意のサービスは、このような方法で潜在的な標的です。広く使用されているサーバーで実行されているSSHサービスのログを確認すると、ユーザーやボットによる繰り返しのシステマティックなログイン試行が頻繁に見られます。これらの攻撃が成功する可能性をほぼゼロに近づけるためにSSHキーを利用したパスワード認証を無効にするなど、SSHサービスを最適化することができますが、それでも軽微ながら継続的なリスクをもたらす場合があります。

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

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

このガイドでは、Ubuntu 22.04サーバーにFail2banをインストールして使用する方法を紹介します。

前提条件

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

  • Ubuntu 22.04サーバーとsudo特権を持つ非rootユーザー。これらの特権を持つユーザーの設定方法については、当社のUbuntu 22.04での初期サーバーセットアップガイドを参照してください。

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

ステップ1 — Fail2banのインストール

Fail2banはUbuntuのソフトウェアリポジトリで利用可能です。以下のコマンドを非ルートユーザーとして実行して、パッケージリストを更新し、Fail2banをインストールします:

  1. sudo apt update
  2. sudo apt install fail2ban

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

  1. systemctl status fail2ban.service
Output
○ fail2ban.service - Fail2Ban Service Loaded: loaded (/lib/systemd/system/fail2ban.service; disabled; vendor preset: enabled 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/customisation.localに提供してください。 # たとえば、すべてのJAILのデフォルトのBantimeを変更し、 # ssh-iptablesジェイルを有効にするには、次の(コメント解除された)内容が.localファイルに表示されます。 # 詳細については、man 5 jail.confを参照してください。 # # [DEFAULT]

ファイルの最初の数行はコメントアウトされています – これは、設定としてではなくドキュメントとして読むことを示す#文字で始まります。また、これらのコメントは、このファイルを直接変更しないでくださいと指示しています。代わりに、2つのオプションがあります。Fail2banの個々のプロファイルをjail.d/ディレクトリ内の複数のファイルに作成するか、ローカル設定をjail.localファイルに作成して収集します。

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

  1. sudo cp jail.conf jail.local

これで設定変更を開始できます。お好みのテキストエディターでファイルを開きます:nanoを使用するか、好きなテキストエディターを使用してください。

  1. sudo nano 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
…
#ban&amp; whoisレポートをdestemailに送信します。
action_mw = %(action_)s
            %(mta)s-whois[sender="%(sender)s", dest="%(destemail)s", protocol="%(protocol)s", chain="%(chain)s"]

#ban&amp; whoisレポートと関連するログ行を含むメールを送信します。
#宛先メールに
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を参照してください。
#
#ban&amp; xarfメールをIPアドレスの乱用連絡先に送信し、関連するログ行を含めます。
#宛先メールに
action_xarf = %(action_)s
             xarf-login-attack[service=%(__name__)s, sender="%(sender)s", logpath="%(logpath)s", port="%(port)s"]

#IPをCloudFlareで禁止し、whoisレポートと関連するログ行を送信します。
#宛先メールに
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サービスが有効になっており、他のすべてのサービスが無効になっています。

ここで設定されているその他の設定には、ログの一行が認証失敗を示すかどうかを決定するために使用される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
. . .

編集が完了したら、ファイルを保存して閉じます。この時点で、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: enab> 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 /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サーバーで、iptablesの出力を確認することで、新しいルールが見えます。iptablesは、サーバーの低レベルのポートとファイアウォールのルールとやり取りするためのコマンドです。 DigitalOceanの初期サーバー設定ガイドに従っている場合、より高いレベルでファイアウォールルールを管理するためにufwを使用しています。 iptables -Sを実行すると、ufwがすでに作成したすべてのファイアウォールルールが表示されます:

  1. sudo iptables -S
Output
-P INPUT DROP -P FORWARD DROP -P OUTPUT ACCEPT -N f2b-sshd -N ufw-after-forward -N ufw-after-input -N ufw-after-logging-forward -N ufw-after-logging-input -N ufw-after-logging-output -N ufw-after-output -N ufw-before-forward -N ufw-before-input -N ufw-before-logging-forward -N ufw-before-logging-input -N ufw-before-logging-output …

iptables -Sの出力をgrepにパイプ処理して、そのルール内でf2bの文字列を検索すると、Fail2banによって追加されたルールが表示されます:

  1. sudo iptables -S | grep f2b
Output
-N f2b-sshd -A INPUT -p tcp -m multiport --dports 22 -j f2b-sshd -A f2b-sshd -s 134.209.165.184/32 -j REJECT --reject-with icmp-port-unreachable -A f2b-sshd -j RETURN

REJECT --reject-with icmp-port-unreachableを含む行はFail2banによって追加され、2番目のサーバーのIPアドレスを反映するはずです。

結論

あなたは今、サービスのバンポリシーを設定できるはずです。Fail2banは、認証を使用するあらゆる種類のサービスを保護するための便利な方法です。Fail2banがどのように機能するかについて詳しく知りたい場合は、fail2banのルールとファイルの動作に関する当社のチュートリアルをご覧ください。

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

Source:
https://www.digitalocean.com/community/tutorials/how-to-protect-ssh-with-fail2ban-on-ubuntu-22-04