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


14

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

回答:


29

私の知る限り、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、設定と一致することを確認してください。


5

私はこのソリューション/回避策を他に与えていないことに驚いています。

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

基本認証のユーザー名/パスワードの作成時に使用

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

コストが12の場合、サーバーは1秒間に数回しかパスワードを試すことができず、14に増やすと、パスワードの試行ごとに約1秒になる可能性があります。

構成されていると、攻撃者が何年もパスワードを連続して試行した場合でも、合理的なパスワードはブルートフォース攻撃の影響を受けません。

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

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


2
これはbcrypt、Nginxの基本認証でedパスワードを使用できる場合に便利ですが、明らかにできません
ケーン

私はそれを試しました、それは私にとって絶対にうまくいきます。現在、本番環境で使用しています。
SColvin

@keuneが言ったように、ubuntuでバニラngixに取り組んでいない
ファビアンThommen

3
これはパスワードの試行を制限しますが、それはサーバーが高価なハッシュの計算で過負荷になるためです。実稼働環境では、これはおそらく望みではありません。
トマスP.シナルスキ

1

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

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

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

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


0

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.