Ubuntu14.04でFail2Banを使用してApacheサーバーを保護する方法
序章
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をインストールできます。
ローカルパッケージインデックスを更新し、次のように入力してインストールします。
- sudo apt-get update
- sudo apt-get install apache2
fail2ban
サービスは、ログインエントリポイントを保護するのに役立ちます。 これがApacheのインストールで役立つようにするには、サーバー上のコンテンツの少なくともサブセットに対してパスワード認証を実装する必要があります。 このガイドに従って、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アドレスまたはネットワークを追加できます。
[DEFAULT]
. . .
ignoreip = 127.0.0.1/8 your_home_IP
調整したいもう1つの項目は、bantime
です。これは、違反しているメンバーが禁止される秒数を制御します。 これを、悪意のある攻撃者の努力を妨害するのに十分な長さに設定し、正当なユーザーが間違いを修正できるように十分に短く設定するのが理想的です。 デフォルトでは、これは600秒(10分)に設定されています。 適切と思われる場合は、この値を増減します。
[DEFAULT]
. . .
bantime = 3600
次の2つの項目は、問題のあるクライアントを特定するために使用されるログ行の範囲を決定します。 findtime
は秒単位の時間を指定し、maxretry
ディレクティブはその時間内に許容される試行回数を示します。 クライアントがfindtime
で設定された時間内にmaxretry
を超える試行を行った場合、それらは禁止されます。
[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」に変更します。
[DEFAULT]
. . .
mta = mail
通知を送信するメールアドレスを選択する必要があります。 destemail
ディレクティブをこの値で変更します。 sendername
ディレクティブを使用して、通知メールの「送信者」フィールドを変更できます。
[DEFAULT]
. . .
destemail = [email protected]
sendername = Fail2BanAlerts
fail2ban
の用語では、「アクション」とは、クライアントが認証に何度も失敗した場合に従う手順です。 デフォルトのアクション(action_
と呼ばれる)は、問題のポートからのIPアドレスを単に禁止することです。 ただし、メールを設定している場合に使用できる、他に2つの事前に作成されたアクションがあります。
action_mw
アクションを使用して、クライアントを禁止し、問題のあるアドレスに関する「whois」レポートを含む電子メール通知を構成済みのアカウントに送信できます。 action_mwl
アクションを使用することもできます。これは同じことを行いますが、禁止をトリガーした問題のあるログ行も含まれます。
[DEFAULT]
. . .
action = %(action_mwl)s
Apacheログを監視するためのFail2Banの設定
一般的なfail2ban
設定のいくつかが整ったので、特定の動作パターンについてWebサーバーログを監視するApache固有のjailを有効にすることに集中できます。
構成ファイル内の各jailは、角括弧で囲まれたjail名を含むヘッダーでマークされます([DEFAULT]
セクションを除くすべてのセクションは、特定のjailの構成を示します)。 デフォルトでは、[ssh]
jailのみが有効になっています。
Apacheログイン試行のログ監視を有効にするには、[apache]
jailを有効にします。 このセクション内のenabled
ディレクティブを編集して、「true」と表示されるようにします。
[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
値を追加してください。
[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サーバーと組み合わせて使用しない場合は、この刑務所を有効にして、これらのタイプのリソースを要求するユーザーを禁止できます。
[apache-noscript]
enabled = true
. . .
[apache-overflows]
jailは、異常に長く疑わしいURLを要求しようとしているクライアントをブロックするために使用されます。 これらは多くの場合、バッファオーバーフローをトリガーしようとしてApacheを悪用しようとする試みの兆候です。 これらのタイプの攻撃を防ぎたい場合は、この刑務所を有効にすることができます。
[apache-overflows]
enabled = true
. . .
[apache-overflows]
エントリをコピーして貼り付け、少し変更することで、いくつかの追加チェックを行うことができます。 たとえば、そのセクションをコピーして貼り付け、jail名を変更し、apache-badbots
にフィルタリングして、既知の悪意のあるボットリクエストパターンを阻止できます。
[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
に変更できます。
[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
です)。 他の刑務所のエラーログと一致するパターンと同様のパターンを使用できます。
[php-url-fopen]
enabled = true
port = http,https
filter = php-url-fopen
logpath = /var/log/apache*/*access.log
必要な変更が完了したら、ファイルを保存して閉じます。
ApacheJailsの実装
構成の変更を実装するには、fail2ban
サービスを再起動する必要があります。 次のように入力すると、次のように入力できます。
- sudo service fail2ban restart
サービスが再起動し、構成したさまざまな禁止ポリシーが実装されます。
有効な刑務所に関する情報の取得
fail2ban-client
コマンドを使用すると、有効になっているすべての刑務所を確認できます。
- 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
の詳細については、次のリンクをご覧ください。