2010-04-21 32 views
19

Bảo mật ứng dụng web của tôi được xử lý bởi Bảo mật mùa xuân 3.02 nhưng tôi không thể tìm thấy bất kỳ hỗ trợ nào trong hộp hỗ trợ phát hiện bạo lực.Bảo mật mùa xuân: làm thế nào để thực hiện Brute Force Detection (BFD)?

Tôi muốn thực hiện một số bảo vệ BFD cấp ứng dụng. Ví dụ bằng cách lưu trữ đăng nhập thất bại cho mỗi người dùng trong cơ sở dữ liệu (JPA). Các tài khoản người dùng bị tấn công sau đó có thể nhận được một khoảng thời gian khóa hoặc một tài khoản cưỡng bức kích hoạt lại bằng e-mail.

Cách tốt nhất để thực hiện điều này bằng Bảo mật mùa xuân là gì? Có cơ thể nào có mã ví dụ hay thực tiễn tốt nhất về điều này không?

Trả lời

15

Không khó để cuộn BFD của riêng bạn. Như trong Spring Security 3.0, bạn có thể thêm ứng dụng nghe đơn giản (nhờ Stephen C để chỉ cho tôi đúng hướng).

nghe này sẽ được gọi khi thất bại xác thực xuất hiện:

@Component 
public class AuthenticationFailureListener 
    implements ApplicationListener<AuthenticationFailureBadCredentialsEvent> { 

    @Autowired 
    private UserDao userDao; 

    public void onApplicationEvent(AuthenticationFailureBadCredentialsEvent ev) { 

    String username = ev.getAuthentication().getName(); 

    User user = userDao.find("name", username); 
    if (user != null) { // only for existing users 
      user.reportLoginFailure(); 
      userDao.commit(); 
    } 
    } 
} 

Mỗi thất bại xác thực bây giờ sẽ thông báo cho người sử dụng. Ví dụ, người dùng tăng một bộ đếm lỗi xác thực và tự tắt nó khi đạt đến một ngưỡng nhất định.

Khi một người dùng được xác thực đúng người nghe dưới đây sẽ thông báo cho người sử dụng (người ví dụ có thể đặt lại là quầy thất bại xác thực):

@Component 
public class AuthenticationSuccessEventListener 
    implements ApplicationListener<AuthenticationSuccessEvent>{ 

    @Autowired 
    private UserDao userDao; 

    public void onApplicationEvent(AuthenticationSuccessEvent event) { 

    String username = event.getAuthentication().getName(); 

    User user = userDao.find("name", username); 
    user.reportLoginOK(); 
    userDao.commit(); 
    } 
} 

Các thính giả trên sẽ không cần thêm cấu hình XML và được đón tự động bởi Spring (nếu chúng nằm trong gói Spring-scan).

Tùy thuộc vào cấu hình giao dịch của bạn, giải pháp này có thể bỏ lỡ một số lần đăng nhập không thành công nếu chúng xảy ra gần như đồng thời. Điều này có thể được ngăn chặn nếu bạn cập nhật bộ đếm với một truy vấn UPDATE duy nhất thay vì tải người dùng và sau đó lưu các thay đổi.

Người nghe trên cũng có thể được mở rộng để phát hiện các mẫu BDF khác, ví dụ: một IP duy nhất đang thực hiện quét trên tên người dùng (ngẫu nhiên) của lô.

+0

Xin lưu ý rằng không phải tất cả các phương pháp đăng nhập đều sử dụng AuthenticationSuccessEvent. Bạn cũng có thể xem InteractiveAuthenticationSuccessEvent. – Florian

+2

. Nếu tôi có thể, tại sao bạn không sử dụng máy móc của các trình xử lý, chẳng hạn như AuthenticationFailureHandler? Tôi có nghĩa là, tại sao sử dụng người nghe thay vì xử lý? bất kỳ ưu/khuyết điểm nào? – OhadR

+2

Bạn cũng nên biết rằng khóa tài khoản bị tấn công có nghĩa là làm cho dịch vụ của bạn có thể chạy được. Ví dụ nổi tiếng là: bạn cung cấp dịch vụ đấu giá, Bob muốn mua một số vị trí và tấn công tài khoản của Alice, vì vậy thay vì đặt cược Alice cố gắng khôi phục tài khoản của cô trong khi Bob nhận vị trí. Ngay cả các khóa tạm thời (5 giây) có thể ngăn Alice sử dụng dịch vụ khi cần. – otonglet

4

Cách thông thường để phát hiện các cuộc tấn công bạo lực (dự đoán mật khẩu) là đăng nhập chương trình xác thực không thành công, và có ứng dụng riêng để phát hiện các mẫu đáng ngờ trong tệp nhật ký. Tôi đoán nó sẽ có thể đóng vòng lặp và có máy dò hành động để khóa tài khoản bị tấn công, vv

Có một ví dụ về this page.

+0

Cảm ơn! Bạn đang liên kết chỉ cho tôi đi đúng hướng. – Kdeveloper

+0

Xin chào Stephen, tiếc là liên kết đã bị hỏng: ( – Oleg

9

Bạn cũng nên biết rằng khóa tài khoản bị tấn công có nghĩa là làm cho dịch vụ của bạn có thể chạy được.

Ví dụ nổi tiếng là: bạn cung cấp dịch vụ đấu giá, Bob muốn mua một số vị trí và tấn công tài khoản của Alice, vì vậy thay vì đặt cược Alice cố gắng khôi phục tài khoản của cô trong khi Bob nhận vị trí. Ngay cả các khóa tạm thời (5 giây) có thể ngăn Alice sử dụng dịch vụ khi cần.

+2

Tôi muốn upvote nhưng đây là một bình luận, không phải là một câu trả lời. – otonglet

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