Jawaban:
Sejauh yang saya tahu, modul Auth Basic tidak mendukung fitur ini, tetapi Anda dapat melakukan ini dengan menggunakan Fail2ban .
Menguji dengan pengguna yang tidak ada, Anda akan melihat sesuatu seperti ini di log kesalahan:
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"
Kemudian buat filter yang diperlukan:
/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
Menguji aturan 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: Karena Fail2ban mengambil file log untuk dicekal, pastikan logpath
cocok dengan konfigurasi Anda.
Saya kagum tidak pada yang lain telah memberikan solusi / solusi ini.
Nginx basic-auth dan htpasswd
mendukung enkripsi kata sandi bcrypt dengan variabel biaya opsional. Bcrypt dirancang untuk menjadi lambat, sehingga memberikan batas keras seberapa cepat Anda dapat mencoba kata sandi yang berbeda.
Saat membuat nama pengguna / kata sandi autentik dasar Anda
htpasswd -B -C 12 path/to/users.db <username>
Dengan biaya 12 server Anda kemungkinan tidak akan dapat mencoba kata sandi lebih dari beberapa kali per detik, tingkatkan menjadi 14 dan Anda mungkin akan melihat sekitar 1 per upaya kata sandi.
Dengan itu, kata sandi yang masuk akal akan kebal terhadap serangan brute force bahkan jika penyerang mencoba kata sandi secara terus menerus selama bertahun-tahun.
Misalnya pada 10 upaya sandi per serangan brute force kedua pada 8 karakter kata sandi alfanumerik akan mengambil 692.351 tahun: 62**8 / (10*3600*24*365)
.
Ini jauh lebih mudah untuk dikonfigurasikan dan lebih tahan terhadap kesalahan daripada mengatur pembatasan permintaan "cerdas".
Saya tidak percaya nginx memiliki fasilitas internal untuk melakukan ini. The halaman dokumentasi tidak menyarankan itu mungkin.
Anda dapat menggunakan Fail2Ban untuk memblokir alamat IP yang telah mengulangi upaya login gagal.
Wiki Fail2Ban memiliki beberapa pola spesifik nginx .
Fail2Ban harus tersedia sebagai paket di sebagian besar distro besar.
Modul Nginx-HTTP-Auth-Digest dapat menggantikan modul auth dasar dengan banyak fitur tambahan seperti coba lagi dan batas waktu. Dokumentasi tambahan tersedia di sini
Satu-satunya downside adalah bahwa ini mungkin memerlukan pembangunan kembali nginx
bcrypt
kata sandi ed dengan autentikasi dasar Nginx, tetapi ternyata Anda tidak bisa .