CentOS 7でFail2Banを使ってSSHを保護する方法
CentOS 7を使用していませんか?別のバージョンまたはディストリビューションを選択してください。
紹介
SSHを通じてサーバーに接続することは非常に安全ですが、SSHデーモン自体は正常に機能するためにインターネットに公開しなければならないサービスです。これにはいくつかの固有のリスクが伴い、攻撃者にとって攻撃のベクトルを提供します。
ネットワークに公開されているサービスは、この点で潜在的な標的です。これらのサービスのアプリケーションログに注意を払うと、ユーザーやボットによるブルートフォース攻撃を示す反復的かつ体系的なログイン試行がしばしば見られます。
Fail2banと呼ばれるサービスは、事前に定義した不正ログイン試行回数に基づいて、iptablesファイアウォールの設定を自動的に変更するルールを作成することで、この問題を軽減できます。これにより、あなたの介入なしにサーバーが不正なアクセス試行に対応できるようになります。
このガイドでは、CentOS 7 サーバーに Fail2ban をインストールして使用する方法について説明します。
CentOS 7にFail2banをインストールする
Fail2banは公式のCentOSパッケージリポジトリには存在しませんが、EPELプロジェクト用にパッケージ化されています。EPELは、Enterprise Linux用のExtra Packagesを意味し、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/ 内のファイルを使用して、これら2つのファイルの設定を上書きすることができます。 ファイルは以下の順序で適用されます:
/etc/fail2ban/jail.d/*.conf、アルファベット順/etc/fail2ban/jail.d/*.local、アルファベット順
/etc/fail2ban/jail.conf/etc/fail2ban/jail.local任意のファイルには最初に実行される[DEFAULT]セクションが含まれる場合があり、個々の監獄用のセクションも含まれている可能性があります。特定のパラメータに対して設定された最後の値が優先されます。
まず、非常にシンプルなバージョンのjail.localを書くことから始めましょう。nano(またはお好きなエディタ)を使って新しいファイルを開いてください:
- sudo nano /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
Status
|- 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
Fail2banが無視するソースアドレスを調整するには、ignoreipパラメータに値を追加します。 現在、ローカルマシンからのトラフィックを禁止しないように設定されています。 無視する追加のアドレスをパラメータの末尾に空白で区切って追加することができます。
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は、メールの「From」フィールドの値を設定します。mtaパラメータは、メールを送信するために使用するメールサービスを設定します。
action = $(action_)s
このパラメータは、Fail2banが禁止を施行したいときに取るアクションを設定します。値action_は、このパラメータの少し前にあるファイルで定義されています。デフォルトのアクションは、禁止時間が経過するまで、問題のあるホストからのトラフィックを拒否するようにファイアウォールを単に設定することです。
メールアラートを設定したい場合は、この値をaction_からaction_mwに上書きすることができます。関連するログ行を含むメールを希望する場合は、action_mwlに変更できます。メールアラートを使用する場合は、適切なメール設定が構成されていることを確認してください。
個別の刑務所の設定
[DEFAULT]の後に、異なるサービスのために個々の監獄を構成するセクションに遭遇します。これには通常、禁止されるportと、悪意のあるアクセス試行を監視するためのlogpathが含まれます。例えば、jail.localで既に有効にしたSSH監獄は、次の設定が含まれています。
[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を使用してウェブサイトを運営していると仮定し、サイトのパスワード保護された部分にログイン試行が殺到していることに気付いたとしましょう。この状態を確認するために、Fail2banにnginx-http-auth.confファイルを使用し、/var/log/nginx/error.logファイル内で確認するように指示できます。
これは実際には、私たちの/etc/fail2ban/jail.confファイルの[nginx-http-auth]というセクションにすでに設定されています。jail.localにnginx-http-authの監獄のためのenabledパラメータを追加する必要があります:
[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のルールとファイルの仕組みについてのチュートリアルをご覧ください。
