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

前書き

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

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

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

前提条件

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

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

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

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

sudo apt-get update
sudo apt-get install nginx

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

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  = true
filter   = nginx-http-auth
port     = http,https
logpath  = /var/log/nginx/error.log
. . .

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

[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刑務所用のフィルターの追加

/etc/fail2ban/jail.localファイルを更新して、より広範囲の不正な動作に一致し、禁止するために、いくつかの追加のjail仕様を追加しました。 作成した刑務所用のフィルターファイルを作成する必要があります。 これらのフィルターファイルは、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: , server: \S+, request: "\S+ \S+ HTTP/\d+\.\d+", host: "\S+"\s*$
            ^ \[error\] \d+#\d+: \*\d+ no user/password was provided for basic authentication, client: , 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]jailのフィルターを作成します。

sudo nano nginx-noscript.conf

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

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

[Definition]

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

ignoreregex =

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

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

sudo nano nginx-nohome.conf

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

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

[Definition]

failregex = ^ -.*GET .*/~.*

ignoreregex =

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

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

sudo nano nginx-noproxy.conf

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

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

[Definition]

failregex = ^ -.*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 nginx-http-auth
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:       111.111.111.111
   `- Total banned:     1

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

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について詳しく知りたい場合は、次のリンクを確認してください。

Related