Как отключить проверку IP-спуфинга в приложении Rails 4?

Я получаю следующую ошибку в своем приложении Rails 4:

ActionDispatch::RemoteIp::IpSpoofAttackError: Атака с подменой IP?! HTTP_CLIENT_IP=xx.xx.xx.xx HTTP_X_FORWARDED_FOR=xx.xx.xx.xx

Нам не нужен этот тип проверки безопасности, поэтому после некоторого поиска в Google я нашел это:

https://github.com/rails/rails/issues/10780

Когда промежуточный прокси-сервер вставляет IP-адрес пользователя как в HTTP_CLIENT_IP, так и в HTTP_X_FORWARDED_FOR, и этот адрес является частным, ActionDispatch::RemoteIp вызывает исключение IpSpoofAttackError.

Когда корпоративный прокси-сервер включает IP-адрес пользователя в заголовок, он обычно является частным. Удаление частных IP-адресов из цепочки, содержащейся в HTTP_X_FORWARDED_FOR, вероятно, должно выполняться только в том случае, если адрес не точно совпадает с адресом, найденным в HTTP_CLIENT_IP. Если это совпадение, это должен быть IP-адрес пользователя.

Это происходит, например, со следующей средой:

HTTP_CLIENT_IP: 172.17.19.51 HTTP_X_BLUECOAT_VIA: ffffffffffffffff HTTP_X_FORWARDED_FOR: 172.17.19.51 REMOTE_ADDR: xxx.xxx.xxx.xxx (это будет общедоступный IP-адрес)


Исправление представлено здесь:

В качестве обходного пути я отключил эту проверку в config/application.rb:

config.action_dispatch.ip_spoofing_check = ложь

Однако это, похоже, не работает в Rails 4. Что такое новый вызов и как мне установить его на весь сайт?


person sergserg    schedule 14.01.2015    source источник


Ответы (3)


Вместо того, чтобы отключать предупреждение, может быть лучше решить реальную проблему. Вот моя перефразировка того, что говорит вам Rails:

Похоже, что этот запрос пришел через два разных обратных прокси-сервера. Один из них устанавливает в заголовке CLIENT_IP IP-адрес пользователя; другой устанавливает заголовок X_FORWARDED_FOR. Одно из этих значений, вероятно, правильное, другое, вероятно, содержит IP-адрес обратного прокси-сервера, и я не могу сказать, какое именно. Я не могу достоверно определить IP-адрес этого пользователя, поэтому отклоню запрос.

«Правильное» решение — прекратить установку обоих заголовков. Для этого вам нужно отследить, откуда они берутся (я бы начал с вашего устройства Bluecoat), и выяснить, нужны ли они оба. Обычно вы будете использовать только один или другой.

Если выяснится, что они оба нужны (я видел более странные вещи), вам нужно будет выяснить, какой заголовок устанавливается первым (при условии, что в цепочке два прокси). Затем вы можете написать собственное промежуточное ПО, которое удаляет другой заголовок HTTP.

См. Промежуточное ПО Rails 3 изменяет заголовки запроса, чтобы узнать, как создать собственное промежуточное ПО. . Вставьте его перед промежуточным программным обеспечением RemoteIp, очистите тот заголовок, который имеет «плохое» значение, и все будет хорошо.

person James Mason    schedule 06.07.2015

config.action_dispatch.ip_spoofing_check должен работать на основе цепочка вызовов для Удаленный IP-адрес.

Вы должны иметь возможность добиться того же эффекта, установив config.action_dispatch.trusted_proxies в регулярное выражение, соответствующее всем IPv4-адресам.

person fylooi    schedule 30.06.2015

config.action_dispatch.ip_spoofing_check = false по-прежнему является правильной настройкой.

Однако web-console (по умолчанию входит в среду Rails development, начиная с Rails 4.2) не соблюдает это правило. и повышает IpSpoofAttackError всякий раз, когда он включен в стек приложения, даже если spoofing_check равно false. Обходной путь для этой проблемы — удалить web-console из стека приложений вашей среды.

См. rails/rails#32379 и rails/web-console#254 для получения более подробной информации об этой проблеме и предлагаемом исправлении.

person wjordan    schedule 29.03.2018