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

时间:2011-04-16 12:37:47

标签: java security spring spring-mvc spring-security

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

5 个答案:

答案 0 :(得分:12)

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

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

合法用户偶尔登录失败会导致他们只有轻微的延迟而且会被忽视。

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

P.S。 Here是一篇解释如何获得登录尝试通知的帖子。我相信,采用相同的方法可以引入延迟。

答案 1 :(得分:3)

可以通过Spring安全性中的一些配置和编码来实现。

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

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

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

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

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

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

<authentication-manager alias="authenticationManager" xmlns="http://www.springframework.org/schema/security">
    <authentication-provider user-service-ref="CustomUserDetailsService" />           
</authentication-manager>

<!--
This bean is to provide jdbc-user-service.
Also, it provides a way to avoid BFD along with AuthenticationFailureListener
-->
<bean id="CustomUserDetailsService" class="com.example.CustomUserDetailsService">
    <property name="dataSource" ref="dataSource" />
    <property name="usersByUsernameQuery" value="SELECT user_client.user_name, user_client.password, user.is_active
                                   FROM user_client INNER JOIN user ON user_client.fk_user = user.ID
                                   WHERE user_client.user_name=? "/>
    <property name="authoritiesByUsernameQuery" value="SELECT user_client.user_name, CONCAT('ROLE_',user_client.client_id)
                                   FROM user_client WHERE user_client.user_name=? "/>
</bean>

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<AuthenticationFailureBadCredentialsEvent> {

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

答案 2 :(得分:2)

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

然而,我确实找到this 3 year old tutorial来描述如何使用Splunk来完成。

答案 3 :(得分:2)

另外考虑在您的登录页面添加验证码,来自Google的reCAPTCHA非常容易集成到任何应用程序。 Here是将其与Java / JSP一起使用的文档

答案 4 :(得分:1)

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

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

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

您应该考虑限制登录尝试,例如@road to yamburg描述。