Балансировщик Zen Load Balancer (ZenLB) и логи на Back-End веб-серверах IIS

imageПрочитав предыдущую заметку, один из моих коллег высказал замечание о том, что использование внешних балансировщиков может вызвать такой побочный эффект, как искажение информации в логах на бак-энд веб-серверах IIS об адресе клиента, который выполняет запросы к веб-серверу. То есть возникает потенциальная угроза того, что в нужный момент будет невозможно достоверно определить адрес клиента, обращающегося к веб-серверу находящемуся за таким балансировщиком.

Посмотрев в лог веб-сервера IIS, который в моём случае выступал в качестве бак-энда, я обнаружил подтверждение описанной проблемы. В поле, где должен был отображаться IP адрес клиентского компьютера, был указан IP адрес балансировщика, через который к веб-серверу прошёл клиентский запрос:

#Software: Microsoft Internet Information Services 8.5
#Version: 1.0
#Date: 2015-12-03 12:05:33
#Fields: date time s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs(User-Agent) cs(Referer) sc-status sc-substatus sc-win32-status time-taken


2015-12-03 13:48:19 10.1.0.93 GET /help - 8080 KOM\petya 10.1.0.211 Mozilla/5.0+(Windows+NT+10.0;+WOW64;+Trident/7.0;+rv:11.0)+like+Gecko http://kom-ad01-appvcl.holding.com:8080/ 200 0 0 30

Если говорить об этой ситуации применительно к ZenLB, то он для ферм балансировки HTTP использует функционал pound, который в свою очередь, по некоторой информации, добавляет в заголовки HTTP-пакетов информацию о первичном IP клиента. Чтобы проверить это, на бак-энд веб-сервер, расположенный за балансировщиком ZenLB, был установлен анализатор трафика Microsoft Message Analyzer, который показал, что среди заголовков, приходящих в запросе к IIS есть заголовок X-Forwarded-For, который и содержит IP адрес конечного клиента.

image

Таким образом, всё, что нам нужно сделать, это объяснить нашему веб-серверу IIS то, каким образом необходимо логировать приходящие запросы клиентов. В используемом в нашем случае IIS 8.5 в составе Windows Server 2012 R2 имеется встроенная возможность, называемая Enhanced Logging, которая позволяет расширять возможности базового логирования IIS. Это позволит нам изменить используемый по умолчанию формат логирования, расширив его заголовком X-Forwarded-For. Для этого перейдём на веб-сервере в оснастку IIS Manager, выберем веб-сайт, который предоставлен пользователям через внешний балансировщик и в разделе настроек Health and Diagnostics выберем Logging 

image

В настройках параметров логирования рядом с окном выбора формата логирования нажмём кнопку Select Fields

image

В открывшемся списке полей логирования в формате W3C нажмём кнопку добавления нового поля Add Field, после чего введём произвольное имя поля (так оно будет отображаться в логе), в качестве типа ресурса выберем Request Header, в поле Source введём значение X-Forwarded-For, после чего сохраним параметры логирования и нажмём в панели действий Apply, чтобы изменения вступили в силу…

image

Теперь снова обратимся браузером с клиентского компьютера на URL, который транслируется через ферму балансировки ZenLB на наш бак-энд веб-сервер. В каталоге логов IIS появится новый лог файл с именем u_ex*_x.log и содержимым включающим в себя добавленную информацию о дополнительном заголовке HTTP:

#Software: Microsoft Internet Information Services 8.5
#Version: 1.0
#Date: 2015-12-04 13:00:34
#Fields: date time s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs(User-Agent) cs(Referer) sc-status sc-substatus sc-win32-status time-taken original-cl-ip

2015-12-04 13:00:31 10.1.0.93 GET / - 8080 KOM\petya 10.1.0.211 Mozilla/5.0+(Windows+NT+10.0;+WOW64;+Trident/7.0;+rv:11.0)+like+Gecko - 404 0 0 1019 10.16.1.1

Как видим, желаемый результат достигнут.

 

Дополнительные источники информации:

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