前書き

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

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

このガイドでは、 `+ fail2ban +`をインストールし、Nginxログで侵入の試みを監視するように設定する方法を示します。 Ubuntu 14.04サーバーを使用します。

前提条件

始める前に、Ubuntu 14.04サーバーを非ルートアカウントでセットアップする必要があります。 管理アカウントを発行するには、このアカウントに「+ sudo 」権限を設定する必要があります。 「 sudo +」権限を持つユーザーを設定する方法については、https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-14-04 [次のサーバーの初期設定ガイド]をご覧ください。 Ubuntu 14.04]。

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

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

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

sudo apt-get update
sudo apt-get install nginx

`+ fail2ban +`サービスは、ログインエントリポイントを保護するのに役立ちます。 これがNginxのインストールに役立つためには、サーバー上のコンテンツの少なくともサブセットに対してパスワード認証を実装する必要があります。 https://www.digitalocean.com/community/tutorials/how-to-set-up-password-authentication-with-nginx-on-ubuntu-14-04 [このガイド]に従ってパスワード保護を設定できますNginxサーバー。

Fail2Banをインストールする

Nginxサーバーが実行され、パスワード認証が有効になったら、先に進み、 `+ fail2ban +`をインストールできます(前の手順で既にNginxがセットアップされている場合に備えて、ここに別のリポジトリの再取得を含めます):

sudo apt-get update
sudo apt-get install fail2ban

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

Fail2Ban内の一般設定の調整

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

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

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

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

sudo nano /etc/fail2ban/jail.local

デフォルトの変更

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

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

/etc/fail2ban/jail.local

[DEFAULT]

. . .
ignoreip = 127.0.0.1/8

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

/etc/fail2ban/jail.local

[DEFAULT]

. . .
bantime =

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

/etc/fail2ban/jail.local

[DEFAULT]

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

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

禁止が行われるたびにメールを受信する場合は、メール通知を有効にすることができます。 そのためには、最初にサーバーにMTAをセットアップして、メールを送信できるようにする必要があります。 このタスクでPostfixを使用する方法については、https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-postfix-as-a-send-only-smtp-server-onをご覧ください-ubuntu-14-04 [このガイド]。

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

/etc/fail2ban/jail.local

[DEFAULT]

. . .
mta =

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

/etc/fail2ban/jail.local

[DEFAULT]

. . .
destemail =
sendername =

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

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

/etc/fail2ban/jail.local

[DEFAULT]

. . .
action = %()s

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

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

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

Nginxログイン試行のログ監視を有効にするには、 + [nginx-http-auth] + jailを有効にします。 このセクション内の `+ enabled +`ディレクティブを編集して、「true」と読み上げます。

/etc/fail2ban/jail.local

[nginx-http-auth]

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

これは、Ubuntuの `+ fail2ban +`パッケージに含まれるNginx固有の唯一の刑務所です。 ただし、独自の刑務所を作成して機能を追加することもできます。 これらの追加刑務所のインスピレーションと実装の詳細のいくつかは、http://www.fail2ban.org/wiki/index.php/NginX [こちら]およびhttp://snippets.aktagon.com/snippets/554-から得られました。 how-to-secure-an-nginx-server-with-fail2ban [こちら]。

`+ [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] + jailを追加することで、これらのリソースを要求するユーザーを禁止できます。

/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] + jailを追加できます。

/etc/fail2ban/jail.local

[nginx-noproxy]

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

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

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

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

filtersディレクトリに変更することから始めます。

cd /etc/fail2ban/filter.d

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

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*$


ignoreregex =

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

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

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

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

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] +`刑務所用のフィルターを作成します。

sudo nano nginx-nohome.conf

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

/etc/fail2ban/filter.d/nginx-nohome.conf

[Definition]

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

ignoreregex =

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

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

sudo nano nginx-noproxy.conf

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

/etc/fail2ban/filter.d/nginx-noproxy.conf

[Definition]

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

ignoreregex =

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

Nginxジェイルのアクティベーション

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

sudo service fail2ban restart

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

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

`+ fail2ban-client +`コマンドを使用して、有効なすべてのjailを表示できます。

sudo fail2ban-client status

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

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

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

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 +`を再度使用する方が簡単です。

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

sudo fail2ban-client status nginx-http-auth
OutputStatus 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:
  `- Total banned:     1

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

sudo fail2ban-client set nginx-http-auth unbanip

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

結論

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

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