Bagaimana cara membatasi Nginx Auth_Basic coba ulang?


14

Saya telah melindungi folder web dengan modul Auth_Basic Nginx. Masalahnya adalah, kita dapat mencoba beberapa kata sandi sampai berhasil (serangan brute force). Apakah ada cara untuk membatasi jumlah percobaan ulang yang gagal?

Jawaban:


29

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 logpathcocok dengan konfigurasi Anda.


5

Saya kagum tidak pada yang lain telah memberikan solusi / solusi ini.

Nginx basic-auth dan htpasswdmendukung 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".


2
Ini akan berguna jika Anda bisa menggunakan bcryptkata sandi ed dengan autentikasi dasar Nginx, tetapi ternyata Anda tidak bisa .
keune

Saya sudah mencobanya, itu bekerja dengan baik untuk saya. Menggunakannya dalam produksi sekarang.
SColvin

Tidak bekerja pada vanilla ngix di ubuntu seperti yang dikatakan @keune
Fabian Thommen

3
Layak disebutkan bahwa ini akan membatasi upaya kata sandi, tetapi hanya karena server Anda akan kelebihan beban dari menghitung hash yang mahal. Dalam lingkungan produksi, ini mungkin bukan yang Anda inginkan.
Tomasz P. Szynalski

1

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.


0

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.