Spring MVC Web应用程序检测暴力攻击的最佳方式是什么?

Spring 3.0 MVC中是否有任何特性可以帮助在Web应用程序的身份validation/登录页面上实现powershell攻​​击检测?

久经考验的做法是在认证失败时引入随机但相当大的延迟。

通过这种方式,合法用户可以立即登录,但攻击者每次尝试将花费500ms-1s,这使得整个暴力想法变得不切实际(将需要永远)。

合法用户偶尔登录失败将导致他们只有一个小的延迟,并将被忽视。

如果您需要在重复登录失败时收到通知,则需要实施报告打印每个用户的后续失败登录次数,按该编号desc限制100排序。

PS 这是一篇解释如何获得登录尝试通知的post。 我相信,采用相同的方法可以引入延迟。

通过Spring安全性中的一些配置和编码是可能的。

顺便说一句,我不建议在可疑的无效登录试验面前做出一些延迟。 您可能会对可疑的登录尝试做出一些延迟,但这种延迟会导致您在应用程序中暂停一段时间。 如果您的应用程序同时发生大量无效登录,则可能会对您的系统造成DoS或DDoS攻击。

更好的方法是对可疑的无效登录做出快速响应,但同时暂停用户尝试登录的用户帐户。 通过这种方式,powershell攻击避免不会导致提供Dos或DDoS攻击。

然而,暂停用户帐户也会为DoS攻击提供一种方法,因为它可能导致向真实用户提供服务失败。 但是,正确的安全方案在这些情况下会有所帮助。 例如,如果检测到暴力攻击,您可以:

  • 展示一些Captcha,
  • 暂停帐户所有者的帐户,电子邮件或短信以更改密码
  • 或者,暂停帐户一段时间,同时通知帐户所有者密码更改,

所有这些都取决于您的域和服务方案。 例如,您可以在此实现中实现自己的UserDetailsS​​ervice并检测暴力攻击。

为了实现Spring Security的最后一个场景,下面的代码声明了一个身份validation管理器,它传递了一个自定义UserDetailsS​​ervice,其类型是JdbcDaoImpl(请注意,必须将包名称和查询修改为您自己的包和数据模型)。

         

CustomUserDetailsS​​ervice检测是否发生暴力攻击,以及我很快讨论的AuthenticationFailureListener。 FailedLoginCacheManager是一个ehcache包装器,它使用相对失败的数量来维护失败的登录(用户名)。 使用适当的timeToIdleSeconds设置缓存以使帐户暂停临时。

 public class CustomUserDetailsService extends JdbcDaoImpl { @Autowired private FailedLoginCacheManager cacheManager; @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { if (cacheManager.isBruteForceAttackLogin(username)) { //throw some security exception ... } return super.loadUserByUsername(username); } 

}

此外,还实现了ApplicationListener以检测失败的登录尝试并将其保留在ehcache中。

 @Component public class AuthenticationFailureListener implements ApplicationListener { @Autowired private FailedLoginCacheManager cacheManager; @Override public void onApplicationEvent(AuthenticationFailureBadCredentialsEvent event) { UsernamePasswordAuthenticationToken token = (UsernamePasswordAuthenticationToken) event.getSource(); String userName = token.getPrincipal().toString(); cacheManager.updateLoginFailureStatus(userName); }} 

无需再讨论有关FailedLoginCacheManager服务的更多信息,但此处讨论的两个主要方法可以像以下方法一样实现:

 public void updateLoginFailureStatus(String userName) { Cache cache = manager.getCache(CACHE_NAME); Element element = cache.get(userName); if (isValid(element)) { int failureCount = (Integer)element.getObjectValue(); cache.remove(userName); cache.put(new Element(userName, ++failureCount)); } else { cache.put(new Element(userName, 1)); } } public boolean isBruteForceAttackLogin(String username) { Cache cache = manager.getCache(CACHE_NAME); Element element = cache.get(username); if (isValid(element)) { int failureCount = (Integer)element.getObjectValue(); return failureCount >= 3; } else { return false; } } 

令人惊讶的是,我在Spring MVC或Spring Security的参考文档中找不到任何内容。

但是,我确实找到了这个3年前的教程 , 该教程描述了如何使用Splunk完成它。

还可以考虑在您的登录页面添加validation码,来自Google的reCAPTCHA非常容易集成到任何应用程序。 以下是与Java / JSP一起使用的文档

简短的回答是否定的,据我所知,Spring 3.0 MVC没有任何东西可以帮助你发现暴力攻击。 我不相信spring security 3.0对此有任何意义。

但是,您应该能够通过扩展一些UserDetailsS​​ervices来实现自己的function。

有时建议记录所有登录尝试,无论是否成功。 如果您正在记录所有故障(例如在数据库中),您应该能够确定某人/某物是否正在尝试对您的站点进行暴力攻击。

您应该考虑限制像@road到yamburg描述的登录尝试。