Как получить разрешенное через DNS имя удаленного хоста при использовании Nginx и ModSecurity?

Вопрос или проблема

Вопрос 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-резолвера для получения имени хоста. Тем не менее, есть несколько обходных путей:

  1. Использование внешнего скрипта: Вы можете написать скрипт на Perl, Python или другом языке программирования, который будет запускаться через ngx_http_perl_module или ngx_http_python_module. Этот скрипт может принимать IP-адрес, выполнять DNS-запрос и возвращать имя хоста.

  2. Использование 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
       }
    }
  3. Путём обращения к API: Вы можете создавать запросы к внешним API-сервисам, которые преобразуют IP-адреса в имена хостов. Однако в этом случае следует учитывать задержку, связанную с сетевыми запросами, и вероятность отказа API.

Заключение

Текущая архитектура Nginx не подразумевает разрешения имени хоста через DNS аналогично Apache, что затрудняет использование переменной REMOTE_HOST. Однако, используя обходные методы, такие как Lua или внешние скрипты, вы можете реализовать функционал, схожий с тем, что предлагает Apache.

Важно также помнить о компромиссах с производительностью и безопасностью при использовании дополнительных скриптов или внешних API, особенно если они будут обрабатывать чувствительные данные.

SEO-оптимизация

Чтобы ваша статья была найдена пользователями в поисковых системах, рекомендуется использовать ключевые слова, такие как "Nginx", "ModSecurity", "DNS-резолвера", "REMOTE_HOST", "безопасность веб-сервера", "проверка имени хоста", а также интегрировать их в заголовки и подзаголовки, если возможно.

Оцените материал
Добавить комментарий

Капча загружается...