2010-05-07 36 views
17

Cách tốt nhất để ngăn chặn cuộc tấn công từ điển là gì? Tôi đã nghĩ ra một số triển khai nhưng tất cả chúng dường như có một số lỗ hổng trong chúng:Ngăn chặn các cuộc tấn công từ điển trên ứng dụng web

  1. Khóa người dùng sau khi đăng nhập thất bại X. Vấn đề: dễ biến thành tấn công từ chối dịch vụ, khóa nhiều người dùng trong một khoảng thời gian ngắn.
  2. Tăng thêm thời gian phản hồi cho mỗi lần đăng nhập không thành công trên tên người dùng. Vấn đề: tấn công từ điển có thể sử dụng cùng một mật khẩu nhưng tên người dùng khác nhau.
  3. Tăng thêm thời gian phản hồi cho mỗi lần đăng nhập không thành công từ địa chỉ IP. Vấn đề: dễ dàng để có được xung quanh bằng cách giả mạo địa chỉ IP.
  4. Tăng thêm thời gian phản hồi cho mỗi lần đăng nhập không thành công trong một phiên. Vấn đề: dễ dàng để có được xung quanh bằng cách tạo ra một cuộc tấn công từ điển mà cháy lên một phiên mới trên mỗi nỗ lực.
+0

Không phát minh lại bánh xe, hãy xem các ứng dụng web khác đang hoạt động như thế nào. Tại sao không sử dụng hình ảnh xác thực? – Konerak

Trả lời

21

Tôi thích hệ thống chống bạo lực của gmail rất nhiều. Nó dựa trên "nhiệt" mà người dùng có thể tích lũy, sau khi người dùng đã quá nóng, họ được nhắc nhở bằng một hình ảnh xác thực. Bạn có thể theo dõi nhiệt bằng cách sử dụng cơ sở dữ liệu sql hoặc sử dụng redis incr. Nhiệt được gán cho một địa chỉ IP. 100% không thể "giả mạo" một kết nối tcp qua internet vì số three-way-handshake, tuy nhiên các máy chủ proxy phong phú và địa chỉ ip rất rẻ. Máy chủ proxy thường được sử dụng để gửi spam, bạn có thể kiểm tra số blacklist và tự động nhắc họ cho hình ảnh xác thực.

Mỗi hành động xấu đối với hệ thống của bạn sẽ cập nhật bảng nhiệt. Ví dụ: đăng nhập không thành công sẽ tích lũy 35% nhiệt. Khi mức nhiệt lớn hơn hoặc bằng 100% thì người dùng buộc phải giải mã hình ảnh xác thực. Giải quyết một captcha sẽ "hạ nhiệt" địa chỉ IP đó. Bảng nhiệt có thể chứa cột dấu thời gian được đặt thành thời gian hiện tại khi cập nhật. Sau 24 giờ hoặc lâu hơn, nhiệt có thể trở về 0.

reCaptcha là hình ảnh xác thực an toàn nhất mà bạn có thể sử dụng.

1

Có thể bạn cần triển khai CAPTCHA trên biểu mẫu web của mình.

1

Có sự cân bằng vĩnh cửu giữa bảo mật, tính khả dụng và khả năng sử dụng, có nghĩa là không có giải pháp hoàn hảo.

Một sự cân bằng hợp lý, tùy thuộc vào tình huống của bạn, là sử dụng tùy chọn # 1 với hình ảnh xác thực. Khóa tài khoản sau ba lần thử không thành công, nhưng cho phép các lần đăng nhập tiếp theo nếu một hình ảnh xác thực được giải quyết chính xác.

3

Tôi luôn là người hâm mộ tùy chọn của bạn 3 - khóa hoặc điều chỉnh khách hàng dựa trên địa chỉ IP của nó. Các tùy chọn khác là tất cả các rắc rối nhiều hơn họ đang có giá trị cho những lý do bạn đã nói.

Giả mạo địa chỉ IP là có thể, nhưng không đánh bại biện pháp đối chiếu này. Nếu bạn có nghĩa là "giả mạo" theo nghĩa kỹ thuật - giả mạo tiêu đề gói TCP - thì điều đó sẽ không làm kẻ tấn công tốt lắm, bởi vì ngay cả khi họ đoán đúng mật khẩu họ sẽ không nhận được phản hồi cho họ biết. Họ vẫn có thể sử dụng proxy, tất nhiên, nhưng số lượng proxy bị giới hạn. Ngay cả khi kẻ tấn công có 1.000 proxy đang hoạt động theo ý của anh ta và bạn cho phép 10 lần thử trên mỗi IP là 10.000 lần thử. Nếu bạn thực thi bất kỳ độ phức tạp mật khẩu nào (chẳng hạn như yêu cầu mật khẩu chữ số) thì điều này sẽ không đủ để đoán nhiều.

Điều đó một mình là đủ để ngăn chặn hầu hết các kiddies tập lệnh.Nếu bạn chống lại một kẻ tấn công được xác định rõ hơn, bạn có thể phải thực hiện một số loại giám sát toàn trang web để phát hiện rằng có nhiều nỗ lực đang được thực hiện (có thể có một cuộc tấn công đang diễn ra) và "khóa xuống" theo cách nào đó, ví dụ . bằng cách sử dụng CAPTCHA. Tôi không phải là fan của việc sử dụng CAPTCHA mọi lúc - họ chỉ thấy khó chịu hơn là chúng đáng giá.

Cuối cùng, tùy thuộc vào người dùng chọn mật khẩu an toàn (mặc dù bạn có thể giúp họ). Nếu họ đã chọn "Password1" làm mật khẩu của họ thì không có gì bạn có thể làm sẽ ngăn một hacker xâm nhập vào tài khoản của họ.

1

Tôi cũng khuyên bạn nên sử dụng tùy chọn 3. Mặc dù nó không tốt đối với kẻ tấn công với số lượng proxy lớn (hoặc mạng bot), tôi vẫn nghĩ đó là câu trả lời hay nhất cho hầu hết các trang web. (Gmail có các mối đe dọa khác với hầu hết các trang web nên cần phản ứng khác nhau.)

Một ví dụ thế giới thực:
Một trò chơi trực tuyến lớn mà tôi đang tham gia vào theo dõi có bao nhiêu nỗ lực đăng nhập thất bại xuất phát từ mỗi địa chỉ IP trong 5 phút vừa qua. Thời điểm mà bất kỳ địa chỉ IP nào tích lũy 5 lần đăng nhập không hợp lệ (bất kể số lần thử thành công), địa chỉ đó bị chặn trong 45 phút.

Tại sao điều này làm việc
tôi ngồi xuống và xác định rằng một hacker rất thông minh sẽ có thể phá vỡ một tài khoản với từ điển về 1 ra (tồi tệ hơn có lẽ là nhiều) của tất cả các nỗ lực 100. Vì vậy, kịch bản trường hợp xấu hơn có một kẻ tấn công phá vỡ 1 tài khoản mỗi 100 phút (mỗi địa chỉ IP). Đối với các mối đe dọa chống lại trang web cụ thể này, điều này đã được bảo vệ đầy đủ. Tài khoản của chúng tôi thực sự không đáng giá lắm. Bạn cần phải xác định (cho trang web của bạn) bao nhiêu bảo vệ bạn cần. Bạn có thể mở rộng cửa sổ đến 30 phút nếu bạn muốn làm cho nó mất 3 lần nếu bạn cần.

Lưu ý quan trọng
Đỗ không đếm reset (có thể là giải pháp cho 3 hoặc bản đồ nhiệt mô tả ở trên) sau khi đăng nhập thành công. Nếu bạn làm như vậy, kẻ tấn công sẽ cố gắng hack 3 tài khoản, sau đó đăng nhập thành công vào một số tài khoản mà họ đã kiểm soát (tài khoản của họ hoặc tài khoản đã bị xâm nhập) và sẽ không bao giờ bị điều chỉnh.

+0

Không phải là một hệ thống như vậy có nghĩa là một người biết địa chỉ IP của người dùng khác của trò chơi có thể tắt địa chỉ IP thông qua giả mạo địa chỉ IP không? – Christian

+1

@Christian: Không, bởi vì TCP sử dụng một cái bắt tay ba chiều để thiết lập một kết nối và điều này không thể được hoàn thành với một địa chỉ giả mạo vì kẻ tấn công sẽ không nhận được ACK của máy chủ. (Nó sẽ được gửi đến địa chỉ IP không có thật thay vì địa chỉ thực của kẻ tấn công.) Nếu không thiết lập kết nối từ địa chỉ giả mạo, kẻ tấn công sẽ không có cách nào để thử đăng nhập từ địa chỉ đó. –

0

Điều đó tùy thuộc vào ý bạn là "ngăn chặn".

Nếu bạn không muốn họ lãng phí băng thông của bạn, điều chỉnh, khóa, vv là các tùy chọn khả thi. Có chi phí với bảng nhiệt - bạn phải tạo và duy trì logic, lưu trữ và quản lý "bản đồ nhiệt", v.v. Tôi cũng đã thấy một số hệ thống định vị địa lý ip ném lên một hình ảnh xác thực hoặc thay đổi nhật ký của nó trong hồ sơ nếu người dùng cố gắng đăng nhập từ một ip "xa" hoặc "không xác định".

Nếu bạn chỉ đơn giản muốn giảm thiểu hiệu quả của các cuộc tấn công từ điển, hãy sử dụng muối ngoài các băm mật khẩu.

+4

Làm thế nào một băm muối và mật khẩu làm giảm hiệu quả của một cuộc tấn công từ điển? Salting và băm - theo như tôi biết - chỉ hữu ích cho việc mã hóa mật khẩu để nó không được lưu trữ trong văn bản thuần trong cơ sở dữ liệu. Cuối cùng, một mật khẩu được chọn kém sẽ vẫn dễ bị tấn công từ điển, bất kể nó có bị ướp muối và băm nhỏ trước khi lưu trữ hay không. –

0

Bạn có thể không cho phép mật khẩu chứa từ điển nếu bạn đang lập trình cho một ứng dụng an toàn thực sự quan trọng. Bạn không phải cho phép QWERTY làm mật khẩu hợp lệ.

1

Trước hết, hãy ngăn người dùng của bạn chọn mật khẩu phổ biến. Thêm một "danh sách đen" vào cơ sở dữ liệu của bạn và kiểm tra mật khẩu mới chống lại chúng. Bạn có thể cư nó sử dụng một trong nhiều danh sách mật khẩu hoặc văn bản, như ở đây:

http://securityoverride.org/infusions/pro_download_panel/download.php?did=66

Thứ hai, xem xét một khóa cấp tốc tạm thời.Nếu bạn có bảng "Người dùng", hãy thêm cột "LastLoginAttemptedOn" và "FailedLoginAttempts". Cập nhật các giá trị này mỗi khi người dùng cố đăng nhập. Khi người dùng đăng nhập thành công, hãy đặt lại FailedLoginAttempts về 0. Khi FailedLoginAttempts đạt đến 4 (hoặc bất kỳ thứ gì bạn thích), đừng để người dùng cố gắng đăng nhập trong 5 phút (một lần nữa, tùy chọn của bạn) từ LastLoginAttemptedOn. Không cập nhật cột này cho đến khi chúng thực sự được phép cố gắng ngăn chặn nỗ lực đặt lại bộ hẹn giờ sau 4 phút. Đặt lại FailedLoginThử thành 0 khi bộ hẹn giờ đặt lại để chúng có nhiều lần thử lại.

Các vấn đề liên quan