導入
SSHはクラウドサーバーに接続するための事実上の方法です。それは耐久性があり、拡張性があります。新しい暗号化基準が開発されると、それらを使用して新しいSSHキーを生成することができ、コアプロトコルが安全であることを保証します。ただし、どんなプロトコルやソフトウェアスタックも完全に万全ではなく、SSHがインターネット上で広く展開されているため、非常に予測可能な攻撃面または攻撃ベクトルを表しています。攻撃対象面または攻撃ベクトル。
ネットワークに公開されている任意のサービスは、このようにして潜在的な標的です。広く利用されているサーバー上で実行されているSSHサービスのログを確認すると、ユーザーやボットによる繰り返し、系統的なログイン試行がよく見られます。これらの攻撃が成功する可能性をほぼゼロに近づけるために、SSHキーを利用したパスワード認証の無効化など、SSHサービスにいくつかの最適化を行うことができますが、それでも小さな継続的なリスクをもたらす場合があります。。
大規模な本番展開において、この責任を完全に受け入れられない組織は、通常、外部インターネットからデフォルトのSSHポート22に直接接続することが不可能なように、WireGuardなどのVPNを実装します。これらのVPNソリューションは広く信頼されていますが、複雑さが増し、一部の自動化機能や他の小規模なソフトウェアフックを壊す可能性があります。
完全なVPNセットアップに踏み切る前または追加で、Fail2banというツールを導入することができます。Fail2banは、一定回数のログイン試行が失敗した後に特定のIPを禁止するファイアウォール構成を自動的に変更するルールを作成することで、総当たり攻撃を大幅に緩和することができます。これにより、サーバーはあなたの介入なしにこれらのアクセス試行に対して自己強化されます。
このガイドでは、Ubuntu 20.04サーバーにFail2banをインストールして使用する方法を説明します。
前提条件
このガイドを完了するには、次のものが必要です:
-
Ubuntu 20.04サーバーと、sudo特権を持つ非ルートユーザー。これらの特権を持つユーザーの設定方法については、当社のUbuntu 20.04の初期サーバーセットアップガイドをご覧ください。
-
オプションで、最初のサーバーに接続できる第二のサーバーがあると便利です。これは、意図的に禁止されることをテストするために使用します。
ステップ1 — Fail2banのインストール
Fail2banはUbuntuのソフトウェアリポジトリで利用できます。以下のコマンドを非ルートユーザーとして実行して、パッケージリストを更新し、Fail2banをインストールします:
Fail2banはインストール後にバックグラウンドサービスを自動的に設定します。ただし、いくつかのデフォルト設定が望ましくない効果を引き起こす可能性があるため、デフォルトで無効になっています。これを確認するには、systemctl
コマンドを使用します:
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行を表示してください:
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.conf
ファイルは、Fail2ban自体が更新されるたびに定期的に更新され、作成されたオーバーライドがないデフォルト設定のソースとして使用されます。
このチュートリアルでは、jail.local
を作成します。jail.conf
をコピーして行うことができます:
これで、構成変更を開始できます。ファイルを
ファイルをスクロールしている間に、このチュートリアルでは更新したいいくつかのオプションを検討します。ファイルの上部近くにある[DEFAULT]
セクションの下にある設定は、Fail2banでサポートされているすべてのサービスに適用されます。ファイルの他の場所には、[sshd]
や他のサービスのヘッダーがあり、デフォルトの上に適用されるサービス固有の設定が含まれています。
[DEFAULT]
. . .
bantime = 10m
. . .
bantime
パラメータは、クライアントが正しく認証できなかった場合にクライアントが禁止される時間の長さを設定します。これは秒単位で測定されます。デフォルトでは、これは10分に設定されています。
[DEFAULT]
. . .
findtime = 10m
maxretry = 5
. . .
次の2つのパラメータはfindtime
とmaxretry
です。これらは、クライアントが不正なユーザーであると判断され、禁止される条件を確立するために連携して機能します。
maxretry
変数は、findtime
によって定義された時間ウィンドウ内で認証を試行するクライアントの試行回数を設定します。デフォルト設定では、fail2banサービスは、10分のウィンドウ内に5回の失敗したログイン試行を行ったクライアントを禁止します。
[DEFAULT]
. . .
destemail = root@localhost
sender = root@<fq-hostname>
mta = sendmail
. . .
Fail2banがアクションを実行した際に電子メールアラートを受け取る必要がある場合は、destemail
、sendername
、およびmta
設定を評価する必要があります。destemail
パラメータは、禁止メッセージを受信する電子メールアドレスを設定します。sendername
は電子メールの「From」フィールドの値を設定します。mta
パラメータは、メールを送信するために使用されるメールサービスを設定します。デフォルトではこれはsendmail
ですが、Postfixまたは別のメールソリューションを使用することができます。
[DEFAULT]
. . .
action = $(action_)s
. . .
このパラメータは、Fail2banが禁止を実施する際のアクションを設定します。値action_
は、このパラメータの直前にファイルで定義されています。デフォルトのアクションは、禁止期間が経過するまでの間、攻撃元ホストからのトラフィックを拒否するためにファイアウォール構成を更新することです。
上記の$(action_)
に置き換えることができる他のデフォルトのaction_
スクリプトがあります。
…
# ban & 宛先メールにwhoisレポートを送信します。
action_mw = %(action_)s
%(mta)s-whois[sender="%(sender)s", dest="%(destemail)s", protocol="%(protocol)s", chain="%(chain)s"]
# ban & whoisレポートおよび関連するログ行を含む電子メールを送信します。
# 宛先メールに
action_mwl = %(action_)s
%(mta)s-whois-lines[sender="%(sender)s", dest="%(destemail)s", logpath="%(logpath)s", chain="%(chain)s"]
で重要なメモを確認してくださいd/xarf-login-attack。
#
# ban & xarf eメールをIPアドレスの濫用連絡先に送信し、関連するログ行を含めます。
# 宛先メールに
action_xarf = %(action_)s
xarf-login-attack[service=%(__name__)s, sender="%(sender)s", logpath="%(logpath)s", port="%(port)s"]
# ban IP on 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
行を追加することで個別に有効にする必要があります。
[jail_to_enable]
. . .
enabled = true
. . .
デフォルトでは、SSHサービスが有効になっており、他のすべてのサービスが無効になっています。
ここで設定されている他の設定には、ログの一行が認証失敗を示すかどうかを決定するfilter
と、その特定のサービスのログが格納されている場所をfail2banに伝えるlogpath
が含まれています。
filter
の値は実際には/etc/fail2ban/filter.d
ディレクトリにあるファイルへの参照であり、その.conf
拡張子が削除されています。これらのファイルには、ログの一行が認証失敗の試みであるかどうかを決定する正規表現(テキスト解析のための一般的な省略形)が含まれています。このガイドではこれらのファイルを詳しく説明しませんが、それらはかなり複雑で、定義済みの設定が適切な行に一致します。
ただし、そのディレクトリを見ることで利用可能なフィルタの種類を確認できます:
使用しているサービスに関連するように見えるファイルがある場合は、テキストエディタでそれを開く必要があります。ほとんどのファイルにはかなりのコメントが付いており、少なくともスクリプトがどのような種類の条件をガードするように設計されているかがわかるはずです。これらのフィルタのほとんどには、必要に応じてjail.local
ファイルで有効にできる適切な(無効になっている)セクションがjail.conf
ファイルにあります。
たとえば、Nginxを使用してウェブサイトを提供しているとしましょう。そして、サイトのパスワードで保護された部分がログイン試行で攻撃されていることに気付きました。fail2banに、/var/log/nginx/error.log
ファイル内でこの条件をチェックするように指示することができます。
これは実際には、/etc/fail2ban/jail.conf
ファイル内の[nginx-http-auth]
セクションにすでに設定されています。単にenabled
パラメータを追加するだけです:
. . .
[nginx-http-auth]
enabled = true
. . .
編集が完了したら、ファイルを保存して閉じます。この時点で、Fail2banサービスを有効にして、これから自動的に実行されるようにします。まず、systemctl enable
を実行します:
次に、最初の実行時に手動で開始します。systemctl start
を使用します:
実行状態を確認するには、systemctl status
を使用します:
Output● fail2ban.service - Fail2Ban Service
Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled; vendor preset: enab>
Active: active (running) since Tue 2022-06-28 19:29: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 28 19:29:15 fail2ban20 systemd[1]: Started Fail2Ban Service.
Jun 28 19:29:15 fail2ban20 fail2ban-server[39396]: Server ready
次のステップでは、Fail2banを実際に動作させます。
ステップ3 — バニングポリシーのテスト(オプション)
将来Fail2banサーバーにログインする必要のない別のサーバーから、その2番目のサーバーを禁止するルールをテストできます。2番目のサーバーにログインした後、Fail2banサーバーにSSHしようとしてみてください。存在しない名前を使用して接続を試みることができます。
パスワードプロンプトにランダムな文字を入力してください。これを数回繰り返します。いずれかの時点で、受け取っているエラーがPermission denied
からConnection refused
に変わるはずです。これは、2番目のサーバーがFail2banサーバーから禁止されたことを示しています。
Fail2banサーバーで、iptables
の出力を確認することで、新しいルールを確認できます。iptables
は、サーバー上の低レベルのポートとファイアウォールのルールとのやり取りのためのコマンドです。DigitalOceanの初期サーバーセットアップガイドに従っている場合、より高いレベルでファイアウォールのルールを管理するためにufw
を使用しているはずです。iptables -S
を実行すると、ufw
がすでに作成したすべてのファイアウォールルールが表示されます:
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によって追加されたルールが表示されます:
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
Fail2banによって追加されたREJECT --reject-with icmp-port-unreachable
を含む行には、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-20-04