序章

Webサーバーを運用する場合は、サイトとユーザーを保護するためのセキュリティ対策を講じることが重要です。 ファイアウォールポリシーを使用してWebサイトとアプリケーションを保護し、パスワード認証を使用して特定の領域へのアクセスを制限することは、システムを保護するための優れた出発点です。 ただし、公的にアクセス可能なパスワードプロンプトは、悪意のあるユーザーやボットからのブルートフォース攻撃を引き付ける可能性があります。

fail2banを設定すると、この問題を軽減するのに役立ちます。 ユーザーがサービスへの認証に繰り返し失敗した場合(または他の疑わしいアクティビティに関与した場合)、fail2banは、実行中のファイアウォールポリシーを動的に変更することにより、問題のあるIPアドレスを一時的に禁止できます。 各fail2ban「jail」は、失敗した試行を示すパターンについてサービスによって書き込まれたログをチェックすることによって動作します。 付属の構成フィルターを使用すると、fail2banをセットアップしてApacheログを監視するのは簡単です。

このガイドでは、fail2banをインストールし、侵入の試みについてApacheログを監視するように構成する方法を示します。 Ubuntu14.04サーバーを使用します。

前提条件

始める前に、root以外のアカウントでUbuntu14.04サーバーをセットアップする必要があります。 管理コマンドを発行するには、このアカウントにsudo権限を設定する必要があります。 sudo権限を持つユーザーを設定する方法については、Ubuntu14.04初期サーバー設定ガイドに従ってください。

Apacheのインストールとパスワード認証の設定

fail2banを使用してApacheサーバーを保護することに関心がある場合は、サーバーが既にセットアップされ、実行されている可能性があります。 そうでない場合は、aptを使用してUbuntuのデフォルトリポジトリからApacheをインストールできます。

ローカルパッケージインデックスを更新し、次のように入力してインストールします。

  1. sudo apt-get update
  2. sudo apt-get install apache2

fail2banサービスは、ログインエントリポイントを保護するのに役立ちます。 これがApacheのインストールで役立つようにするには、サーバー上のコンテンツの少なくともサブセットに対してパスワード認証を実装する必要があります。 このガイドに従って、Apacheサーバーのパスワード保護を構成できます。

Fail2Banをインストールします

Apacheサーバーが実行され、パスワード認証が有効になったら、fail2banをインストールできます(前の手順でApacheを既に設定している場合は、ここに別のリポジトリの再フェッチが含まれます)。

  1. sudo apt-get update
  2. sudo apt-get install fail2ban

これにより、ソフトウェアがインストールされます。 デフォルトでは、fail2banは、失敗したSSHログイン試行のみを禁止するように構成されています。 悪意のあるアクティビティを示すパターンがないかApacheログをチェックするように構成するいくつかのルールを有効にする必要があります。

Fail2Ban内の一般設定の調整

開始するには、fail2banが監視するアプリケーションログと、問題のあるエントリが見つかったときに実行するアクションを決定するために使用する構成ファイルを調整する必要があります。 提供された/etc/fail2ban/jail.confファイルは、このために提供された主なリソースです。

変更するには、このファイルを/etc/fail2ban/jail.localにコピーする必要があります。 これにより、パッケージの更新で新しいデフォルトファイルが提供された場合に、変更が上書きされるのを防ぐことができます。

  1. sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

新しくコピーしたファイルを開いて、Apacheログ監視を設定できるようにします。

  1. sudo nano /etc/fail2ban/jail.local

デフォルトの変更

まず、ファイル内に設定されているデフォルトを評価して、ニーズに合っているかどうかを確認する必要があります。 これらは、ファイル内の[DEFAULT]セクションにあります。 これらの項目は一般的なポリシーを設定し、特定の刑務所でそれぞれオーバーライドできます。

最初に確認する項目の1つは、fail2banポリシーの対象ではないクライアントのリストです。 これは、ignoreipディレクティブによって設定されます。 ロックアウトを回避するために、例外のリストに独自のIPアドレスまたはネットワークを追加することをお勧めします。 シェルアクセスを維持できる場合は、いつでも手動で禁止を取り消すことができるため、これはWebサーバーのログインではそれほど問題にはなりません。 既存のリストに、スペースで区切られたIPアドレスまたはネットワークを追加できます。

/etc/fail2ban/jail.local
[DEFAULT]

. . .
ignoreip = 127.0.0.1/8 your_home_IP

調整したいもう1つの項目は、bantimeです。これは、違反しているメンバーが禁止される秒数を制御します。 これを、悪意のある攻撃者の努力を妨害するのに十分な長さに設定し、正当なユーザーが間違いを修正できるように十分に短く設定するのが理想的です。 デフォルトでは、これは600秒(10分)に設定されています。 適切と思われる場合は、この値を増減します。

/etc/fail2ban/jail.local
[DEFAULT]

. . .
bantime = 3600

次の2つの項目は、問題のあるクライアントを特定するために使用されるログ行の範囲を決定します。 findtimeは秒単位の時間を指定し、maxretryディレクティブはその時間内に許容される試行回数を示します。 クライアントがfindtimeで設定された時間内にmaxretryを超える試行を行った場合、それらは禁止されます。

/etc/fail2ban/jail.local
[DEFAULT]

. . .
findtime = 3600   # These lines combine to ban clients that fail
maxretry = 6      # to authenticate 6 times within a half hour.

メール通知の設定(オプション)

禁止が行われるたびにメールを受信したい場合は、電子メール通知を有効にすることができます。 そのためには、まずサーバーにMTAを設定して、メールを送信できるようにする必要があります。 このタスクにPostfixを使用する方法については、このガイドに従ってください。

MTAを設定したら、/etc/fail2ban/jail.localファイルの[DEFAULT]セクション内でいくつかの追加設定を調整する必要があります。 mtaディレクティブを設定することから始めます。 上記のチュートリアルが示すようにPostfixを設定する場合は、この値を「mail」に変更します。

/etc/fail2ban/jail.local
[DEFAULT]

. . .
mta = mail

通知を送信するメールアドレスを選択する必要があります。 destemailディレクティブをこの値で変更します。 sendernameディレクティブを使用して、通知メールの「送信者」フィールドを変更できます。

/etc/fail2ban/jail.local
[DEFAULT]

. . .
destemail = [email protected]
sendername = Fail2BanAlerts

fail2banの用語では、「アクション」とは、クライアントが認証に何度も失敗した場合に従う手順です。 デフォルトのアクション(action_と呼ばれる)は、問題のポートからのIPアドレスを単に禁止することです。 ただし、メールを設定している場合に使用できる、他に2つの事前に作成されたアクションがあります。

action_mwアクションを使用して、クライアントを禁止し、問題のあるアドレスに関する「whois」レポートを含む電子メール通知を構成済みのアカウントに送信できます。 action_mwlアクションを使用することもできます。これは同じことを行いますが、禁止をトリガーした問題のあるログ行も含まれます。

/etc/fail2ban/jail.local
[DEFAULT]

. . .
action = %(action_mwl)s

Apacheログを監視するためのFail2Banの設定

一般的なfail2ban設定のいくつかが整ったので、特定の動作パターンについてWebサーバーログを監視するApache固有のjailを有効にすることに集中できます。

構成ファイル内の各jailは、角括弧で囲まれたjail名を含むヘッダーでマークされます([DEFAULT]セクションを除くすべてのセクションは、特定のjailの構成を示します)。 デフォルトでは、[ssh]jailのみが有効になっています。

Apacheログイン試行のログ監視を有効にするには、[apache]jailを有効にします。 このセクション内のenabledディレクティブを編集して、「true」と表示されるようにします。

/etc/fail2ban/jail.local
[apache]

enabled  = true
port     = http,https
filter   = apache-auth
logpath  = /var/log/apache*/*error.log
maxretry = 6
. . .

Apacheサーバーがデフォルトのログの場所(/var/log/apache/error.log)に書き込んでいる場合、jailは正しい場所を検索するようにすでに構成されています。 別の場所にログインしている場合は、必要に応じてlogpathを変更してください。 また、この特定のjailに異なる制限を設定する場合は、maxretryディレクティブを調整するか、このjailにfindtime値を追加してください。

/etc/fail2ban/jail.local
[apache]

enabled  = true
port     = http,https
filter   = apache-auth
logpath  = /var/log/apache/custom_log_location.log
maxretry = 3
findtime = 600
. . .

上記の刑務所は、基本認証の失敗を禁止するための処理を行います。 有効にする価値のある他のいくつかの事前構成されたjailもあります([apache-multiport] jailは不要なレガシーjailです)。

[apache-noscript] jailは、Webサイトでスクリプトを検索して実行および悪用するクライアントを禁止するために使用されます。 PHPまたはその他の言語をWebサーバーと組み合わせて使用しない場合は、この刑務所を有効にして、これらのタイプのリソースを要求するユーザーを禁止できます。

/etc/fail2ban/jail.local
[apache-noscript]

enabled  = true
. . .

[apache-overflows] jailは、異常に長く疑わしいURLを要求しようとしているクライアントをブロックするために使用されます。 これらは多くの場合、バッファオーバーフローをトリガーしようとしてApacheを悪用しようとする試みの兆候です。 これらのタイプの攻撃を防ぎたい場合は、この刑務所を有効にすることができます。

/etc/fail2ban/jail.local
[apache-overflows]

enabled  = true
. . .

[apache-overflows]エントリをコピーして貼り付け、少し変更することで、いくつかの追加チェックを行うことができます。 たとえば、そのセクションをコピーして貼り付け、jail名を変更し、apache-badbotsにフィルタリングして、既知の悪意のあるボットリクエストパターンを阻止できます。

/etc/fail2ban/jail.local
[apache-overflows]

enabled  = true
port     = http,https
filter   = apache-overflows
logpath  = /var/log/apache*/*error.log
maxretry = 2

[apache-badbots]

enabled  = true
port     = http,https
filter   = apache-badbots
logpath  = /var/log/apache*/*error.log
maxretry = 2

Apacheを使用してユーザーのホームディレクトリ内のWebコンテンツへのアクセスを提供しない場合は、もう一度コピーして貼り付け、jailとフィルターの名前をapache-nohomeに変更できます。

/etc/fail2ban/jail.local
[apache-overflows]

enabled  = true
port     = http,https
filter   = apache-overflows
logpath  = /var/log/apache*/*error.log
maxretry = 2

[apache-badbots]

enabled  = true
port     = http,https
filter   = apache-badbots
logpath  = /var/log/apache*/*error.log
maxretry = 2

[apache-nohome]

enabled  = true
port     = http,https
filter   = apache-nohome
logpath  = /var/log/apache*/*error.log
maxretry = 2

最後に、PHPでApacheを使用している場合は、[php-url-fopen] jailを有効にすることをお勧めします。これにより、悪意のある目的で特定のPHPの動作を使用する試みがブロックされます。 正しいアクセスログの場所を指すようにlogpathディレクティブを変更する必要がある可能性があります(Ubuntuでは、デフォルトの場所は/var/log/apache2/access.logです)。 他の刑務所のエラーログと一致するパターンと同様のパターンを使用できます。

/etc/fail2ban/jail.local
[php-url-fopen]

enabled = true
port    = http,https
filter  = php-url-fopen
logpath = /var/log/apache*/*access.log

必要な変更が完了したら、ファイルを保存して閉じます。

ApacheJailsの実装

構成の変更を実装するには、fail2banサービスを再起動する必要があります。 次のように入力すると、次のように入力できます。

  1. sudo service fail2ban restart

サービスが再起動し、構成したさまざまな禁止ポリシーが実装されます。

有効な刑務所に関する情報の取得

fail2ban-clientコマンドを使用すると、有効になっているすべての刑務所を確認できます。

  1. sudo fail2ban-client status

有効にしたすべての刑務所のリストが表示されます。

Output
Status |- Number of jail: 7 `- Jail list: php-url-fopen, apache-overflows, apache-noscript, ssh, apache-badbots, apache-nohome, apache

fail2banがファイアウォールルールを変更して、クライアントを禁止するためのフレームワークを作成したことがわかります。 以前のファイアウォールルールがなくても、fail2banがクライアントを専用チェーンに追加することでクライアントを選択的に禁止できるようにするフレームワークが有効になります:

  1. sudo iptables -S
Output
-P INPUT ACCEPT -P FORWARD ACCEPT -P OUTPUT ACCEPT -N fail2ban-apache -N fail2ban-apache-badbots -N fail2ban-apache-nohome -N fail2ban-apache-noscript -N fail2ban-apache-overflows -N fail2ban-php-url-fopen -N fail2ban-ssh -A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-apache-nohome -A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-apache-badbots -A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-php-url-fopen -A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-apache-overflows -A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-apache-noscript -A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-apache -A INPUT -p tcp -m multiport --dports 22 -j fail2ban-ssh -A fail2ban-apache -j RETURN -A fail2ban-apache-badbots -j RETURN -A fail2ban-apache-nohome -j RETURN -A fail2ban-apache-noscript -j RETURN -A fail2ban-apache-overflows -j RETURN -A fail2ban-php-url-fopen -j RETURN -A fail2ban-ssh -j RETURN

いずれかの刑務所によって施行されている禁止の詳細を確認したい場合は、fail2ban-clientを再度使用する方がおそらく簡単です。

  1. sudo fail2ban-client status apache
Output
Status for the jail: apache |- filter | |- File list: /var/log/apache2/error.log | |- Currently failed: 0 | `- Total failed: 0 `- action |- Currently banned: 0 | `- IP list: `- Total banned: 0

Fail2Banポリシーのテスト

fail2banポリシーをテストして、期待どおりにトラフィックがブロックされていることを確認することが重要です。 たとえば、Apache認証プロンプトの場合、誤ったクレデンシャルを何度も与える可能性があります。 制限を超えた後は、禁止され、サイトにアクセスできなくなります。 電子メール通知を設定すると、指定した電子メールアカウントに禁止に関するメッセージが表示されます。

fail2ban-clientコマンドでステータスを確認すると、IPアドレスがサイトから禁止されていることがわかります。

  1. sudo fail2ban-client status apache
Output
Status for the jail: apache |- filter | |- File list: /var/log/apache2/error.log | |- Currently failed: 0 | `- Total failed: 12 `- action |- Currently banned: 1 | `- IP list: 111.111.111.111 `- Total banned: 1

ルールが機能していることを確認したら、次のように入力して、fail2ban-clientを使用してIPアドレスの禁止を手動で解除できます。

  1. sudo fail2ban-client set apache unbanip 111.111.111.111

これで、認証を再試行できるようになります。

結論

最も単純なケースでは、Apacheサーバーを保護するためのfail2banの設定は非常に簡単です。 ただし、fail2banは、特定のセキュリティニーズに適合するポリシーを構築するための非常に高い柔軟性を提供します。 /etc/fail2ban/jail.localファイル内の変数とパターン、および/etc/fail2ban/filter.dおよび/etc/fail2ban/action.dディレクトリ内で依存するファイルを調べることにより、微調整する多くの部分を見つけることができます。ニーズの変化に応じて変更します。 fail2banを使用してサーバーを保護する方法の基本を学ぶことで、最小限の労力で大量のセキュリティを提供できます。

fail2banの詳細については、次のリンクをご覧ください。