Spring Security:如何实施暴力检测(BFD)?

我的Web应用程序安全性由Spring Security 3.02处理,但我找不到任何对Brute Force Detection的支持。

我想实现一些应用级别的BFD保护。 例如,通过将每个用户的失败登录尝试存储在数据库(JPA)中。 受攻击的用户帐户可能会因此通过电子邮件获取锁定期或重新激活帐户。

Spring Security实现这个最好的方法是什么? 任何机构是否都有示例代码或最佳实践?


推出自己的BFD并不难。 正如在Spring Security 3.0中,您可以简单地添加应用程序侦听器(感谢Stephen C将我指向正确的方向)。

当发生身份验证失败时,将会调用此侦听器:

@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();
    }
  }
}

每个认证失败现在都会通知用户。 例如,用户递增认证失败计数器并在达到某个阈值时将其自身停用。

当用户被正确认证时,下面的监听器会通知用户(例如,谁可以重置它的认证失败计数器):

@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();
  }
}

上面的监听器不需要额外的XML配置,并且在Spring自动选取(如果它们在Spring组件扫描包中)。

根据您的交易配置,如果解决方案几乎同时发生,此解决方案可能会错过一些登录失败次数。 如果使用单个UPDATE查询更新计数器,而不是加载用户,然后保存更改,则可以避免这种情况。

上面的听众也可以扩展来检测其他BDF模式,例如一个IP正在对(随机)用户名的批次进行扫描。


您还应该知道,锁定受攻击的帐户意味着让您的服务成为可用的。

众所周知的例子是:你提供了一个拍卖服务,Bob想要购买某个位置并攻击Alice的账户,所以与Bob在Bob获得位置时尝试恢复账户的赌注不同。 即使是临时(5秒)的锁也可能阻止Alice按照自己的需要使用该服务。


检测暴力攻击(密码猜测)的常规方法是让身份验证方案记录失败的登录尝试,并有单独的应用程序尝试检测日志文件中的可疑模式。 我想可以关闭这个循环并让探测器采取措施锁定受到攻击的账户等。

这个页面上有一个例子。

链接地址: http://www.djcxy.com/p/21695.html

上一篇: Spring Security: how to implement Brute Force Detection (BFD)?

下一篇: using real/fake salt instead of lockouts