Сначала немного: не секрет, что я внедряю систему auth + auth для CodeIgniter, и до сих пор я выигрываю (так сказать). Но я столкнулся с довольно нетривиальным вызовом (который полностью игнорирует большинство библиотек auth, но я настаиваю на правильном обращении с ним): как грамотно справляться с крупномасштабной, распределенной, переменной-username переборкой атаки.
Я знаю все обычные трюки:
- Ограничение # неудачных попыток на IP/хост и отказ в доступе правонарушителей (например, Fail2Ban) - который больше не работает поскольку ботнеты стали более умными
- Сочетание приведенного выше с черным списком известных "плохих" IP-адресов/хостов (например, DenyHosts), который полагается на бот-сети, падающие на # 1, которые они все больше не видят
- Белые списки IP/хостов в сочетании с традиционным auth (к сожалению, бесполезно с динамическими пользователями IP и высоким оттоком на большинстве веб-сайтов).
- Установка ограничения по сети для # неудачных попыток в течение N минут/часов и дросселирование (приостановка) всех попыток входа после этого в течение нескольких минут/часов (с проблемой, что DoS атака вы становитесь дочерней игрой ботнета)
- Обязательные цифровые подписи (сертификаты открытого ключа) или аппаратные токены RSA для всех пользователей, у которых нет опции входа/пароля NO (без сомнений, надежное решение, но только для закрытых специализированных сервисов)
- Насильственные сверхширокие схемы паролей (например, > 25 бессмысленных символов с символами - снова слишком непрактично для случайных пользователей)
- И, наконец, CAPTCHA (который может работать в большинстве случаев, но раздражает пользователей и практически бесполезен против a определяемый, находчивый злоумышленник)
Теперь это только теоретически обоснованные идеи. Есть много идей мусора, которые вскрывают сайт широко (например, к тривиальным DoS-атакам). Я хочу что-то лучше. И к лучшему я имею в виду:
-
Он должен быть защищен (+) от DoS и грубых атак, а также не вводить никаких новых уязвимостей, которые могли бы позволить слегка поддающемуся боту продолжать работать под радаром
-
Он должен быть автоматизирован. Если это требует, чтобы оператор-человек проверял каждый логин или контролировал подозрительную активность, он не будет работать в реальном сценарии
-
Это должно быть осуществимо для обычного использования в Интернете (т.е. высокой оттока, высокой громкости и открытой регистрации, которую могут выполнять не-программисты)
-
Это не может помешать работе пользователя до такой степени, что случайные пользователи будут раздражаться или расстраиваться (и, возможно, покинуть сайт).
-
Он не может привлекать котят, если они действительно действительно безопасные котята
(+) Под "безопасным" я имею в виду, по крайней мере, такую же безопасную, как и параноидальная способность пользователя хранить секретный пароль
Итак - пусть услышит! Как бы вы это сделали? Вы знаете о лучшей практике, о которой я не упомянул (о, пожалуйста, скажите, что вы сделали)? Я признаю, что у меня есть идея о моей собственной (сочетание идей от 3 и 4), но я позволю истинным экспертам говорить, прежде чем смущать себя; -)