Подтвердить что ты не робот

Лучший способ для веб-приложения Spring MVC для обнаружения атаки грубой силы?

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

Ответ 3

Это возможно с помощью некоторых конфигураций и кодирования в Spring безопасности.

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

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

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

  • показать Captcha,
  • приостановить учетную запись, отправить по электронной почте или 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, которая поддерживает неудавшиеся логины (имена пользователей) с их относительными неудачными суммами. Кэш установлен с правильными временными интервалами, чтобы временно приостановить учетную запись.

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

Ответ 5

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

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

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

Вам следует подумать о попытках входа в систему с использованием дросселирования, например, описанной в описании дороги к ямбургу.