web-dev-qa-db-ja.com

Nginx Auth_Basicの再試行を制限する方法は?

NginxのAuth_BasicモジュールでWebフォルダーを保護しました。問題は、機能するまで複数のパスワードを試すことができることです(ブルートフォース攻撃)。失敗した再試行の数を制限する方法はありますか?

15
THpubs

私の知る限り、 Auth Basic モジュールはこの機能をサポートしていませんが、 Fail2ban を使用してこれを行うことができます。

存在しないユーザーでテストすると、以下のようなエラーログが表示されます。

2012/08/25 10:07:01 [error] 5866#0: *1 no user/password was provided for basic authentication, client: 127.0.0.1, server: localhost, request: "GET /pma HTTP/1.1", Host: "localhost:81" 2012/08/25 10:07:04 [error] 5866#0: *1 user "ajfkla" was not found in "/etc/nginx/htpasswd", client: 127.0.0.1, server: localhost, request: "GET /pma HTTP/1.1", Host: "localhost:81"

次に、必要なフィルターを作成します。

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

[Definition]
failregex = no user/password was provided for basic authentication.*client: <Host>
              user .* was not found in.*client: <Host>
              user .* password mismatch.*client: <Host>
ignoreregex = </Host></Host></Host> 

/etc/fail2ban/jail.conf

[nginx-auth]
enabled = true
filter = nginx-auth
action = iptables[name=NoAuthFailures, port=80, protocol=tcp]
logpath = /var/log/nginx*/*error*.log
bantime = 3600 # 1 hour
maxretry = 3

Fail2Banルールのテスト:

fail2ban-regex /var/log/nginx/localhost.error_log /etc/fail2ban/filter.d/nginx-auth.conf

Failregex
|- Regular expressions:
|  [1] no user/password was provided for basic authentication.*client: <Host>
|  [2] user .* was not found in.*client: <Host>
|  [3] user .* password mismatch.*client: <Host>
|
`- Number of matches:
   [1] 1 match(es)
   [2] 2 match(es)
   [3] 0 match(es)

Ignoreregex
|- Regular expressions:
|
`- Number of matches:

Summary
=======

Addresses found:
[1]
    127.0.0.1 (Sat Aug 25 10:07:01 2012)
[2]
    127.0.0.1 (Sat Aug 25 10:07:04 2012)
    127.0.0.1 (Sat Aug 25 10:07:07 2012)
[3]

PS:Fail2banはログファイルをフェッチして禁止するため、logpathが構成と一致していることを確認してください。

30
quanta

他にこの解決策/回避策を提供していないことに驚いています。

Nginx basic-authとhtpasswdは、オプションのコスト変数を使用したbcryptパスワード暗号化をサポートしています。 Bcryptは低速になるように設計されているため、さまざまなパスワードを試すことができる速さにハード制限があります。

基本認証のユーザー名/パスワードを作成するとき

_htpasswd -B -C 12 path/to/users.db <username>
_

コストが12の場合、サーバーは1秒間に数回を超えてパスワードを試すことができなくなり、14に増やすと、パスワードの試行ごとに約1秒になるはずです。

このように構成すると、攻撃者が何年もの間パスワードを試行し続けても、妥当なパスワードはブルートフォース攻撃の影響を受けなくなります。

例えば。 1秒あたり10回のパスワード試行で、8文字の英数字パスワードに対するブルートフォース攻撃は692,351年かかります:62**8 / (10*3600*24*365)

これは、「インテリジェントな」リクエスト制限を設定するよりも、設定がはるかに簡単で、より簡単です。

5
SColvin

私はnginxがこれを行うための内部機能を持っているとは思いません。 ドキュメントページ は、それが可能であることを示唆していません。

Fail2Banを使用して、ログイン試行が繰り返し失敗したIPアドレスをブロックできます。

Fail2Ban wikiにはいくつかの nginx固有のパターン があります。

Fail2Banは、ほとんどの大きなディストリビューションでパッケージとして利用できるはずです。

1
cjc

Nginx-HTTP-Auth-Digest モジュールは、基本的な認証モジュールを、再試行やタイムアウトなどの多くの追加機能で置き換えることができます。追加のドキュメントが利用可能です ここ

唯一の欠点は、これはおそらくnginxを再構築する必要があることです

0
intika