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

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

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

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

21
задан Kdeveloper 21 April 2010 в 08:58
поделиться

2 ответа

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

16
ответ дан 29 November 2019 в 21:21
поделиться

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

Пример есть на на этой странице .

4
ответ дан 29 November 2019 в 21:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: