Câu trả lời:
Theo tôi biết, mô-đun Auth Basic không hỗ trợ tính năng này, nhưng bạn có thể làm điều này bằng cách sử dụng Fail2ban .
Thử nghiệm với người dùng không tồn tại, bạn sẽ thấy một cái gì đó giống như tin vào nhật ký lỗi:
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"
Sau đó tạo bộ lọc cần thiết:
/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
Kiểm tra quy tắc 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: Vì Fail2ban tìm nạp các tệp nhật ký để cấm, hãy đảm bảo logpath
khớp với cấu hình của bạn.
Tôi ngạc nhiên không có ai khác đã đưa ra giải pháp / cách giải quyết này.
Nginx basic-auth và htpasswd
hỗ trợ mã hóa mật khẩu bcrypt với một biến chi phí tùy chọn. Bcrypt được thiết kế để hoạt động chậm, do đó cung cấp giới hạn cứng về tốc độ bạn có thể thử các mật khẩu khác nhau.
Khi tạo tên người dùng / mật khẩu xác thực cơ bản của bạn, hãy sử dụng
htpasswd -B -C 12 path/to/users.db <username>
Với chi phí là 12, máy chủ của bạn có thể sẽ không thể thử mật khẩu nhiều hơn một vài lần trong một giây, hãy tăng lên 14 và có thể bạn sẽ xem xét khoảng 1 giây cho mỗi lần thử mật khẩu.
Với cấu hình đó, bất kỳ mật khẩu hợp lý nào cũng sẽ miễn nhiễm với cuộc tấn công vũ phu ngay cả khi kẻ tấn công đã thử mật khẩu liên tục trong nhiều năm.
Ví dụ, tại 10 lần thử mật khẩu mỗi giây, tấn công bằng vũ lực vào mật khẩu gồm 8 ký tự chữ và số sẽ mất 692.351 năm : 62**8 / (10*3600*24*365)
.
Điều này dễ cấu hình và dễ kiểm chứng hơn nhiều so với thiết lập giới hạn yêu cầu "thông minh".
Tôi không tin nginx có bất kỳ cơ sở nội bộ nào để làm việc này. Các trang tài liệu không cho thấy nó có thể.
Bạn có thể sử dụng Fail2Ban để chặn các địa chỉ IP đã lặp lại các lần đăng nhập thất bại.
Wiki Fail2Ban có một số mẫu cụ thể nginx .
Fail2Ban nên có sẵn như là một gói trên hầu hết các bản phát hành lớn.
Mô-đun Nginx-HTTP-Auth-Digest có thể thay thế mô-đun xác thực cơ bản bằng nhiều tính năng bổ sung như thử lại và hết thời gian. Tài liệu bổ sung có sẵn ở đây
Nhược điểm duy nhất là điều này có thể yêu cầu xây dựng lại nginx
bcrypt
mật khẩu ed với xác thực cơ bản của Nginx, nhưng dường như bạn không thể .