Ubuntu 14.04でFail2Banを使用してApacheサーバーを保護する方法

前書き

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

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

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

前提条件

始める前に、Ubuntu 14.04サーバーを非ルートアカウントでセットアップする必要があります。 管理コマンドを発行するには、このアカウントにsudo権限を設定する必要があります。 sudo特権を持つユーザーを設定する方法については、initial server setup guide for Ubuntu 14.04に従ってください。

Apacheのインストールとパスワード認証の構成

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

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

sudo apt-get update
sudo apt-get install apache2

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

Fail2Banをインストールする

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

sudo apt-get update
sudo apt-get install fail2ban

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

Fail2Ban内の一般設定の調整

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

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

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

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

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を使用する方法を学ぶには、this guideに従ってください。

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に異なる制限を設定する場合は、このjailにmaxretryディレクティブを調整するか、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]刑務所は、実行および悪用するためにWebサイトでスクリプトを検索しているクライアントを禁止するために使用されます。 Webサーバーと組み合わせてPHPまたは他の言語を使用しない場合は、この刑務所を有効にして、これらのタイプのリソースを要求する人を禁止できます。

/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とfilterの名前を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

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

Apache Jailsの実装

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

sudo service fail2ban restart

サービスを再起動して、設定したさまざまな禁止ポリシーを実装する必要があります。

有効なジェイルに関する情報の取得

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

sudo fail2ban-client status

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

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

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

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を再度使用する方がおそらく簡単です。

sudo fail2ban-client status apache
OutputStatus 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アドレスがサイトから禁止されていることがわかります。

sudo fail2ban-client status apache
OutputStatus 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アドレスの禁止を手動で解除できます。

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の詳細については、次のリンクをご覧ください。

Related