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

Spring Безопасность: как реализовать обнаружение грубой силы (BFD)?

Безопасность моих веб-приложений обрабатывается Spring Безопасность 3.02, но я не могу найти какую-либо из поддержки Box для обнаружения грубой силы.

Я хотел бы реализовать некоторую защиту BFD на уровне приложения. Например, путем хранения неудачной попытки входа на пользователя в базе данных (JPA). Затем атакуемые учетные записи пользователей могут получить период блокировки или принудительную активацию учетной записи по электронной почте.

Какой лучший способ реализовать это с помощью Spring Security? Имеет ли какой-либо орган примерный код или рекомендации по этому поводу?

4b9b3361

Ответ 1

Не так сложно катить собственный 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();
    }
  }
}

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

Когда пользователь правильно аутентифицирован, нижеприведённый слушатель информирует пользователя (который, например, может reset его счетчики проверки подлинности):

@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).

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

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

Ответ 2

Вы также должны знать, что блокировка атакованной учетной записи означает предоставление вашей услуги DOSable.

Хорошо известный пример: вы предоставляете аукционный сервис, Боб хочет купить какую-то позицию и нападает на счет Алисы, поэтому вместо того, чтобы делать ставки, Алиса пытается восстановить свою учетную запись, пока Боб получает позицию. Даже временные (5 секунд) блокировки могут помешать Алисе использовать эту услугу по мере необходимости.

Ответ 3

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

Ниже приведен пример этой страницы.