Вопрос или проблема
Вопрос mod_security с OWASP CRS: Пользовательское правило для внесения googlebot в белый список предоставляет следующее правило в качестве ответа для проверки имени хоста клиента:
SecRule REMOTE_HOST “@rx google(bot|)\.com$” “id:50000,nolog,allow”
Это правило предназначалось для использования с ModSecurity и Apache и требовало директиву HostnameLookups On
, настроенную в Apache. В РУКОВОДСТВЕ ПО MODSECURITY говорится:
REMOTE_HOST
Если директива Apache HostnameLookups установлена в On, то эта переменная будет содержать удаленное имя хоста, разрешенное через DNS. Если директива установлена в Off, эта переменная будет содержать удалённый IP-адрес (такой же, как REMOTE_ADDR). Возможные применения этой переменной включают отказ в доступе известным плохим клиентским хостам или сетевым блокам или, наоборот, разрешение доступа авторизованным хостам.
При использовании Nginx в качестве обратного прокси без Apache существует ли способ сделать так, чтобы REMOTE_HOST
возвращал имя хоста, разрешенное через DNS?
Удалённый IP-адрес уже находится в переменной nginx $remote_addr
и переменной ModSecurity REMOTE_ADDR
. Справочное руководство говорит:
REMOTE_ADDR
Эта переменная содержит IP-адрес удаленного клиента.
SecRule REMOTE_ADDR "@ipMatch 192.168.1.101" "id:35"
Вы должны использовать REMOTE_ADDR
здесь (и, вероятно, пользователи Apache также должны).
Это было преднамеренно не реализовано.
См. например https://forum.nginx.org/read.php?2,214506,214512#msg-214512.
Ответ или решение
Вопрос об разрешении удалённого хоста через DNS при использовании Nginx и ModSecurity поднимает важные аспекты конфигурации веб-серверов, особенно в контексте повышения безопасности и управления доступом.
Введение в проблему
Механизм проверки клиента по имени хоста может быть важен для отказа или разрешения определённых запросов. Для Apache существует указание HostnameLookups On
, которое активирует возможность разрешения имени хоста, что позволяет использовать переменную REMOTE_HOST
. Однако ситуация обстоит иначе в Nginx.
Nginx и ModSecurity
В стандартной конфигурации Nginx нет прямой возможности преобразования IP-адреса клиента в имя хоста через переменную REMOTE_HOST
, как это реализовано в Apache. Вместо этого, в Nginx вы можете работать с переменной $remote_addr
, которая содержит IP-адрес удалённого клиента.
Возможные решения
На данный момент в Nginx нет встроенных директив, которые бы позволяли просто раскомментировать вызов DNS-резолвера для получения имени хоста. Тем не менее, есть несколько обходных путей:
-
Использование внешнего скрипта: Вы можете написать скрипт на Perl, Python или другом языке программирования, который будет запускаться через
ngx_http_perl_module
илиngx_http_python_module
. Этот скрипт может принимать IP-адрес, выполнять DNS-запрос и возвращать имя хоста. -
Использование Lua: Если у вас установлен модуль
ngx_http_lua_module
, вы можете использовать Lua для выполнения DNS-запросов. Вот пример, как это может выглядеть:location / { access_by_lua_block { local resolver = require "resty.dns.resolver" local r = resolver:new{ nameservers = { "8.8.8.8", "8.8.4.4" }, timeout = 2000, -- timeout in milliseconds } local answers, err = r:query(ngx.var.remote_addr) if answers and #answers > 0 then for _, ans in ipairs(answers) do if ans.address then ngx.req.set_header("X-Remote-Host", ans.name) end end end } }
-
Путём обращения к API: Вы можете создавать запросы к внешним API-сервисам, которые преобразуют IP-адреса в имена хостов. Однако в этом случае следует учитывать задержку, связанную с сетевыми запросами, и вероятность отказа API.
Заключение
Текущая архитектура Nginx не подразумевает разрешения имени хоста через DNS аналогично Apache, что затрудняет использование переменной REMOTE_HOST
. Однако, используя обходные методы, такие как Lua или внешние скрипты, вы можете реализовать функционал, схожий с тем, что предлагает Apache.
Важно также помнить о компромиссах с производительностью и безопасностью при использовании дополнительных скриптов или внешних API, особенно если они будут обрабатывать чувствительные данные.
SEO-оптимизация
Чтобы ваша статья была найдена пользователями в поисковых системах, рекомендуется использовать ключевые слова, такие как "Nginx", "ModSecurity", "DNS-резолвера", "REMOTE_HOST", "безопасность веб-сервера", "проверка имени хоста", а также интегрировать их в заголовки и подзаголовки, если возможно.