序章

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

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

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

前提条件

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

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

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

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

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

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

Fail2Banをインストールします

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

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

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

Fail2Ban内の一般設定の調整

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

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

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

新しくコピーしたファイルを開いて、Nginxログモニタリングを設定できるようにします。

  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

Nginxログを監視するためのFail2Banの構成

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

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

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

/etc/fail2ban/jail.local
[nginx-http-auth]

enabled  = true
filter   = nginx-http-auth
port     = http,https
logpath  = /var/log/nginx/error.log
. . .

これは、Ubuntuのfail2banパッケージに含まれている唯一のNginx固有のjailです。 ただし、独自のjailを作成して、機能を追加することはできます。 これらの追加の刑務所のインスピレーションと実装の詳細の一部は、ここここから得られました。

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

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

enabled  = true
port     = http,https
filter   = nginx-noscript
logpath  = /var/log/nginx/access.log
maxretry = 6
. . .

[nginx-badbots]というセクションを追加して、既知の悪意のあるボットリクエストパターンを阻止できます。

/etc/fail2ban/jail.local
[nginx-badbots]

enabled  = true
port     = http,https
filter   = nginx-badbots
logpath  = /var/log/nginx/access.log
maxretry = 2

Nginxを使用してユーザーのホームディレクトリ内のWebコンテンツへのアクセスを提供しない場合は、[nginx-nohome]刑務所を追加することで、これらのリソースを要求するユーザーを禁止できます。

/etc/fail2ban/jail.local
[nginx-nohome]

enabled  = true
port     = http,https
filter   = nginx-nohome
logpath  = /var/log/nginx/access.log
maxretry = 2

Nginxサーバーをオープンプロキシとして使用しようとするクライアントを禁止する必要があります。 これらの要求に一致するように[nginx-noproxy]刑務所を追加できます。

/etc/fail2ban/jail.local
[nginx-noproxy]

enabled  = true
port     = http,https
filter   = nginx-noproxy
logpath  = /var/log/nginx/access.log
maxretry = 2

必要な変更が完了したら、ファイルを保存して閉じます。 次に、作成した刑務所のフィルターを追加する必要があります。

追加のNginx刑務所用のフィルターの追加

/etc/fail2ban/jail.localファイルを更新して、より広範囲の不正な動作に一致し、禁止するために、いくつかの追加のjail仕様を追加しました。 作成したjailのフィルターファイルを作成する必要があります。 これらのフィルターファイルは、Nginxログ内で検索するパターンを指定します。

フィルタディレクトリに移動することから始めます。

  1. cd /etc/fail2ban/filter.d

実際には、追加の失敗したログインログパターンに一致するように、事前に提供されたNginx認証フィルターを調整することから始めたいと思います。 編集用にファイルを開きます。

  1. sudo nano nginx-http-auth.conf

failregex仕様の下に、パターンを追加します。 これは、ユーザーがユーザー名またはパスワードを入力していない行と一致します。

/etc/fail2ban/filter.d/nginx-http-auth.conf
[Definition]


failregex = ^ \[error\] \d+#\d+: \*\d+ user "\S+":? (password mismatch|was not found in ".*"), client: <HOST>, server: \S+, request: "\S+ \S+ HTTP/\d+\.\d+", host: "\S+"\s*$
            ^ \[error\] \d+#\d+: \*\d+ no user/password was provided for basic authentication, client: <HOST>, server: \S+, request: "\S+ \S+ HTTP/\d+\.\d+", host: "\S+"\s*$

ignoreregex =

終了したら、ファイルを保存して閉じます。

次に、apache-badbots.confファイルをコピーしてNginxで使用できます。 このファイルはそのまま使用できますが、わかりやすくするために新しい名前にコピーします。 これは、jail構成内でフィルターを参照する方法と一致します。

  1. sudo cp apache-badbots.conf nginx-badbots.conf

次に、[nginx-noscript]刑務所のフィルターを作成します。

  1. sudo nano nginx-noscript.conf

次の定義を中に貼り付けます。 スクリプトのサフィックスを自由に調整して、サーバーが合法的に使用している言語ファイルを削除するか、サフィックスを追加してください。

/etc/fail2ban/filter.d/nginx-noscript.conf
[Definition]

failregex = ^<HOST> -.*GET.*(\.php|\.asp|\.exe|\.pl|\.cgi|\.scgi)

ignoreregex =

ファイルを保存して閉じます。

次に、[nginx-nohome]刑務所のフィルターを作成します。

  1. sudo nano nginx-nohome.conf

次のフィルター情報をファイルに配置します。

/etc/fail2ban/filter.d/nginx-nohome.conf
[Definition]

failregex = ^<HOST> -.*GET .*/~.*

ignoreregex =

終了したら、ファイルを保存して閉じます。

最後に、[nginx-noproxy]刑務所のフィルターを作成できます。

  1. sudo nano nginx-noproxy.conf

このフィルター定義は、サーバーをプロキシとして使用する試みと一致します。

/etc/fail2ban/filter.d/nginx-noproxy.conf
[Definition]

failregex = ^<HOST> -.*GET http.*

ignoreregex =

終了したら、ファイルを保存して閉じます。

Nginx刑務所をアクティブ化する

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

  1. sudo service fail2ban restart

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

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

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

  1. sudo fail2ban-client status

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

Output
Status |- Number of jail: 6 `- Jail list: nginx-noproxy, nginx-noscript, nginx-nohome, nginx-http-auth, nginx-badbots, ssh

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

  1. sudo iptables -S
Output
-P INPUT ACCEPT -P FORWARD ACCEPT -P OUTPUT ACCEPT -N fail2ban-nginx-badbots -N fail2ban-nginx-http-auth -N fail2ban-nginx-nohome -N fail2ban-nginx-noproxy -N fail2ban-nginx-noscript -N fail2ban-ssh -A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-nginx-noproxy -A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-nginx-nohome -A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-nginx-badbots -A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-nginx-noscript -A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-nginx-http-auth -A INPUT -p tcp -m multiport --dports 22 -j fail2ban-ssh -A fail2ban-nginx-badbots -j RETURN -A fail2ban-nginx-http-auth -j RETURN -A fail2ban-nginx-nohome -j RETURN -A fail2ban-nginx-noproxy -j RETURN -A fail2ban-nginx-noscript -j RETURN -A fail2ban-ssh -j RETURN

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

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

Fail2Banポリシーのテスト

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

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

  1. sudo fail2ban-client status nginx-http-auth
Output
Status for the jail: nginx-http-auth |- filter | |- File list: /var/log/nginx/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 nginx-http-auth unbanip 111.111.111.111

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

結論

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

fail2banについて詳しく知りたい場合は、次のリンクを確認してください。