Làm cách nào để hạn chế Nginx Auth_Basic thử lại?


14

Tôi đã bảo vệ một thư mục web bằng mô-đun Auth_Basic của Nginx. Vấn đề là, chúng ta có thể thử một vài mật khẩu cho đến khi nó hoạt động (tấn công vũ phu). Có cách nào để hạn chế số lần thử lại không thành công?

Câu trả lời:


29

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 logpathkhớp với cấu hình của bạn.


5

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à htpasswdhỗ 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".


2
Điều này sẽ hữu ích nếu bạn có thể sử dụng bcryptmậ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ể .
keune

Tôi đã thử nó, nó hoạt động hoàn toàn tốt cho tôi. Sử dụng nó trong sản xuất bây giờ.
SColvin

Không hoạt động trên vanilla ngix trên Ubuntu như @keune đã nói
Fabian Thommen

3
Đáng nói là điều này sẽ hạn chế các lần thử mật khẩu, nhưng chỉ vì máy chủ của bạn sẽ bị quá tải do tính toán băm đắt tiền. Trong môi trường sản xuất, đây có lẽ không phải là điều bạn muốn.
Tomasz P. Szynalski

1

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.


0

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.