Лучший способ для веб-приложения Spring MVC обнаружить атаку методом перебора? - PullRequest
17 голосов
/ 16 апреля 2011

Существуют ли какие-либо функции, специально предназначенные для Spring 3.0 MVC, которые помогут реализовать обнаружение атаки методом "грубой силы" на странице аутентификации / входа в систему веб-приложения?

Ответы [ 5 ]

12 голосов
/ 16 апреля 2011

Давно проверенная практика - вводить случайную, но значительную задержку, если аутентификация не удалась.

Таким образом, законные пользователи будут входить в систему сразу же, но злоумышленник будет тратить 500 мс-1 с ​​на попытку, что делает всю идею грубой силы неосуществимой (это будет длиться вечно).

Периодически неудачный вход в систему законных пользователей вызовет у них лишь небольшую задержку и останется незамеченным.

Если вам необходимо получать уведомления о повторяющихся неудачных входах в систему, вам необходимо внедрить число распечаток отчетов о последовательных неудачных входах в систему на пользователя, упорядочить по этому количеству до 100 пределов.

P.S. Здесь - сообщение, объясняющее, как получать уведомления при попытке входа в систему. Я полагаю, что следуя тому же подходу, можно ввести задержку.

3 голосов
/ 31 марта 2015

Это возможно при некоторых настройках и кодировании в Spring security.

Кстати, я не предлагаю делать некоторую задержку перед подозрительными недопустимыми испытаниями входа в систему. Вы можете сделать некоторую задержку, чтобы ответить на подозрительную попытку входа в систему, но эта задержка потребует от вас приостановить поток на некоторое время в вашем приложении. Это может обеспечить DoS- или DDoS-атаку в вашей системе, если с вашим приложением одновременно происходит большое количество недопустимых входов в систему.

Лучше всего сделать быстрый ответ на подозрительный неверный логин, но в то же время приостановить учетную запись пользователя, с помощью которой пользователь пытается войти. Таким образом, предотвращение атаки методом грубой силы не приводит к обеспечению атаки Dos или DDoS.

Тем не менее, приостановка учетной записи пользователя также предоставит способ для DoS-атаки, поскольку это может привести к сбою в доставке услуги реальному пользователю. Но правильные сценарии безопасности были бы полезны в этих случаях. Например, если обнаружена атака грубой силы, вы можете:

  • показать капчу,
  • приостановить действие учетной записи, электронной почты или SMS-сообщения владельца учетной записи для смены пароля
  • или приостановить учетную запись на некоторое время, уведомив владельца учетной записи об изменении пароля,
  • ...

Все это зависит от вашего домена и сценариев обслуживания. Например, вы можете реализовать свой собственный UserDetailsService и обнаружить атаку методом перебора в этой реализации.

Чтобы реализовать последний сценарий Spring Security, в следующем коде объявляется менеджер аутентификации, которому передается пользовательский UserDetailsService, тип которого здесь 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>

CustomUserDetailsService обнаруживает, происходит ли атака методом перебора или нет, вместе с AuthenticationFailureListener, который я скоро расскажу. FailedLoginCacheManager - это оболочка ehcache, которая поддерживает неудачные входы (имена пользователей) с их относительными ошибочными количествами. В кеше задано правильное времяToIdleSeconds, чтобы приостановить действие учетной записи.

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 голосов
/ 17 апреля 2011

Также рассмотрите возможность добавления капчи на страницу входа, reCAPTCHA от Google очень легко интегрировать в любое приложение. Здесь - документация по его использованию с Java / JSP

.
2 голосов
/ 16 апреля 2011

Удивительно, но я не смог найти ничего в справочных документах ни для Spring MVC , ни для Spring Security .

Я нашел, однако, это 3-летнее руководство , которое описывает, как это можно сделать с помощью Splunk .

1 голос
/ 16 апреля 2011

Короткий ответ - нет, насколько я знаю, что в Spring 3.0 MVC нет ничего, что помогло бы вам обнаружить атаку грубой силой. Я не верю, что у Spring Security 3.0 тоже есть что-то в этом роде.

Однако вы должны быть в состоянии реализовать что-то самостоятельно, расширив некоторые из UserDetailsServices.

Иногда рекомендуется записывать все попытки входа в систему, успешные или нет. Если вы записываете все сбои (как в базе данных), вы должны быть в состоянии определить, пытается ли кто-то / что-то предпринять атаку грубой силой на ваш сайт.

Вы должны рассмотреть возможность подавления попыток входа в систему, таких как @road to yamburg, описанных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...