CentOS 7でFail2Banを使用してSSHを保護する方法

前書き

SSH経由でサーバーに接続することは非常に安全ですが、SSHデーモン自体はインターネットに公開されて正しく機能する必要があるサービスです。 これにはいくつかの固有のリスクが伴い、加害者になる可能性のある攻撃者に攻撃のベクトルを提供します。

この方法では、ネットワークに公開されるサービスは潜在的なターゲットです。 これらのサービスのアプリケーションログに注意を払うと、ユーザーとボットによるブルートフォース攻撃を表す、繰り返し行われる体系的なログイン試行が頻繁に見られます。

Fail2banと呼ばれるサービスは、事前定義された失敗したログイン試行回数に基づいてiptablesファイアウォール構成を自動的に変更するルールを作成することにより、この問題を軽減できます。 これにより、サーバーはユーザーの介入なしに不正なアクセス試行に応答できます。

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

CentOS 7にFail2banをインストールします

Fail2banは公式のCentOSパッケージリポジトリでは利用できませんが、EPEL project用にパッケージ化されています。 エンタープライズLinux用の追加パッケージの略であるEPELは、CentOSから入手可能なisのリリースパッケージとともにインストールできます。

sudo yum install epel-release

続行するように求められます。yを押してからEnterを押します。

yum promptTransaction Summary
============================================================================
Install  1 Package

Total download size: 14 k
Installed size: 24 k
Is this ok [y/d/N]: y

これで、fail2banパッケージをインストールできるようになります。

sudo yum install fail2ban

再度、続行するように求められたら、yEnterを押します。

インストールが完了したら、systemctlを使用してfail2banサービスを有効にします。

sudo systemctl enable fail2ban

ローカル設定を構成する

Fail2banサービスは、構成ファイルを/etc/fail2banディレクトリに保持します。 そこで、jail.confと呼ばれるデフォルト値のファイルを見つけることができます。 このファイルはパッケージのアップグレードによって上書きされる可能性があるため、その場で編集しないでください。 代わりに、jail.localという新しいファイルを作成します。 jail.localで定義された値は、jail.confの値をオーバーライドします。

jail.confには、[DEFAULT]セクションが含まれ、その後に個々のサービスのセクションが続きます。 jail.localは、これらの値のいずれかをオーバーライドできます。 さらに、/etc/fail2ban/jail.d/のファイルを使用して、これら両方のファイルの設定を上書きできます。 ファイルは次の順序で適用されます。

  1. /etc/fail2ban/jail.conf

  2. /etc/fail2ban/jail.d/*.conf、アルファベット順

  3. /etc/fail2ban/jail.local

  4. /etc/fail2ban/jail.d/*.local、アルファベット順

すべてのファイルには、最初に実行される[DEFAULT]セクションが含まれる場合があり、個々のjailのセクションも含まれる場合があります。 特定のパラメーターに設定された最後のvavalueが優先されます。

jail.localの非常に単純なバージョンを作成することから始めましょう。 nano(または選択したエディター)を使用して新しいファイルを開きます。

sudo nano /etc/fail2ban/jail.local

以下を貼り付けます。

/etc/fail2ban/jail.local

[DEFAULT]
# Ban hosts for one hour:
bantime = 3600

# Override /etc/fail2ban/jail.d/00-firewalld.conf:
banaction = iptables-multiport

[sshd]
enabled = true

これにより、3つの設定が上書きされます。すべてのサービスに新しいデフォルトのbantimeを設定し、ファイアウォール構成にiptablesを使用していることを確認し、sshdのジェイルを有効にします。

新しいファイルを終了して保存します(nanoで、Ctrl-Xを押して終了し、yを押して保存し、Enterを押してファイル名を確認します)。 これで、systemctlを使用してfail2banサービスを再起動できます。

sudo systemctl restart fail2ban

systemctlコマンドは出力なしで終了するはずです。 サービスが実行されていることを確認するために、fail2ban-clientを使用できます。

sudo fail2ban-client status
OutputStatus
|- Number of jail:      1
`- Jail list:   sshd

特定の刑務所に関するより詳細な情報を取得することもできます。

sudo fail2ban-client status sshd

利用可能な設定を調べる

上で定義したjail.localのバージョンは良いスタートですが、他の多くの設定を調整することもできます。 jail.confを開き、デフォルトのいくつかを調べます。 これらの値のいずれかを変更する場合は、その場で変更するのではなく、jail.localの適切なセクションにコピーして、そこで調整する必要があることに注意してください。

sudo nano /etc/fail2ban/jail.conf

すべての刑務所のデフォルト設定

まず、[DEFAULT]セクションをスクロールします。

ignoreip = 127.0.0.1/8

ignoreipパラメータに値を追加することにより、Fail2banが無視する送信元アドレスを調整できます。 現在、ローカルマシンからのトラフィックを禁止しないように構成されています。 スペースで区切ってパラメーターの末尾に追加することにより、無視する追加のアドレスを含めることができます。

bantime = 600

bantimeパラメータは、クライアントが正しく認証に失敗したときにクライアントが禁止される時間の長さを設定します。 これは秒単位で測定されます。 デフォルトでは、これは600秒または10分に設定されています。

findtime = 600
maxretry = 3

注意したい次の2つのパラメーターは、findtimemaxretryです。 これらは連携して、クライアントを禁止する条件を確立します。

maxretry変数は、クライアントが禁止される前に、findtimeで定義された時間枠内に認証する必要がある試行回数を設定します。 デフォルト設定では、Fail2banは、10分間に3回ログインに失敗したクライアントを禁止します。

destemail = root@localhost
sendername = Fail2Ban
mta = sendmail

電子メールアラートを構成する場合は、destemailsendername、およびmtaの設定を上書きする必要がある場合があります。 destemailパラメータは、禁止メッセージを受信する必要がある電子メールアドレスを設定します。 sendernameは、電子メールの「差出人」フィールドの値を設定します。 mtaパラメータは、メールの送信に使用されるメールサービスを設定します。

action = $(action_)s

このパラメーターは、Fail2banが禁止を開始するときに実行するアクションを構成します。 値action_は、このパラメーターの直前のファイルで定義されています。 デフォルトのアクションでは、禁止時間が経過するまで、違反ホストからのトラフィックを拒否するようにファイアウォールを設定するだけです。

電子メールアラートを設定する場合は、この値をaction_からaction_mwに上書きできます。 電子メールに関連するログ行を含める場合は、action_mwlに変更できます。 メールアラートを使用する場合は、適切なメール設定が構成されていることを確認する必要があります。

個々の刑務所の設定

[DEFAULT]の後に、さまざまなサービスの個々の刑務所を構成するセクションが表示されます。 これらには通常、禁止されるportと、悪意のあるアクセスの試行を監視するlogpathが含まれます。 たとえば、jail.localですでに有効にしたSSHジェイルには、次の設定があります。

/etc/fail2ban/jail.local

[sshd]

port    = ssh
logpath = %(sshd_log)s

この場合、sshは標準SSHポートの事前定義された変数であり、%(sshd_log)sはFail2banの標準構成の他の場所で定義された値を使用します(これにより、jail.confを異なるオペレーティングシステム間で移植可能に保つことができます)。

発生する可能性のある別の設定は、ログの行が認証の失敗を示しているかどうかを判断するために使用されるfilterです。

filter値は、実際には/etc/fail2ban/filter.dディレクトリにあるファイルへの参照であり、その.conf拡張子は削除されています。 このファイルには、ログの行が不良かどうかを判断する正規表現が含まれています。 このファイルはかなり複雑で、定義済みの設定が適切な行によく一致するため、このガイドではこのファイルについて詳しく説明しません。

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

ls /etc/fail2ban/filter.d

使用しているサービスに関連していると思われるファイルが表示された場合は、テキストエディターで開く必要があります。 ほとんどのファイルにはかなりのコメントが付けられており、スクリプトが保護するために設計された条件のタイプを伝えることができるはずです。 これらのフィルターのほとんどには、jail.confに適切な(無効な)セクションがあり、必要に応じてjail.localで有効にできます。

たとえば、Nginxを使用してWebサイトにサービスを提供していると想定し、パスワードで保護されたサイトの一部がログイン試行で非難されていることを認識します。 Fail2banにnginx-http-auth.confファイルを使用して、/var/log/nginx/error.logファイル内のこの状態をチェックするように指示できます。

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

/etc/fail2ban/jail.local

[DEFAULT]
# Ban hosts for one hour:
bantime = 3600

# Override /etc/fail2ban/jail.d/00-firewalld.conf:
banaction = iptables-multiport

[sshd]
enabled = true

[nginx-http-auth]
enabled = true

そして、fail2banサービスを再起動します。

sudo systemctl restart fail2ban

Fail2banログとファイアウォール構成の監視

Fail2banなどのサービスが意図したとおりに機能していることを知っておくことが重要です。 systemctlを使用して、サービスのステータスを確認することから始めます。

sudo systemctl status fail2ban

ここで何かがおかしいと思われる場合は、最後の起動以降のfail2banユニットのログを確認してトラブルシューティングを行うことができます。

sudo journalctl -b -u fail2ban

次に、fail2ban-clientを使用して、fail2ban-serverまたは個々のjailの全体的なステータスを照会します。

sudo fail2ban-client status
sudo fail2ban-client status jail_name

最近のアクションの記録については、Fail2banのログをたどってください(終了するにはCtrl-Cを押してください)。

sudo tail -F /var/log/fail2ban.log

iptablesに設定されている現在のルールをリストします。

sudo iptables -L

各ルールを有効にするために必要なコマンドを反映する形式でiptablesルールを表示します。

sudo iptables -S

結論

これで、サービスの基本的な禁止ポリシーを構成できるようになります。 Fail2banのセットアップは非常に簡単で、認証を使用するあらゆる種類のサービスを保護する優れた方法です。

Fail2banの仕組みについて詳しく知りたい場合は、how fail2ban rules and files workに関するチュートリアルを確認してください。

Related