Настройка Rack-attack gem для защиты Rails и Rack-приложений от плохих клиентов

Rack промежуточное ПО для блокировки & дросселирования оскорбительных запросов. Защитите свои Rails и Rack-приложения от плохих клиентов. Rack::Attack позволяет вам быстро решить, когда разрешать, блокировать и дросселировать запрос, основываясь на его свойствах.

Используя этот гем, вы можете спасти свое веб-приложение от атак, мы можем составлять белые списки IP, блокировать запросы в соответствии с требованиями и многое другое…

Установите гем Rack-attack:

# In your Gemfile
gem 'rack-attack'
Вход в полноэкранный режим Выйти из полноэкранного режима

Подключение к приложению

Затем укажите вашему веб-приложению на языке ruby использовать rack-attack в качестве промежуточного ПО.

# config/application.rb
# rack attack middleware
config.middleware.use Rack::Attack
Войти в полноэкранный режим Выйти из полноэкранного режима

Как только вы это сделаете, вам нужно будет настроить его. Вы можете сделать это, создав файл config/initializers/rack-attack.rband, добавив в него правила, соответствующие вашим потребностям.

Вы можете отключить его навсегда (например, для определенного окружения) или временно (может быть полезно для определенных тестовых случаев), написав:

Использование

Безопасный список

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

  • safelist_ip(ip_address_string)
Rack::Attack.safelist_ip(“5.6.7.8”)
Вход в полноэкранный режим Выйти из полноэкранного режима
  • safelist_ip(ip_subnet_string)
Rack::Attack.safelist_ip(“5.6.7.0/24”)
Войти в полноэкранный режим Выход из полноэкранного режима
  • safelist(name, &block)

Назовите ваш пользовательский список safelist и сделайте так, чтобы ваш аргумент ruby-block возвращал истинное значение, если вы хотите, чтобы запрос был разрешен, и false в противном случае.

Блокирование

  • blocklist_ip(ip_address_string)
 Rack::Attack.blocklist_ip(“1.2.3.4”)
Вход в полноэкранный режим Выйти из полноэкранного режима
  • blocklist_ip(ip_subnet_string)
 Rack::Attack.blocklist_ip(“1.2.0.0/16”)
Войти в полноэкранный режим Выход из полноэкранного режима
  • blocklist(name, &block)

Назовите ваш пользовательский список блокировки и сделайте так, чтобы ваш аргумент ruby-block возвращал истинное значение, если вы хотите, чтобы запрос был заблокирован, и false в противном случае.

Дросселирование

*throttle(name, options, &block) *( в качестве опций укажите limit и period)

Состояние дросселя хранится в настраиваемом кэше (который по умолчанию использует Rails.cache, если он присутствует).

Назовите ваш пользовательский дроссель, укажите limit и period в качестве опций и сделайте так, чтобы ваш аргумент ruby-block возвращал дискриминатор. Этот дискриминатор — это то, как вы указываете rack-attack, что вы ограничиваете: по IP-адресу, по электронной почте пользователя или по любому другому.

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

    Страница ошибки:

  • Если мы хотим ограничить запросы/IP и если лимит запросов увеличивается, то отправить письмо с напоминанием.

Например, мы хотим разрешить только 300 запросов в 30 секунд, после чего будем ограничивать запросы с этого IP до начала следующего 30-секундного интервала.

Получите письмо с ошибкой, если лимит будет увеличен.


Производительность

Накладные расходы при работе Rack::Attack обычно незначительны (несколько миллисекунд на запрос), но это зависит от того, сколько проверок вы настроили, и сколько времени они занимают. Дросселирование обычно требует сетевого обхода до вашего кэш-сервера (серверов), поэтому старайтесь, чтобы количество проверок дросселей на запрос было небольшим.

Если запрос занесен в список блокировки или дросселирован, ответом будет очень простой Rack-ответ. Один типичный поток веб-сервера ruby может блокировать несколько сотен запросов в секунду.

Пример файла rack-attack.rb

Дополнительная информация: https://github.com/rack/rack-attack

Если это руководство оказалось полезным для вас и вашей команды, пожалуйста, поделитесь им с другими!

Оцените статью
devanswers.ru
Добавить комментарий