Анализатор логов 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.
-
На сервере создайте директорию
mitigator-logan
:mkdir -p /opt/mitigator-logan
-
Скачайте
docker-compose.yml
:wget https://docs.mitigator.ru/master/dist/logan/docker-compose.yml \ -O /opt/mitigator-logan/docker-compose.yml
-
Создайте службу для запуска Logan на внешнем сервере:
Скачайте файл сервиса:
wget https://docs.mitigator.ru/master/dist/docker-compose@.service \ -O /etc/systemd/system/docker-compose@.service
Активируйте службу:
systemctl enable docker-compose@mitigator-logan
-
Настройте взаимодействия с MITIGATOR по VPN:
Экземпляры MITIGATOR взаимодействуют через Wireguard, между ними создается виртуальная сеть (VPN). Чтобы Logan мог взаимодействовать с другими экземплярами MITIGATOR, нужно настроить VPN, также как для всех экземпляров внутри кластера.
-
На внешнем сервере запустите сервисы:
-
Войдите на docker.mitigator.ru
docker login docker.mitigator.ru
-
Перейдите в рабочую директорию
cd /opt/mitigator-logan
-
Загрузите образы
docker-compose pull
-
Запустите сервис
systemctl start docker-compose@mitigator-logan
-
-
Проверьте связность между сервером 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).
-
По умолчанию 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
– имя формата лога. -
В файле настроек сайта, например,
/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;
-
Перезапустите 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
:
- Добавить IP-адрес Proxy-сервера в список доверенных:
set_real_ip_from 192.168.0.1/32;
Здесь 192.168.0.1/32 – IP-адрес Proxy-сервера.
- Задать заголовок “X-Forwarded-For” в качестве источника
real_ip_header X-Forwarded-For;
В файле /etc/nginx/nginx.conf
на Proxy-сервере в секции server
:
- Настроить отправку реального адреса в заголовке
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)]"'