Fail2BanでSSHを安全にする方法

サーバーをブルートフォース攻撃から保護することは必須です。問題は、具体的にどのようにするかですか?幸運なことに、Fail2Banはサーバーを保護するためにすぐそこにありますが、Fail2Banのデフォルトの設定は最適なセキュリティのために微調整が必要です。心配しないでください、このチュートリアルでカバーされています。

このチュートリアルでは、Fail2Banを設定し、SSHサーバーを保護することでブルートフォース攻撃から防御する方法を学びます。

準備はいいですか?SSHサーバーのセキュリティを最適化するために読み続けましょう!

前提条件

このチュートリアルは、ステップバイステップの手順で構成されています。一緒に進めるようにするために、以下の準備が整っていることを確認してください。

  • UbuntuとDebianのサーバー – このチュートリアルでは、Fail2Banを設定するためにUbuntu 18.04 LTSを実行しているサーバーと、Fail2Banの禁止設定をテストするためのDebian 10のサーバーを使用します。

ベースファイアウォールの設定

Fail2Banはログを監視し、一定の時間枠内にログイン試行が多すぎるIPアドレスをブロックすることで、サーバーを保護します。ただし、まず、悪意のある行為をサーバーでブロックするためのルールを追加できるベースファイアウォールを設定します。

1.まず、構成ファイルを変更するときにFail2Ban (fail2ban stop)を実行して停止するため、以下のserviceコマンドを実行します。変更をテストして正常に動作することを確認できるように、変更を加えるときにFail2Banを停止します。

sudo service fail2ban stop
Stopping the fail2ban service

2. apt installコマンドを実行してSendmail IPTables-persistentをインストールします。SendmailはFail2BanがIPアドレスをブロックするときに通知するために使用されるプログラムです。IPTables-persistentは、変更された構成設定を/etc/sysconfig/iptablesファイルに保存するプログラムです。

これらのプログラムをインストールしておくと、停電などの予期しない事態が発生しても、ファイアウォールの設定が保持されます。

sudo apt install sendmail iptables-persistent -y

以下の各iptablesコマンドを実行して、ファイアウォールを設定します。これらのコマンドは出力は生成しませんが、ファイアウォールに4つのルールが追加されます。これらのルールは、サーバへの接続を許可またはブロックします。

## 最初のルール - サーバーによって生成されたトラフィック(loインターフェース)を許可
sudo iptables -A INPUT -i lo -j ACCEPT
## 2番目のルール - 関連または関連する接続の一部であるすべてのトラフィックを許可
## 3番目のルール - ポート22でのSSHトラフィックを許可
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
## 4番目のルール - その他のすべてのトラフィックをドロップ
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

sudo iptables -A INPUT -j DROP
Adding four rules to your firewall

4. 以下のiptablesコマンドを実行して、ファイアウォールに設定を要約した内容を表示します。

sudo iptables -S

以下に、ファイアウォールに追加されたルールがハイライト表示されています。

Checking your firewall rules

5. 次に、以下のコマンドを実行して、ルールを/etc/sysconfig/iptables-configファイルに保存し、Fail2Banサービスを開始します。iptables-configファイルにはすべての永続的なファイアウォールルールが格納されています。

Fail2Banは自動的にいくつかのルールをファイアウォールに追加し、サーバーを保護します。

sudo dpkg-reconfigure iptables-persistent
sudo service fail2ban start

6. 最後に、以下のiptablesコマンドを再実行して、ファイアウォールルールを表示します。

sudo iptables -S

以下に、Fail2Banがファイアウォールに追加した新しいルールが赤でハイライト表示されています。

Previewing your firewall rules

ローカルのFail2Ban設定の調整

今、基本的なファイアウォールが稼働しているので、サーバーのセキュリティをさらに強化するために、ローカルのFail2Ban設定ファイルを調整する時が来ました。このチュートリアルでは、/etc/fail2ban/jail.conf構成ファイルを使用します。なぜなら、Fail2Banアプリケーションのグローバル設定を構成するために必要なオプションがすべて含まれているからです。

おそらく、SSHサーバーのためにカスタムルールを作成したい場合は、新しいjail.localファイル(jail.confファイルをベースに)を作成し、SSH固有のルールをjail.localファイルに配置します。これにより、サーバーのjail.confファイルで設定を上書きできます。

1. 以下のawkコマンドを実行して、次の操作を行います:

  • /etc/fail2ban/jail.confファイルの内容('{ printf "# "; print; }')を出力します。
  • jail.confファイルをベースにしたjail.localという名前のファイルを作成し、jail.confファイルのデフォルト設定を上書きできるようにします。
  • /etc/fail2ban/jail.confファイルの内容をteeコマンドにパイプします。これにより、jail.confファイルの内容がローカルファイルシステム(/etc/fail2ban/jail.local)に書き込まれます。
awk '{ printf "# "; print; }' /etc/fail2ban/jail.conf | sudo tee /etc/fail2ban/jail.local
Creating the jail.local file

2. jail.localファイルを作成したら、以下のlsコマンドを実行します。このコマンドは、サーバーのFail2Banディレクトリ(/etc/fail2ban)の内容をリストアップして、jail.localファイルが正しく生成されたことを確認します。

ls /etc/fail2ban

新しいjail.localファイルが表示されれば、ローカルファイルが正しく生成されています。

Checking the newly created local file (jail.local)

3. 好みのテキストエディタで/etc/fail2ban/jail.localファイルを開き、[ssh]セクションに移動します。

オプションの前にある#記号を削除して、[sshd]enabledオプションのコメントを解除し、SSHを有効にします。

このポイントからチュートリアルの残りの部分まで、セクションまたはオプションの前の#記号を削除して、それらを有効にします。

Enabling the [ssh] section

4. 下にスクロールし、以下に示す[DEFAULT]セクションのコメントを解除します。このセクションは、Fail2Banのデフォルト設定を構成する場所です。このセクションの設定は、Fail2Banが管理するすべてのjailに適用されます。

Uncommenting the [DEFAULT] option

5. 次に、bantimeセクションにスクロールし、bantime60分に設定します。 bantimeオプションは、失敗したログイン試行後にIPアドレスが禁止される時間(分単位)を設定します。

デフォルトのバンタイム設定は600秒(10分)です。この設定を好みに合わせて調整できますが、バンタイム設定が低いほどサーバーの負荷が増加します。

Setting a ban duration

6. findtimemaxretry オプションに移動します。 findtime はそのまま(10m)にして、 maxretry3 に減らします。

findtime オプションは、IPアドレスがログインに失敗してバンされるまでの時間(分単位)を設定します。一方、maxretry オプションは、IPアドレスがログインに失敗する回数を設定します。

デフォルトの findtime 設定は10分で、maxretry は5分です。したがって、10分間に5回ログインに失敗したIPアドレスはバンされます。

Setting a Window Time for an IP Address to Login Before Getting Banned

7. スクロールして、destemailsender、およびmta オプションのコメントを外し、設定します。

  • destemail – Fail2Banが通知を送信する電子メールアドレスを入力します。
  • sender – Fail2Banが destemail に送信する電子メールの「From」フィールドを設定します。
  • mta – デフォルト値(sendmail)のままにします。 mta オプションは、Fail2Banが通知を送信するために使用する電子メール配信エージェントを設定します。
Configuring destemail, sender, and mta options

8. 以下に示すように、アクションオプションに移動し、action_mwlオプションのコメントを外してください。これにより、Fail2Banはログウォッチのメールを送信できます。サーバー上の潜在的なセキュリティの問題を詳細に調査するためにログウォッチのメールを確認できます。

変更内容を保存してテキストエディタから終了してください。

Enabling Logwatch Emails

9. 以下のコマンドを実行して、fail2banサービスを再起動してください。

sudo service fail2ban stop
sudo service fail2ban start

10. 最後に、以下のコマンドを実行してfail2banサービスのstatusを確認してください。sudo service fail2ban status Fail2Banサービスが動作している場合、以下のような出力が表示されます。

sudo service fail2ban status

Fail2Banサービスが動作している場合、以下のような出力が表示されます。

Checking the Fail2Ban Service Status

禁止の設定をテストする

Fail2Banを設定したので、実際に禁止の設定が機能するかテストする時間です。セカンダリサーバーからFail2Banサーバーに対して複数の失敗したSSHログインを試み、そのセカンダリサーバーが禁止されるかどうかを確認してください。

1. セカンダリサーバー(Debian)にログインし、以下のコマンドを実行してFail2BanサーバーにSSHできるか確認してください。

このデモでは、IPが134.122.20.103のDebian 10サーバーを使用して、IPが69.28.83.134のfail2banサーバーにsshするものです。

2. プロンプトが表示されたらランダムなパスワードを入力し、Enterキーを押してください。

最初の試行で、Fail2BanサーバーはSSHログイン試行を停止し、以下のようにPermission deniedメッセージを表示します。2回または3回ほどSSHログインを繰り返すと、Fail2Banサーバーは最終的にSSHログイン試行に応答しなくなります。

この時点ではもうPermission deniedメッセージは表示されず、空白の画面が表示されます。空白の画面が表示されると、2番目のサーバー(Debian)がFail2Banサーバーから禁止されていることを示します。

Testing if a server gets banned from Fail2Ban server after several failed logins

しかし、おそらくすでにFail2BanサーバーからブロックするIPアドレスのリストを持っているかもしれません。その場合は、jail.localファイルを開き、[DEFAULT]セクションに移動します。ignoreipオプションのコメントを外し、ブロックするIPアドレスを設定します。次に示すように。

アドレスは複数の別々のIPv4またはIPv6エントリ、またはコンマで区切って指定できます。

Setting IP Addresses to Block from Fail2Ban Server

3. Fail2Banサーバー(Ubuntu)で以下のiptablesコマンドを再実行してファイアウォールのルールを表示します。

sudo iptables -S

以下に注意してください。新しいルールがあることがわかります。このルールは134.122.20.103 IPアドレスからのSSHログイン試行を拒否します。

Fail2Banからもメールが届きます。成功した場合、ブルートフォース攻撃を停止し、サーバーを潜在的な損害から守りました。sendmailがFail2Banサーバーに設定されている場合は、ログファイルが添付されたメール通知が届きます。

Checking additional firewall rules

結論

このチュートリアルを通じて、UbuntuサーバーでFail2Banを設定する方法を学びました。この時点で、SSHサーバーをブルートフォース攻撃から保護する知識を持っているはずです。

では、なぜこの新しい知識をさらに活用しないのでしょうか?たとえば、dockerホスト上でFail2Banを使用してすべてのポートのIPをブロックすることから始めてみませんか?

Source:
https://adamtheautomator.com/fail2ban-ssh/