我的网络应用程序安全性由 Spring Security 3.02处理,但我找不到任何对Brute Force Detection的开箱即用支持。
我想实现一些应用级别的BFD保护。例如,通过在数据库中存储每个用户的失败登录尝试(JPA)。然后,受攻击的用户帐户可以通过电子邮件获得锁定期或强制帐户重新激活。
使用Spring Security实现此目的的最佳方法是什么?是否有任何机构有关于此的示例代码或最佳实践?
答案 0 :(得分:15)
推出自己的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。
答案 1 :(得分:10)
您还应该知道锁定受攻击的帐户意味着使您的服务成为可用的。
众所周知的例子是:你提供拍卖服务,鲍勃想要购买一些位置并攻击爱丽丝的账户,因此,当鲍勃获得该位置时,爱丽丝会尝试恢复她的账户而不是下注。即使是临时(5秒)锁也可能会阻止Alice根据需要使用该服务。
答案 2 :(得分:4)
检测暴力攻击(密码猜测)的常规方法是让身份验证方案登录失败的登录尝试,并让单独的应用程序尝试检测日志文件中的可疑模式。我想有可能关闭循环并让探测器采取措施锁定遭受攻击的帐户等等。
this page上有一个例子。