ウェブサイト検索

iptablesとFail2Banを使用して疑わしいIPをブロックする方法


今日は、小さなスクリプトとiptablesやFail2Banなどのツールを使って、疑わしいIPを自動的にブロックするシンプルで効果的な方法を紹介します。これらのツールは強力で軽量であり、ブルートフォース攻撃、ボット、または悪意のあるトラフィックからLinuxサーバーを保護するのに役立ちます。

このガイドは初心者に優しく、システム管理者、学生、またはVPS、ウェブサーバー、さらには自宅のLinuxサーバーを運営している人にとって素晴らしいものです。

iptablesとFail2Banとは何ですか?

設定に進む前に、私たちが使用している2つの重要なツール、iptablesとFail2Banについて理解しましょう。

iptables

iptables は、ほとんどのLinuxディストリビューションに組み込まれたコマンドラインのファイアウォールユーティリティであり、ネットワークトラフィックを制御するために一連のルール(ポリシーチェーンと呼ばれる)を適用することによって機能します。

これらのルールは、IPアドレス、ポート番号、またはプロトコルに基づいてパケットをフィルタリングできます。iptablesをサーバーの扉に立つ門番のように考えることができ、信頼できるトラフィックだけが入ることを許可し、他のすべてをブロックします。

Fail2Ban

一方、Fail2Banは悪意のある行動を自動的に検出し、対応するログ監視ツールです。リアルタイムでログファイルを監視し、複数のログイン試行失敗のような疑わしいパターンを探します。

SSHに対するブルートフォース攻撃のような怪しいことを見つけると、それは介入し、iptablesにブロックルールを追加することで、問題のあるIPを禁止します。許可する失敗の回数、IPを禁止する期間を設定でき、応答をカスタマイズすることもできます。

一緒に使用することで、iptablesとFail2Banはサーバーを保護するためのシンプルでありながら強力な方法を提供します。iptablesがファイアウォールの筋肉として機能する一方で、Fail2Banは脅威を検知し、ファイアウォールルールを即座に更新することで知恵を加えます。

カスタムIPブロッカースクリプトを使用する理由は何ですか?

「Fail2Ban」は、あらかじめ定義されたログパターンに基づいて疑わしいIPアドレスを自動的に禁止することで優れた機能を発揮しますが、カスタムIPブロッカースクリプトを追加することで、柔軟性と制御の層がさらに追加されます。

カスタムスクリプトを使用すると、複雑なファイアウォールルールを直接修正することなく、ブロックリストからIPアドレスを迅速に追加または削除できます。また、Fail2Ban が監視していないカスタムログやトリガーに基づいてロジックを構築する能力も提供します。

例えば、自分でログを作成するウェブアプリケーションや、特定のパターンを検出する監視ツールを持っている場合、そのアラートをスクリプトに簡単に組み込んで自動的にブロックすることができます。

さらに、このスクリプトは他の自動化タスクやサーバー管理ツールに統合できるため、特に大規模な環境や複数のサーバーを管理するシステム管理者にとって便利です。

ステップ1: iptablesとFail2Banのインストール

設定を始める前に、まずiptablesとFail2Banがシステムにインストールされていることを確認しましょう。これらのツールはほとんどの主要なLinuxディストリビューションのデフォルトのパッケージリポジトリで利用可能なので、インストールは簡単です。

DebianベースのシステムであるUbuntuやDebianを使用している場合は、まずパッケージリストを更新して、すべてが最新であることを確認してください。

sudo apt update

更新が完了したら、以下のコマンドを実行して iptables と fail2ban をインストールします:

sudo apt install iptables fail2ban

RPM ベースのシステムでは、yum パッケージマネージャーを使って両方のツールをインストールできます。

sudo yum install iptables-services fail2ban

インストールが完了したら、ファイアウォールを設定し、Fail2Banを使用して自動保護を設定する準備が整います。

ステップ2:シンプルなIPブロッカースクリプトの作成

これで iptables と Fail2Ban が両方インストールされたので、手動で任意のIPアドレスをiptablesを使ってブロックできるシンプルなbashスクリプト(block-ip.sh)を作成しましょう。

sudo nano /usr/local/bin/block-ip.sh

このファイル内に、次のコードを貼り付けてください:

#!/bin/bash

if [ -z "$1" ]; then
  echo "Usage: $0 "
  exit 1
fi

IP=$1

Check if IP is already blocked
if iptables -L INPUT -v -n | grep -q "$IP"; then
  echo "IP $IP is already blocked."
else
  iptables -A INPUT -s $IP -j DROP
  echo "IP $IP has been blocked."
fi

このスクリプトは最初に、引数としてIPアドレスを提供したかどうかを確認します。提供されていない場合は、使用方法のメッセージを印刷して終了します。IPが提供された場合、それがiptablesを使用して既にブロックされているかどうかを確認します。ファイアウォールルールにまだ存在しない場合は、そのIPアドレスからのすべてのトラフィックをドロップする新しいルールを追加し、アクションを確認します。

スクリプトの内容が整ったら、CTRL+Oを押して保存し、CTRL+Xでエディタを終了します。次に、スクリプトを実行可能にして、コマンドラインから直接実行できるようにします:

sudo chmod +x /usr/local/bin/block-ip.sh

スクリプトが準備できたので、サンプルのIPアドレスをブロックしてテストしてみましょう。たとえば、IPアドレス192.168.1.100をブロックするには、次のように実行します:

sudo /usr/local/bin/block-ip.sh 192.168.1.100

すべてが正しく動作していれば、「次のようなメッセージが表示されるはずです」と表示されるはずです。

IP 192.168.1.100 has been blocked.

IPが実際にブロックされているかどうかを確認するには、次のコマンドを実行して現在のiptablesルールを表示できます:

sudo iptables -L -n -v

このスクリプトは、IPを手動でブロックしたり、カスタムログからブロックしたりしたいときに非常に便利です。

ステップ3:iptablesを使用したFail2Banの設定

iptablesの準備が整い、カスタムスクリプトが配置されたので、Fail2Banを設定する時が来ました。これにより、SSH、Apache、またはサーバー上の他のインターネットに接続されたアプリケーションを侵害しようとする悪意のあるIPを自動的に検出してブロックすることができます。

Fail2Banは「監獄」と呼ばれる概念を使用しています。これは、特定のサービスを監視するために設計された設定ブロックに過ぎません。各監獄はFail2Banに、どのログを監視するか、どのパターンを探すか、攻撃が検出されたときにどう対応するかを指示します。

まず、jail.localファイルを編集または作成する必要があります。ここで、デフォルトの設定に影響を与えずにカスタム設定を定義します。

sudo nano /etc/fail2ban/jail.local

次のブロックをファイルに貼り付けてください:

[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 5
bantime = 3600
findtime = 600

それぞれのオプションが何を意味するのかを分解しましょう:

  • 有効=真: これにより監獄がオンになり、SSHを積極的に監視します。
  • port=ssh: これはFail2Banに監視するポートを指定します。
  • filter=sshd: これは、ログイン失敗を検出するために使用されるフィルタを指定します。
  • logpath=/var/log/auth.log: これはFail2Banが失敗したSSHログイン試行をスキャンするためのログファイルです。
  • maxretry=5: あるIPアドレスが指定された時間内に5回ログインに失敗すると、そのIPアドレスは禁止されます。
  • bantime=3600: これにより、禁止の期間が3600秒(1時間)に設定されます。
  • findtime=600:これは最大再試行回数がカウントされる時間ウィンドウ(秒単位)を定義しています。この場合は、10分です。

CentOSまたはRHELベースのシステムを実行している場合は、SSHログが保存されている場所に一致するようにlogpathを変更する必要があります。

/var/log/secure

監獄設定ファイルを保存後、変更を適用するためにFail2Banサービスを再起動します:

sudo systemctl restart fail2ban

あなたのSSHジャイルが正常に動作しているか確認するには、次のコマンドを使用してSSHジャイルの状態を確認してください:

sudo fail2ban-client status sshd

これにより、禁止されたIPの数、検出された合計試行回数、および監禁がアクティブかどうかが表示されます。

現在 iptables によってブロックされている IP アドレス(Fail2Ban によって禁止されたものを含む)を確認したい場合は、次のコマンドを実行してください:

sudo iptables -L -n

最後に、自動的にFail2Banによってブロックされた特定のIPアドレスの禁止を解除したい場合は、以下のコマンドを使用して手動で削除できます。

sudo fail2ban-client set sshd unbanip 192.168.1.100

ステップ4: スクリプトをFail2Banと組み合わせる(オプション)

デフォルトでは、Fail2Banはiptablesを使用してIPアドレスをブロックするために独自の内部アクションを使用します。しかし、カスタムロジックやロギングを追加したためにFail2Banが独自のIPブロッカースクリプトを呼び出すことを好む場合は、カスタムFail2Banアクションを設定することができます。

これを行うには、まず新しいアクション定義ファイルを作成する必要があります。

sudo nano /etc/fail2ban/action.d/customblock.conf

このファイルに、以下の設定を貼り付けてください。

[Definition]
actionstart =
actionstop =
actioncheck =
actionban = /usr/local/bin/block-ip.sh 
actionunban = iptables -D INPUT -s  -j DROP

[Init]

この設定は、Fail2Banに対して、IPアドレスを禁止する必要があるときにカスタムスクリプトを使用するよう指示します。 actionban行は、あなたのスクリプトを実行し、違反しているIPアドレスをそれに渡します。禁止解除の場合、iptablesからブロックルールを直接削除します。

次に、Fail2Banにこのカスタムアクションを監獄設定で使用するように指示する必要があります。

sudo nano /etc/fail2ban/jail.local

あなたの[sshd] ジェイルまたは他に設定したジェイルの下で、アクションラインをカスタムアクションを指すように更新してください:

[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 5
bantime = 3600
findtime = 600
action = customblock

これらの変更を行った後、適用するためにFail2Banサービスを再起動してください:

sudo systemctl restart fail2ban

今では、Fail2Banが疑わしいIPを検出すると、ブロックを処理するためにあなたのスクリプトを呼び出します。これにより、必要に応じてログを取ったり、アラートを出したり、追加のアクションを実行する柔軟性が得られます。

iptables ルールの保存

重要なことは、iptables ルールはデフォルトでは永続的でないため、手動または Fail2Ban によって追加されたルールは、明示的に保存しない限り、サーバーの再起動後に失われるということです。

DebianやUbuntuシステムでは、iptables-persistentパッケージをインストールすることで、ファイアウォールルールを永続化できます:

sudo apt install iptables-persistent

インストール後、現在のルールを次のように保存します:

sudo netfilter-persistent save

CentOS または RHEL では、プロセスが少し異なります。次のサービスコマンドを使用して、ルールを保存できます。

sudo service iptables save

あるいは、このようにルールを適切な設定ファイルに手動で保存することもできます:

sudo iptables-save > /etc/sysconfig/iptables

ルールを保存することで、手動またはFail2Banを介してブロックされたIPが、システムが再起動した後も引き続きブロックされたままになることを保証します。

結論

Linuxサーバーのセキュリティを強化することは複雑である必要はありません。iptablesの力とFail2Banの知能を組み合わせることで、ブルートフォース攻撃、不正なログイン試行、および疑わしいIPアクティビティに対して強力で柔軟な防御を構築することができます。

Fail2Banが検出と禁止のプロセスを自動化する一方で、カスタムIPブロッカーのスクリプトは、最も必要なときに手動で制御することを可能にします。