Защита сайта от брутфорс и ддос атак

Чтобы понять, как защитить веб-систему от брутфорс или ддос атак, необходимо разобраться, что они из себя представляют.

Подробно о брутфорсах было раскатано ранее.

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

Так же «ддосить» эффективнее всего страницы, которые потребляют больше всего ресурсов вашего сервиса, а брутфорсят форму авторизации/восстановления пароля или же аналогичные АПИ для авторизации или восстановления пароля. При этом, злоумышленникам выгоднее, если ваш сайт, все таки доступен, так что они, скорее всего позаботятся, чтобы нагрузка была равномерная.

Итак, общие методы защиты и от брутфорса и от ддоса будут следующие:

  • Выставление лимитов на количество запросов в секунду/минут на уровне веб-сервера
  • Использование инструментов, которые автоматизируют блокировки айпи-адресов или user-agent клиентов, если количество запросов или ошибок блокировки превышает пороговое значение (например, fail2ban)
  • Косвенным инструментом, так же, являются панели мониторинга, настроенные на количество запросов или ошибок, которые позволят оперативно реагировать на параметры, отличные от нормальной ситуации
Пример одного из даш-бордов из Grafana со статусами ответов и ошибок
  • Настроенные уведомления, при изменении поведения вашей системы, т.е. потенциальных атаках
  • Так же важны обновления операционной системы и настройки веб-сервера на соответствующие нагрузки

Что еще можно добавить по бтурфорсам, отдельно

  • Собственные лимиты на формы и АПИ авторизации, восстановления паролей, которые могут быть строже, чем на «любую» страницу
  • На веб-формы можно повесить капчи (google recaptcha) и CSRF-защиту
  • Дву-факторная авторизация (например, с помощью СМС-шлюза или же Google Authenticator)
  • Уведомления пользователям, в случае, если произошла авторизация из неизвестного устройства или локации

Из косвенных методов зашиты:

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

Простейшие методы XSS защиты

В мире веб разработки очень важно рассматривать свой код с точки зрения безопасности от взлома и инъекций.

Особенно если это работа с web запросами и(или) куками
Особенно если есть работа и запись в базу данных
Особенно если проект работает с деньгами

Работу (особенно эту “рутину”) облегчают фреймворки. В любом современной фреймворке есть методы очищающие или защищающие параметры запроса от инъекций или вредоносного кода. Их преимущества в универсальности. Их недостатки в производительности.

Кстати, один из видов вредоносного вектора атаки — это эксплуатировать время очистки параметров от скриптов (для упрощения будем называть это XSS). Т.е., злоумышленник посылает множество запросов в ту область которая будет долго обрабатывать запросы и тормозить сервер. Ведь под капотом стандартных методов защиты от XSS различные сложные регулярные выражения с заменами.

Альтернативой являются простейшие методы защиты от XSS, там, где это применимо

  1. Приведение к простейшему типу.
    Если мы знаем, что получаемый GET параметр должен быть целочисленным — мы просто можем привести его к целочисленному перед дальнейшем обработкой или же отклонять запросы, если этот параметр не целочисленный.
    Так же можно поступать, если, например, мы знаем, что получаемый параметр может принимать только определенные значения.
$cleanParam = (int)$_GET["dirtyParam"];
  1. Простые регулярные выражения, заточенные под получаемый параметр
    Обрабатываемый параметр может, например, состоять только из цифр и букв английского алфавита. Незачем “прогонять” его по всем кругам регулярно стандартной защиты от XSS. Можно написать простую регулярку.
if( preg_match("/^[a-zA-Z\d]+$/", $_COOKIE["dirtyParam"]) )