Анализатор логов Web-сервера

Информация

Функциональность анализа логов лицензируется отдельно.

Logan это функциональность MITIGATOR для анализа логов защищаемого Web-сервера (HTTP, HTTPS), выявления аномалий и атакующих адресов. Защищаемые сервера отправляют свои логи на Logan, используя syslog RFC 3164 (UDP, TCP, TLS).

Logan может располагаться на том же сервере, что и остальной MITIGATOR, или отдельно.

Logan на экземпляре MITIGATOR

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

По умолчанию Logan на экземпляре MITIGATOR отключен. Чтобы включить Logan на экземпляре MITIGATOR нужно в файле docker-compose.yml изменить для Logan значение параметра scale c 0 на 1.

services:
  ...
  logan:
    ...
    scale: 1
    ...

Logan на внешнем сервере

В кластерной инсталляции для перераспределения нагрузки можно вынести Logan на отдельный сервер.

Подготовка внешнего сервера

Предполагается, что на внешний сервер уже установлены Docker, docker-compose и wireguard-dkms.

  1. На сервере создайте директорию mitigator-logan:

    mkdir -p /opt/mitigator-logan
  2. Скачайте docker-compose.yml:

    wget https://docs.mitigator.ru/master/dist/logan/docker-compose.yml \
        -O /opt/mitigator-logan/docker-compose.yml
  3. Создайте службу для запуска Logan на внешнем сервере:

    Скачайте файл сервиса:

    wget https://docs.mitigator.ru/master/dist/docker-compose@.service \
        -O /etc/systemd/system/docker-compose@.service

    Активируйте службу:

    systemctl enable docker-compose@mitigator-logan
  4. Настройте взаимодействия с MITIGATOR по VPN:

    Экземпляры MITIGATOR взаимодействуют через Wireguard, между ними создается виртуальная сеть (VPN). Чтобы Logan мог взаимодействовать с другими экземплярами MITIGATOR, нужно настроить VPN, также как для всех экземпляров внутри кластера.

  5. На внешнем сервере запустите сервисы:

    • Войдите на docker.mitigator.ru

      docker login docker.mitigator.ru
    • Перейдите в рабочую директорию

      cd /opt/mitigator-logan
    • Загрузите образы

      docker-compose pull
    • Запустите сервис

      systemctl start docker-compose@mitigator-logan
  6. Проверьте связность между сервером Logan с экземплярами MITIGATOR:

    • Выполните команду

      docker-compose exec gateway wg
    • Убедитесь в наличии handshake между всеми участниками VPN-сети.

Настройка в Web-интерфейсе

Для работы Logan как на экземпляре MITIGATOR, так и на внешнем сервере, необходимо задать адрес и порт внутри VPN, по которым доступен Logan. Адрес и порт задаются в виде 10.8.3.254:7200 на странице «Настройка системы» в карточке «Общие параметры защиты».

Дальнейшая работа с Logan выполняется на вкладке «Анализ логов» страницы «Политика защиты». В первую очередь нужно задать правила, по которым будет работать Logan, на вкладке «Настройки».

Подробное описание синтаксиса правил для обработки поступающих на Logan логов Web-сервера, получаемой статистики и элементов Web-интерфейса во встроенной справке MITIGATOR.

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

Настройка отправки логов на Web-сервере

Logan получает логи на портах:

  • 7201 – UDP;
  • 7202 – TCP;
  • 7203 – TLS поверх TCP.

Отправка логов с NGINX

NGINX позволяет сразу отправлять свои логи по syslog без использования сторонних приложений (syslog-ng, rsyslog).

  1. По умолчанию nginx использует формат логов «combined», который не содержит информацию о времени обработки запроса $request_time. Свой формат логов можно определить в файле /etc/nginx/nginx.conf.

    log_format myformat '$remote_addr - $remote_user [$time_local] "$request" $request_time $status $body_bytes_sent "$http_referer" "$http_user_agent"';

    Здесь myformat – имя формата лога.

  2. В файле настроек сайта, например, /etc/nginx/sites-enabled/default, задайте:

    access_log syslog:server=192.0.2.1:7201,tag=123456789abcdefg myformat;

    Здесь server=192.0.2.1:7201 – IP-адрес и порт анализатора логов.

    Через tag= задается секретный идентификатор (токен), позволяющий определить, к какому сервису относится запись в логе, его знают только администраторы защищаемого сервиса и политики защиты. Токен должен содержать 16 символов. Если tag= задан пустым, то в качестве токена в MITIGATOR используется IP-адрес, с которого отправляется access_log.

    access_log syslog:server=10.10.10.4:7201,tag= myformat;
  3. Перезапустите NGINX.

    systemctl restart nginx

NGINX за PROXY

Если nginx защищаемого сервера находится за прокси или балансировщиком трафика, то должна быть настроена подстановка реальных IP-адресов отправителей из заголовка X-Forwarded-For. Для этого требуется наличие в nginx модуля http_realip_module.

Проверить, что модуль http_realip_module установлен можно с помощью команды:

2>&1 nginx -V | tr -- - '\n' | grep http_realip_module

Если модуль не установлен, следует пересобрать nginx с параметром --with-http_realip_module.

В файле /etc/nginx/nginx.conf на защищаемом сервере в секции http:

  1. Добавить IP-адрес Proxy-сервера в список доверенных:
set_real_ip_from 192.168.0.1/32;

Здесь 192.168.0.1/32 – IP-адрес Proxy-сервера.

  1. Задать заголовок “X-Forwarded-For” в качестве источника
real_ip_header X-Forwarded-For;

В файле /etc/nginx/nginx.conf на Proxy-сервере в секции server:

  1. Настроить отправку реального адреса в заголовке X-Real-IP header
proxy_set_header X-Real-IP $remote_addr;

Отправка логов с помощью Syslog-ng

Приблизительная конфигурация файла /etc/syslog-ng/conf.d/mitigator_log.conf приведена ниже:

source s_source {
file("/var/log/nginx/access.log" flags(no-parse));
};

destination d_MITIGATOR {
syslog("10.10.10.4" transport("udp") port(7201));
};

log {
source(s_source);
destination(d_MITIGATOR);
};

Соответствие между форматами логов для различных reverse-proxy

Выше, в примере настройки, указан формат логов для NGINX.

'$remote_addr - $remote_user [$time_local] "$request" $request_time $status $body_bytes_sent "$http_referer" "$http_user_agent"'

Дяя других reverse-proxy тот же формат логов задается следующим образом:

Apache

""%a %u %t \"%r\" %T %>s %b \"%{Referer}i\" \"%{User-Agent}i\""

Haproxy

capture request header Referer len 128
capture request header User-Agent len 128

log-format '%ci - - [%Tl] "%r" %TR %ST %B "%[capture.req.hdr(0)]" "%[capture.req.hdr(1)]"'