Моя безопасность веб-приложений обрабатывается безопасностью Spring 3.02, но я не могу найти никого из поддержки поля Обнаружения Грубой силы.
Я хотел бы реализовать некоторый прикладной уровень защита BFD. Например, путем хранения отказавшего входа в систему пытаются на пользователя в базе данных (JPA). Подвергшиеся нападению учетные записи пользователей могли затем получить период локаута или принудительную повторную активацию учетной записи по электронной почте.
Что лучший способ состоит в том, чтобы реализовать это с безопасностью Spring? Какое-либо тело имеет пример кода или лучшие практики на этом?
Это не так уж и сложно накатить собственный BFD. Как и в Spring Security 3.0, вы можете просто добавить слушателей приложений (спасибо Stephen C за то, что указали мне правильное направление).
Этот прослушиватель будет вызываться при возникновении ошибок аутентификации:
@Component
public class AuthenticationFailureListener
implements ApplicationListener<AuthenticationFailureBadCredentialsEvent> {
@Autowired
private UserDao userDao;
public void onApplicationEvent(AuthenticationFailureBadCredentialsEvent ev) {
String username = ev.getAuthentication().getName();
User user = userDao.find("name", username);
if (user != null) { // only for existing users
user.reportLoginFailure();
userDao.commit();
}
}
}
Теперь каждый сбой аутентификации будет информировать пользователя. Пользователь, например, увеличивает счетчик ошибок аутентификации и сам деактивирует его при достижении определенного порога.
Когда пользователь правильно аутентифицирован, нижеприведенный слушатель проинформирует пользователя (который, например, может сбросить его счетчики ошибок аутентификации):
@Component
public class AuthenticationSuccessEventListener
implements ApplicationListener<AuthenticationSuccessEvent>{
@Autowired
private UserDao userDao;
public void onApplicationEvent(AuthenticationSuccessEvent event) {
String username = event.getAuthentication().getName();
User user = userDao.find("name", username);
user.reportLoginOK();
userDao.commit();
}
}
Вышеупомянутым слушателям не потребуется дополнительная конфигурация XML, и они автоматически выбираются Spring (если они находятся в пакете Spring component-scan).
В зависимости от конфигурации транзакции это решение может пропустить несколько неудачных попыток входа в систему, если они происходят почти одновременно. Этого можно избежать, если вы обновите счетчик с помощью одного запроса UPDATE вместо загрузки пользователя, а затем сохраните изменения.
Вышеупомянутые прослушиватели также могут быть расширены для обнаружения других шаблонов BDF, например, одного IP-адреса, который выполняет сканирование множества (случайных) имен пользователей.
Обычный способ обнаружения атак методом грубой силы (подбора пароля) состоит в том, чтобы записывать в журнал схемы аутентификации неудачные попытки входа в систему и иметь отдельную попытку приложения для обнаружения подозрительных шаблонов в файле журнала. Я предполагаю, что можно было бы замкнуть цикл и заставить детектор принять меры для блокировки учетных записей, подвергшихся атаке, и т. Д.
Пример есть на на этой странице .