CentOS7でFail2Banを使用してSSHを保護する方法
序章
SSHを介したサーバーへの接続は非常に安全ですが、SSHデーモン自体は、正しく機能するためにインターネットに公開する必要があるサービスです。 これには固有のリスクが伴い、加害者になる可能性のある人に攻撃のベクトルを提供します。
ネットワークに公開されているサービスはすべて、このように潜在的なターゲットになります。 これらのサービスのアプリケーションログに注意を払うと、ユーザーとボットによるブルートフォース攻撃を表す、体系的なログイン試行が繰り返されることがよくあります。
Fail2ban と呼ばれるサービスは、事前定義された失敗したログイン試行回数に基づいてiptablesファイアウォール構成を自動的に変更するルールを作成することにより、この問題を軽減できます。 これにより、サーバーはユーザーの介入なしに不正なアクセスの試みに応答できるようになります。
このガイドでは、CentOS7サーバーにFail2banをインストールして使用する方法について説明します。
CentOS7にFail2banをインストールする
Fail2banは公式のCentOSパッケージリポジトリでは利用できませんが、EPELプロジェクト用にパッケージ化されています。 エンタープライズLinux用のExtraPackagesの略であるEPELは、CentOSからが入手可能なリリースパッケージとともにインストールできます。
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
再度、続行するように求められたら、yおよびEnterを押します。
インストールが完了したら、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/
のファイルを使用して、これらの両方のファイルの設定を上書きできます。 ファイルは次の順序で適用されます。
/etc/fail2ban/jail.conf
/etc/fail2ban/jail.d/*.conf
、アルファベット順/etc/fail2ban/jail.local
/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つのパラメーターは、findtime
とmaxretry
です。 これらは連携して、クライアントが禁止されるべき条件を確立します。
maxretry
変数は、クライアントが禁止される前にfindtime
で定義された時間枠内に認証する必要がある試行回数を設定します。 デフォルト設定では、Fail2banは、10分以内に3回ログインに失敗したクライアントを禁止します。
destemail = root@localhost sendername = Fail2Ban mta = sendmail
電子メールアラートを構成する場合は、destemail
、sendername
、およびmta
の設定を上書きする必要がある場合があります。 destemail
パラメーターは、禁止メッセージを受信する必要がある電子メールアドレスを設定します。 sendername
は、電子メールの「差出人」フィールドの値を設定します。 mta
パラメーターは、メールの送信に使用されるメールサービスを構成します。
action = $(action_)s
このパラメーターは、Fail2banが禁止を開始するときに実行するアクションを構成します。 値action_
は、このパラメーターの直前のファイルで定義されています。 デフォルトのアクションは、禁止時間が経過するまで、問題のあるホストからのトラフィックを拒否するようにファイアウォールを構成することです。
電子メールアラートを設定する場合は、この値をaction_
からaction_mw
に上書きできます。 電子メールに関連するログ行を含める場合は、action_mwl
に変更できます。 メールアラートを使用する場合は、適切なメール設定が構成されていることを確認する必要があります。
個々の刑務所の設定
[DEFAULT]
の後に、さまざまなサービス用に個々の刑務所を構成するセクションがあります。 これらには通常、禁止されるport
と、悪意のあるアクセスの試みを監視するためのlogpath
が含まれます。 たとえば、jail.local
ですでに有効にしたSSHjailには、次の設定があります。
/etc/fail2ban/jail.local
[sshd] port = ssh logpath = %(sshd_log)s
この場合、ssh
は標準SSHポートの事前定義された変数であり、%(sshd_log)s
はFail2banの標準構成の他の場所で定義された値を使用します(これにより、jail.conf
の移植性が維持されます。異なるオペレーティングシステム)。
発生する可能性のあるもう1つの設定は、ログの行が認証の失敗を示しているかどうかを判断するために使用される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
または個々の刑務所の全体的なステータスを照会します。
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の仕組みについて詳しく知りたい場合は、fail2banのルールとファイルの仕組みに関するチュートリアルを確認してください。