Предотвращение перебора логинов на сайтах - PullRequest
52 голосов
/ 08 января 2009

В ответ на недавние угон Twitter'а и пост Джеффа о атаках по словарям , каков наилучший способ обезопасить ваш веб-сайт от атак методом "грубой силы"?

В сообщении Джеффа предлагается увеличивать задержку для каждой попытки входа в систему, и в комментариях предлагается добавить капчу после 2-й неудачной попытки.

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

Мысли? Предложения?

Ответы [ 13 ]

42 голосов
/ 08 января 2009

Я думаю, что короткий период блокировки базы данных для данной учетной записи (1-5 минут) - единственный способ справиться с этим. Каждый userid в вашей базе данных содержит timeOfLastFailedLogin и numberOfFailedAttempts. Когда numbeOfFailedAttempts > X вы блокируетесь на несколько минут.

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

В Азии есть хотя бы одна целая страна с NAT, поэтому IP-адреса не могут быть использованы ни для чего.

36 голосов
/ 08 января 2009

На мой взгляд, есть несколько возможностей, каждая из которых имеет свои плюсы и минусы:

Принудительное использование безопасных паролей

  • Pro : предотвратит атаки по словарю
  • Con : также предотвратит популярность, поскольку большинство пользователей не могут запомнить сложные пароли, даже если вы им объясняете, как их легко запомнить. Например, запоминание предложений: «Я купил 1 яблоко за 5 центов в торговом центре» приводит к «Ib1Af5CitM».

Блокировка после нескольких попыток

  • Pro : замедлит автоматизированные тесты
  • Con : легко заблокировать пользователей для третьих лиц
  • Con : сохранение их в базе данных может привести к большому количеству процессов записи в таких огромных сервисах, как Twitter или аналогичные.

CAPTCHAs

  • Pro : они препятствуют автоматическому тестированию
  • Con : они занимают вычислительное время
  • Con : "замедлит" пользовательский опыт
  • ОГРОМНЫЙ КОН : они НЕ безбарьерны

Простые проверки знаний

  • Pro : предотвратит автоматическое тестирование
  • Con : "Простое" в глазах смотрящего.
  • Con : "замедлит" работу пользователя

Другой логин и имя пользователя

  • Pro : Это одна из техник, которую едва ли можно увидеть, но на мой взгляд неплохое начало для предотвращения атак грубой силой.
  • Con : Зависит от выбора пользователем двух имен.

Используйте целые предложения в качестве паролей

  • Pro : увеличивает размер пространства поиска.
  • Pro : легче запомнить для большинства пользователей.
  • Con : Зависит от выбора пользователя.

Как видите, все "хорошие" решения зависят от выбора пользователя, который снова показывает пользователя как самый слабый элемент цепочки.

Есть еще предложения?

13 голосов
/ 08 января 2009

Вы можете делать то, что делает Google. Который после определенного количества попыток у них появляется каптача. Чем после нескольких раз с каптачей вы блокируете их на пару минут.

10 голосов
/ 08 января 2009

Я склонен согласиться с большинством других комментариев:

  • Блокировка после X неудачных попыток ввода пароля
  • Количество неудачных попыток ввода имени пользователя
  • При желании можно использовать CAPTCHA (например, попытки 1-2 являются нормальными, попытки 3-5 являются CAPTCHA'd, дальнейшие попытки блокируются на 15 минут).
  • При необходимости отправьте электронное письмо владельцу аккаунта, чтобы снять блокировку

Что я хотел отметить, так это то, что вы должны быть очень осторожны при использовании «надежных» паролей, поскольку это часто означает, что они будут просто записаны на почту на столе / прикреплены к монитору. Кроме того, некоторые политики паролей приводят к более предсказуемым паролям. Например:

Если пароль не может быть любым ранее использованным паролем и должен содержать число, есть большая вероятность, что это будет любой обычный пароль с порядковым номером после него. Если вам приходится менять пароль каждые 6 месяцев, а человек находился там два года, скорее всего, его пароль выглядит примерно так: password4 .

Скажем, вы ограничиваете его еще больше: должно быть не менее 8 символов, не может иметь последовательных букв, должно иметь букву, число и специальный символ (это настоящая политика паролей, которую многие считают безопасной). Пытаетесь взломать аккаунт Джона Куинси Смита? Знаете, он родился 6 марта? Есть большая вероятность, что его пароль будет выглядеть примерно так: jqs0306! (или, может быть, jqs0306 ~ ).

Теперь я не говорю, что позволить вашим пользователям иметь пароль пароль также является хорошей идеей, просто не обманывайте себя, думая, что ваши принудительные "безопасные" пароли безопасны.

7 голосов
/ 26 января 2009

Чтобы уточнить лучшие практики:

Что сказал krosenvold: зарегистрируйте num_failed_logins и last_failed_time в пользовательской таблице (кроме случаев, когда пользователь приостановлен), и как только число неудачных попыток входа в систему достигнет порога, вы приостанавливаете пользователя на 30 секунд или минуту. Это лучшая практика.

Этот метод эффективно устраняет атаки с использованием одного аккаунта и перебор слов. Однако это не мешает злоумышленнику переключаться между именами пользователей - т.е. сохраняя пароль фиксированным и пробуя его с большим количеством имен пользователей. Если на вашем сайте достаточно пользователей, такую ​​атаку можно продолжать в течение долгого времени, пока не закончатся неработающие аккаунты. Надеемся, что он будет проводить эту атаку с одного IP-адреса (хотя вряд ли, так как ботнеты действительно становятся инструментом торговли в эти дни), так что вы можете обнаружить это и заблокировать IP-адрес, но , если он распространяет атаку ... ну, это еще один вопрос (который я только что опубликовал здесь, поэтому, пожалуйста, проверьте его, если у вас нет) .

Еще одна вещь, которую следует помнить об исходной идее, это то, что вы, конечно же, должны все же попытаться пропустить законного пользователя, даже если аккаунт атакован и заблокирован - то есть, ЕСЛИ вы можете сказать реальному пользователю и бот врозь.

И вы МОЖЕТЕ, по крайней мере, двумя способами.

  1. Если у пользователя постоянный файл cookie для входа («запомнить меня»), просто дайте ему пройти.

  2. При отображении сообщения «Извините, ваша учетная запись приостановлена ​​из-за большого количества неудачных попыток входа в систему», добавьте ссылку « безопасный резервный вход в систему - ТОЛЬКО ЧЕЛОВЕК» (боты: не врать) ". Помимо шутки, когда они нажимают на эту ссылку, дайте им авторизованную reCAPTCHA форму входа, которая обходит статус приостановки учетной записи. Таким образом, ЕСЛИ они люди и знают правильный логин + пароль (и могут читать CAPTCHA), их никогда не будут беспокоить задержки, и ваш сайт будет невосприимчив к быстрым атакам.

Единственный недостаток: некоторые люди (например, люди с нарушениями зрения) не могут читать CAPTCHA, и они МОГУТ по-прежнему испытывать раздражающие задержки, вызванные ботами ЕСЛИ они не используют функция автологина.

Что не является недостатком: в файле cookie для автологина нет аналогичной встроенной меры безопасности. Вы спросите, почему это не недостаток? Потому что, пока вы реализовали его с умом, безопасный токен (эквивалент пароля) в вашем файле cookie для входа в систему вдвое больше битов (черт возьми, сделайте это в десять раз больше битов!), Чем ваш пароль, так что это грубое принуждение фактически не проблема . Но если вы действительно параноик, для хорошей настройки установите также задержку в одну секунду для функции автологина.

5 голосов
/ 08 января 2009

Вы должны внедрить кеш в приложение , а не , связанное с вашей базой данных для этой цели.

Во-первых, задержка только законных имен пользователей заставляет вас «отказаться» от массового использования вашей действующей клиентской базы, что само по себе может быть проблемой, даже если имя пользователя не является строго охраняемым секретом.

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

Он устойчив к высокоскоростным попыткам, из-за которых состояние DOS попадет в вашу базу данных.

Наконец, допустимо принимать некоторые решения на основе IP-адреса ... Если вы видите, что одиночные попытки с одного IP-адреса являются честной ошибкой по сравнению с несколькими IP-адресами, то Бог знает, сколько систем вы можете предпринять, чтобы принять другие меры предосторожности или уведомить конечный пользователь теневой деятельности.

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

4 голосов
/ 08 января 2009

Сделайте, как и большинство банков, заблокируйте имя пользователя / учетную запись после неудачного входа в систему X. Но я не буду таким строгим, как банк, потому что вы должны позвонить, чтобы разблокировать свой аккаунт. Я бы просто сделал временную блокировку из 1-5 минут. Если, конечно, веб-приложение так же чувствительно к данным, как и банк. :)

3 голосов
/ 22 мая 2018

Это старый пост. Однако я подумал о том, чтобы разместить здесь свои выводы, чтобы они могли помочь любому будущему разработчику.

Нам необходимо предотвратить атаку методом "грубой силы", чтобы злоумышленник не смог получить имя пользователя и пароль для входа на веб-сайт. Во многих системах они имеют некоторые открытые URL-адреса, для которых не требуется токен аутентификации или ключ API для авторизации. Большинство из этих API являются критическими. Например; API для регистрации, входа в систему и забытого пароля часто открыты (т.е. не требует проверки токена аутентификации). Мы должны убедиться, что услуги не злоупотребляют. Как указывалось ранее, я просто размещаю свои выводы здесь, изучая, как мы можем эффективно предотвратить атаку грубой силой.

Большинство распространенных методов профилактики уже обсуждались в этом посте. Я хотел бы добавить свои опасения в отношении блокировки учетной записи и IP-адреса. Я думаю, что блокировка учетных записей - плохая идея как метод предотвращения. Я помещаю некоторые пункты здесь, чтобы поддержать мое дело.

блокировка аккаунта плохая

  • Злоумышленник может вызвать отказ в обслуживании (DoS), заблокировав большое количество учетных записей.
  • Поскольку вы не можете заблокировать учетную запись, которая не существует, блокируются только действительные имена учетных записей. Злоумышленник может использовать этот факт для сбора имен пользователей с сайта, в зависимости от ответов об ошибках.
  • Злоумышленник может отвлечь внимание, заблокировав множество учетных записей и наполнив службу поддержки звонками в службу поддержки.
  • Злоумышленник может постоянно блокировать одну и ту же учетную запись, даже через несколько секунд после того, как администратор разблокирует ее, эффективно отключая учетную запись.
  • Блокировка учетной записи неэффективна против медленных атак, которые пытаются использовать только несколько паролей каждый час.
  • Блокировка учетной записи неэффективна против атак, которые пытаются использовать один пароль для большого списка имен пользователей.
  • Блокировка учетной записи неэффективна, если злоумышленник использует комбинированный список имени пользователя и пароля и правильно угадывает с первой пары попыток.
  • Мощные учетные записи, такие как учетные записи администратора, часто обходят политику блокировки, но они являются наиболее желательными учетными записями для атаки. Некоторые системы блокируют учетные записи администратора только при сетевых входах в систему.
  • Даже после того, как вы заблокируете учетную запись, атака может продолжаться, потребляя ценные человеческие и компьютерные ресурсы.
  • Рассмотрим, например, сайт аукциона, на котором несколько участников сражаются за один и тот же предмет. Если на веб-сайте аукциона предусмотрена блокировка аккаунта, один участник может просто заблокировать аккаунты других в последнюю минуту аукциона, не давая им возможности подать любые выигрышные заявки. Злоумышленник может использовать ту же технику для блокировки критических финансовых транзакций или обмена электронной почтой.

Блокировка IP-адреса для учетной записи тоже плохая идея

Другим решением является блокировка IP-адреса с несколькими неудачными входами в систему. Проблема с этим решением состоит в том, что вы можете непреднамеренно заблокировать большие группы пользователей, заблокировав прокси-сервер, используемый поставщиком услуг Интернета или крупной компанией. Другая проблема заключается в том, что многие инструменты используют списки прокси-серверов и отправляют только несколько запросов с каждого IP-адреса, прежде чем перейти к следующему. Используя широко доступные списки открытых прокси на веб-сайтах, таких как http://tools.rosinstrument.com/proxy/,, злоумышленник может легко обойти любой механизм блокировки IP. Поскольку большинство сайтов не блокируются после одного неудачного пароля, злоумышленник может использовать две или три попытки для одного прокси. Злоумышленник со списком из 1000 прокси-серверов может попытаться заблокировать 2000 или 3000 паролей. Тем не менее, несмотря на недостатки этого метода, сайты, которые подвергаются большому количеству атак, в частности сайты для взрослых, предпочитают блокировать IP-адреса прокси.

Мое предложение

  • Не блокировка учетной записи. Вместо этого мы могли бы рассмотреть возможность добавления преднамеренной задержки со стороны сервера при попытках входа / регистрации для последовательных неправильных попыток.
  • Отслеживание местоположения пользователя по IP-адресу при попытках входа в систему, что является распространенным методом, используемым Google и Facebook. Google отправляет OTP, в то время как Facebook предоставляет другие проблемы безопасности, такие как обнаружение друзей пользователя по фотографиям.
  • Google re-captcha для веб-приложения, SafetyNet для Android и соответствующая техника аттестации мобильных приложений для iOS - в запросах на вход в систему или регистрацию.
  • Cookie устройства
  • Создание системы мониторинга вызовов API для обнаружения необычных вызовов для определенной конечной точки API.

Объясненные предложения

Преднамеренная задержка ответа

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

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

Проблемы безопасности

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

Мы могли бы рассмотреть вопрос о включении, когда мы будем бросать вызовы безопасности? Есть несколько моментов, где мы можем.

  • Когда пользователь пытается войти в систему с того места, где его раньше не было.
  • Неправильные попытки входа в систему.

С какой проблемой безопасности может столкнуться пользователь?

  • Если пользователь задает вопросы безопасности, мы можем подумать о том, чтобы спросить у них ответы на них.
  • Для таких приложений, как Whatsapp, Viber и т. Д. Мы могли бы рассмотреть возможность выбора случайных имен контактов из телефонной книги и попросить ввести их номера или наоборот.
  • Для транзакционных систем мы могли бы рассмотреть вопрос о запросе пользователя о последних транзакциях и платежах.

Панель мониторинга API

Создание панели мониторинга для вызовов API.

  • Ищите условия, которые могут указывать на грубую атаку или другое злоупотребление учетной записью в панели мониторинга API.
  • Множество неудачных входов с одного IP-адреса.
  • Вход в систему с несколькими именами пользователей с одного IP-адреса.
  • Логины для одной учетной записи, поступающей с разных IP-адресов.
  • Чрезмерное использование и потребление полосы пропускания от одного использования.
  • Неудачные попытки входа в систему с алфавитно-последовательными именами пользователей или паролями.
  • Логины с подозрительными паролями, которые обычно используют хакеры, такие как ownsyou (ownzyou), washere (wazhere), фанатики, hacksyou и т. Д.

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

Вот некоторые хорошие чтения.

3 голосов
/ 08 января 2009

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

Кстати, после третьей неудачной попытки (в течение определенного времени) вы можете заблокировать учетную запись и отправить владельцу сообщение о выпуске. Письмо содержит ссылку для разблокировки аккаунта. Это небольшая нагрузка на пользователя, но взломщик заблокирован. И если даже почтовый аккаунт взломан, вы можете установить ограничение на количество разблокировок в день.

2 голосов
/ 08 января 2009

Многие онлайн-доски объявлений, на которые я вхожу онлайн, дают мне 5 попыток входа в учетную запись, после этих 5 попыток учетная запись блокируется на час или пятнадцать минут. Это может быть не красиво, но это, безусловно, замедлит атаку по словарю на один аккаунт. Теперь ничто не останавливает словарную атаку против нескольких учетных записей одновременно. Т.е. попробуйте 5 раз, переключитесь на другую учетную запись, попробуйте еще 5 раз, затем обведите обратно. Но это точно замедляет атаку.

Лучшая защита от атаки по словарю - убедиться, что пароли отсутствуют в словаре !!! По сути, настраивают какую-то политику паролей, которая проверяет словарь на соответствие буквам и требует цифры или символа в пароле. Это, вероятно, лучшая защита от атаки по словарю.

...