Debian 11でFail2Banを使用してSSHを保護する方法

紹介

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

ネットワークに露出しているサービスは、このような潜在的な標的です。広く利用されているサーバー上で実行されているSSHサービスのログを確認すると、ユーザーとボットの両方による継続的なブルートフォース攻撃を示す繰り返しのログイン試行が頻繁に見られます。これらの攻撃がほぼゼロに近い確率で成功する可能性を減らすためにSSHサービスにいくつかの最適化を行うことはできますが、SSHキーを利用したパスワード認証の無効化など、それでも小さな持続的な負債を引き起こす可能性があります。

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

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

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

前提条件

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

  • Debian 11サーバーと、sudo権限を持つ非ルートユーザー。これらの特権を持つユーザーの設定方法については、当社のDebian 11の初期サーバー設定ガイドを参照してください。

  • 任意で、意図的に禁止されるように設定された最初のサーバーに接続できる第二のサーバー。これは、テストに使用します。

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

Fail2banはDebianのソフトウェアリポジトリで利用可能です。パッケージリストを更新し、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; enabled; vendor preset: enabled Active: active (running) since Tue 2022-06-28 16:23:14 UTC; 17s ago Docs: man:fail2ban(1) Process: 1942 ExecStartPre=/bin/mkdir -p /run/fail2ban (code=exited, status=0/SUCCESS Main PID: 1943 (fail2ban-server) Tasks: 5 (limit: 1132) Memory: 15.8M CPU: 280ms CGroup: /system.slice/fail2ban.service └─1943 /usr/bin/python3 /usr/bin/fail2ban-server -xf start

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 JAILを有効にするには、次の(コメントを外した)内容が.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

これで構成変更を開始できます。お好みのテキストエディターでファイルを開きます(たとえば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
…
# 禁止と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アドレスのabuse連絡先にxarf電子メールを送信し、関連するログ行を含めてdestemailに禁止

action_xarf = %(action_)s
             xarf-login-attack[service=%(__name__)s, sender="%(sender)s", logpath="%(logpath)s", port="%(port)s"]

# 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サービスが有効になっており、他のすべてのサービスは無効になっています。

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

編集が完了したら、ファイルを保存して閉じます。変更を加えた場合は、systemctl を使用して Fail2ban サービスを再起動できます:

  1. sudo systemctl restart fail2ban

次のステップでは、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 を使用する方法に関する情報については、Fail2Ban を使用して Nginx サーバーを保護する方法Fail2Ban を使用して Apache サーバーを保護する方法を読んでください。

Source:
https://www.digitalocean.com/community/tutorials/how-to-protect-ssh-with-fail2ban-on-debian-11