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
Если это руководство оказалось полезным для вас и вашей команды, пожалуйста, поделитесь им с другими!