Существуют ли какие-либо функции, особенно в Spring 3.0 MVC, которые помогут реализовать обнаружение атаки грубой силы на странице аутентификации/входа в веб-приложение?
Лучший способ для веб-приложения Spring MVC для обнаружения атаки грубой силы?
Ответ 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;
}
}
Ответ 4
Удивительно, но я не нашел ничего в справочных документах для Spring MVC или Spring Безопасность.
Однако я нашел Splunk.
Ответ 5
Короткий ответ - нет, насколько я знаю Spring 3.0 MVC не имеет ничего, чтобы помочь вам обнаружить атаку грубой силы. Я не верю, что Spring у системы безопасности 3.0 есть что-то в этом роде.
Однако вы должны иметь возможность реализовать что-то самостоятельно, расширив некоторые из UserDetailsServices.
Иногда рекомендуется записывать все попытки входа, успешно или нет. Если вы записываете все сбои (например, в базе данных), вы сможете определить, пытается ли кто-то или что-то совершить грубую силовую атаку на вашем сайте.
Вам следует подумать о попытках входа в систему с использованием дросселирования, например, описанной в описании дороги к ямбургу.