Поддерживается как физические, так и виртуальные машины (KVM, VMWare).
Образ подходит для VirtualBox, VMWare ESXi 6.5 и выше.
Скачать OVA-файл.
Импортировать OVA:
Выбрать сети:
После первого запуска и при обновлении (учетная запись: root:mitigator
):
Для VirtualBox: исполнить /usr/local/bin/virtual-box_prepare.sh
, либо поменять адреса сетевых портов вручную (см. ниже).
При обновлении:
cd /srv/mitigator
wget https://docs.mitigator.ru/dist/docker-compose.yml
wget https://docs.mitigator.ru/dist/env -O /srv/mitigator/.env
docker login docker.mitigator.ru
systemctl restart mitigator
Подробней о назначении файлов можно почитать в инструкции по ручной установке.
for e in s/0b:00.0/00:09.0/ s/13:00.0/00:0a.0/; do
for f in /etc/systemd/system/mitigator.service.d/nics.conf /srv/mitigator/data-plane.conf; do
sed -e ${e} -i ${f}
done
done
systemctl daemon-reload
Playbook работает для Debian 9 и 10, Ubuntu 16.04+, CentOS 7.2. Необходим доступ от целевой машины к репозитариям дистрибутива
1. Установить Ansible (пример для Debian/Ubuntu):
sudo apt-get --yes install ansible tar wget
2. Установить Docker и Docker-Compose:
Следуя официальной документации по установке для вашей ОС:
Если в системе отсутствует /etc/docker/daemon.json
, будет установлен следующий:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "50m",
"max-file": "2"
}
}
Существующий файл изменен не будет, в этом случае следует совместить конфигурации вручную.
3. Скачать и распаковать необходимые файлы:
wget https://docs.mitigator.ru/ansible/mitigator.tar -O- | tar -x
wget https://docs.mitigator.ru/ansible/config.yml -O mitigator/config.yml
4. Отредактировать mitigator/config.yml
(параметры по умолчанию
годятся для минимальной конфигурации):
---
mitigator_arch: "nehalem"
mitigator_nic_driver: vfio-pci
mitigator_nics:
- pci_address: "0000:0b:00.0"
lcore: 1
- pci_address: "0000:13:00.0"
lcore: 2
mitigator_nr_addrs: 131072
mitigator_hugepage_size: "2M"
mitigator_hugepage_nr: 1536
mitigator_nr_policies: 100
#mitigator_version: latest
mitigator_registry_user: guest
mitigator_registry_pass: mitigator
mitigator_pull_images: y
#mitigator_http_proxy: ""
#mitigator_https_proxy: ""
#mitigator_no_proxy: ""
mitigator_arch
: микроархитектура процессора, для которой будет загружена
оптимизированная версия обработчика пакетов: nehalem
, sandybridge
или haswell
(указания по выбору).
mitigator_nic_driver
: драйвер сетевой карты для DPDK
(подробнее о выборе).
Настройки обработчика пакетов:
mitigator_nics
: сетевые порты с указанием PCI-адресов и ядер
процессора. Подразумевается, что они перечислены в порядке ext0,
int0, ext1, int1 и т. д. Портов может быть нечетное количество
и даже один.
mitigator_nr_addrs
: размер таблицы проверенных адресов для контрмер
DNS, HTTP, ATLS. Должен быть степенью двойки. Для физических машин
рекомендуется 16777216 (224).
mitigator_hugepage_size
: размер страницы (2M
или 1G
);mitigator_hugepage_nr
: количество страниц.mitigator_nr_policies
: максимальное количество политик защиты.
Можно указать версию Mitigator´а
(latest
по умолчанию).
При первом запуске и при mitigator_pull_images: y
будет выполнена загрузка
образов Mitigator´а, для чего нужно задать логин и пароль:
mitigator_registry_user
и mitigator_registry_pass
.
Можно настроить прокси для Docker´а и компонент Mitigator´а.
5. Развернуть Mitigator на целевую машину mitigator.local
,
куда есть доступ по SSH:
ansible-playbook --become --ask-become-pass \
-i mitigator.local, mitigator/mitigator.yml
Запятая после имени хоста — не опечатка. Если имя пользователя SSH
отличается от локального, например, login
, добавляется параметр -u login
.
--become
и --ask-become-pass
используются для повышения привилегий, когда
подключение осуществляется не напрямую через пользователя root
(необходимо для выполнения части задач в процессе инсталяции).
В конце установки машина перезагрузится.
Playbook безопасно исполнять повторно в случае проблем.
1. Задания в роли ансибла разделены на 4 «тега»: checks, system, hugepages, mitigator.
Задания под тегом, соответственно, предназначены для проверки конфигурации, настройки системы, настройки hugepages и настройки непосредственно Mitigator´а. При необходимости перезапустить роль и перенастроить установку только частично, можно запустить playbook с необходимым набором тегов, например:
ansible-playbook --become --ask-become-pass \
--tags "system,hugepages" \
-i mitigator.local, mitigator/mitigator.yml
2. Конфигурацию GRUB2 под UEFI на RHEL/CentOS необходимо дополнительно перегенерировать вручную:
grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg
Для CentOS redhat
заменить на centos
Для опытных администраторов, нестандартных случаев и желающих разобраться.
Нужно обеспечить:
Рекомендуется включить hyper-threading в BIOS.
При включенном HT следующая команда показывает 2
:
lscpu | grep 'Thread(s) per core:'
Многопроцессорные платформы рекомендуется использовать в NUMA-режиме с одним процессором на NUMA-ноду. Поддерживаются платформы с одной и двумя NUMA-нодами.
Для оптимальной производительности рекомендуется разносить сетевые карты по разным NUMA-нодам, чтобы каждый процессор работал только с портами на своей ноде.
Узнать NUMA-ноду устройства по его PCI-адресу:
$ cat /sys/bus/pci/devices/0000:04:00.0/numa_node
0
Для сетевых карт Intel и некоторых других в системе должен быть загружен модуль ядра, позволяющий DPDK работать с ними. Для карт Mellanox загрузка модулей ядра не требуется.
Необходимо:
Подобрать драйвер для установленных сетевых устройств (документация DPDK):
vfio-pci
: стандартный, необходим для карт Intel;uio_pci_generic
: стандартный, используется вместо vfio-pci
для платформ
без VMX/SVM (см. ниже);virtio-pci
: нужен для виртуальных адаптеров QEMU/KVM;igb_uio
: нестандартный, нужен только если остальные драйвера
не работают (см. ниже).Настроить загрузку драйвера при запуске системы.
Привязка устройств к нужному драйверу производится через скрипт dpdk-devbind
(документация DPDK).
Его можно скачать по ссылке:
wget https://docs.mitigator.ru/dist/dpdk-devbind \
-O /usr/local/bin/dpdk-devbind
chmod +x /usr/local/bin/dpdk-devbind
Для просмотра состояния сетевых устройств и доступных драйверов:
dpdk-devbind --status-dev=net
В списке Network devices using DPDK-compatible driver
перечислены устройства,
привязанные к совместимому с DPDK драйверу. В списке Network devices using kernel driver
—
устройства со стандартными драйверами ядра. Доступные драйвера указываются для каждого
устройства в поле unused=
, например unused=i40e
. Отображаются только драйвера,
загруженные в системе.
Для загрузки драйвера vfio-pci
:
modprobe vfio-pci
Сопоставить имя устройства (например, eth0
или enp3s0f0
) и его PCI-адрес
можно через поле if=
в выводе dpdk-devbind
.
Рекомендуется привязывать все устройства одной командной dpdk-devbind
.
Для работы с vfio-pci
все порты одной карты должны быть привязаны к одному драйверу.
Для привязки устройств 0000:06:00.0
и 000:06:00.1
к драйверу vfio-pci
:
dpdk-devbind --bind vfio-pci 0000:06:00.0 0000:06:00.1
Если команда привязки выполнилась без сообщений об ошибках, драйвер можно
использовать. Устройство, привязанное к специальному драйверу, пропадает из системы
(вывод ip link
и т.п.). Привязка работает до перезагрузки, автоматическую привязку
можно будет настроить при установке Mitigator´а.
Внимание. Устройства, отмеченные в списке **Active**
, имеют IP-адрес. Обычно
это порт, через которой идет доступ к машине по SSH, поэтому скрипт не позволяет менять
драйвер таким устройствам.
Если нужный модуль ядра не загружается по умолчанию при старте системы, его загрузку можно включить так:
echo vfio-pci >> /etc/modules
Модуль vfio-pci
входит в состав ядра Linux. Необходим для работы DPDK с сетевыми
картами Intel. Требует поддержки процессором виртуализации ввода-вывода (например,
Intel VT-d). Настраивается в BIOS и в параметрах ядра через опцию iommu=on
.
Проверить поддержку:
grep 'vmx\|svm' /proc/cpuinfo >/dev/null && echo supported || echo not supported
Модуль igb_uio
устанавливается отдельно:
apt-get -y install linux-headers-amd64 dpdk-igb-uio-dkms
Для работы Mitigator´а необходимы настроенные hugepages (большие страницы памяти). Платформой могут поддерживаться hugepages разных размеров (2 МБ, 1 ГБ), рекомендуется настраивать страницы большего размера.
Необходимое количество hupepages зависит желаемого количества политик защиты. Рекомендуется отводить на hugepages 50-75% от общего объема памяти.
Рекомендуется использовать hugepages размером 1 ГБ, если поддерживаются платформой. Их можно выделить только при загрузке системы.
Проверить поддержку:
grep -m1 pdpe1gb /proc/cpuinfo
Настраивается опциями в параметрах ядра. Пример для выделения 64-х 1 ГБ страниц:
default_hugepagesz=1G hugepagesz=1G hugepages=64
Hugepages размером 2 МБ можно настраивать без перезагрузки системы.
Пример для выделения 2048-х 2 МБ страниц:
sysctl -w vm.nr_hugepages=2048
Пример для выделения при загрузке системы:
echo 'vm.nr_hugepages = 2048' > /etc/sysctl.d/hugepages.conf
Установка Docker Compose (подробная инструкция по установке)
`apt install docker-compose` — Debian, Ubuntu \
`yum install docker-compose` — CentOS
Если доступ к https://docker.mitigator.ru ведется через прокси, нужно настроить Docker.
Предполагается размещать все файлы в рабочем каталоге /srv/mitigator
:
mkdir -p /srv/mitigator
cd /srv/mitigator
Примеры конфигураций подходят для системы в минимальной комплектации (4 ядра, 8 ГБ памяти, два сетевых интерфейса для данных, один для управления) и рассчитаны на 100 политик защиты (пропускная способность зависит от типа интерфейсов и характера трафика).
Поместить базовую конфигурацию Docker Compose в рабочий каталог:
wget https://docs.mitigator.ru/dist/docker-compose.yml
Скачать базовый файл переменных и сохранить его под именем
.env
:
wget https://docs.mitigator.ru/dist/env -O /srv/mitigator/.env
В нем можно задать:
Подробно эти настройки описаны внутри файла-примера.
Для максимальной производительности Mitigator нужно использовать сборку, оптимизированную под конкретный процессор.
В файле .env
должна быть строка вида:
ARCH=haswell
Доступные варианты: nehalem
, sandybridge
, haswell
. Если не указана
ARCH
, используется nehalem
.
Свой процессор можно найти в каталоге Intel,
микроархитектура указана в строке Code Name.
Если в перечне доступных нет нужной, воспользуйтесь диаграммой,
например, для Xeon E5-2680 v4 (Broadwell) оптимальна haswell
.
Необходимо создать файл data-plane.conf
, описывающий параметры запуска обработчика
пакетов:
touch data-plane.conf
Файл настроек по умолчанию пустой. Править его требуется только если нужно указать настройки, отличные от выбранных автоматически. Описание настроек.
Порты в приложении называются ext0
, int0
, ext1
, int1
и т.д. ext
— порты
внешней сети, int
— порты внутренней (защищаемой) сети. Объединяются в ext-int пары по
индексу в названии. ext-int пары портов используются для маршрутизации трафика в схеме
включения «в разрыв». В схеме включения «on-a-stick» ext-int пары не используются и могут
быть любыми.
Если порты не заданы в настройках, используются все порты в системе, доступные DPDK. В таком случае, порты перечисляются в порядке возрастания их PCI-адресов. ext-int пары портов формируются только для портов с общей NUMA-ноды.
Если порядок перечисления портов по умолчанию не совпадает с физическим подключением линков, либо требуется ограничить список используемых портов, порты можно настроить явно:
ext0: 04:00.1
int0: 04:00.0
ext1: 84:00.1
int1: 84:00.0
Портов может быть нечетное количество.
Настраивается автоматически. Настройки можно задать явно, если требуется.
Предварительная информация:
Номера ядер на каждой NUMA-ноде (на примере двухпроцессорной системы):
$ lscpu | grep NUMA
NUMA node(s): 2
NUMA node0 CPU(s): 0-11,24-35
NUMA node1 CPU(s): 12-23,36-47
Команда likwid-topology -g
(пакет hwloc
в Debian) отображает топологию
процессора в наглядном виде.
NUMA-ноды, к которым относятся сетевые карты:
$ cat /sys/bus/pci/devices/0000:04:00.0/numa_node
0
$ cat /sys/bus/pci/devices/0000:84:00.0/numa_node
1
Если логическое ядро отведено для чтения трафика из порта (IO-ядро), hyperthread-парное ему логическое ядро не должно быть нагружено.
Ядро 0 зарезервировано для управления и далее не используется, как и парное ему ядро 24.
Для портов 10 GbE достаточно по одному ядру на порт с той же NUMA-ноды:
ext0: 04:00.1
cores: 1
int0: 04:00.0
cores: 2
ext1: 84:00.1
cores: 12
int1: 84:00.0
cores: 13
Для портов 40 GbE нужно 3 ядра, для портов 100 GbE — 6 ядер:
ext0: 04:00.1
cores: 1-3
На каждое ядро создается отдельная очередь приема, трафик между очередями распределяется аппаратным RSS на сетевой карте.
Группу ядер можно назначить сразу нескольким портам. Это может быть полезно при включении «в разрыв», когда атаки приходят на ext-порты, а нагрузка на int небольшая:
port_cores: 1-2
ext0: 04:00.1
int0: 04:00.0
Перед запуском Mitigator´а отведенные ему сетевые порты должны быть под управлением драйвера, выбранного при подготовке системы.
Для систем под управлением systemd предлагается выполнять привязку перед запуском службы Mitigator´а (см. следующий пункт).
Загрузить скрипт привязки и сделать его исполняемым:
wget https://docs.mitigator.ru/dist/dpdk-devbind \
-O /usr/local/bin/dpdk-devbind
chmod +x /usr/local/bin/dpdk-devbind
Создать каталог /etc/systemd/system/mitigator.service.d
:
mkdir -p /etc/systemd/system/mitigator.service.d
В нем разместить файл nics.conf
такого вида:
[Service]
ExecStartPre=/usr/local/bin/dpdk-devbind -b vfio-pci 0000:06:00.3 0000:06:00.2
Драйвер и PCI-адреса заменить на необходимые.
Mitigator запускается командой docker-compose up -d
.
Для систем под управлением systemd предлагается настроить готовую службу:
Разместить файл службы Mitigator´а:
wget https://docs.mitigator.ru/dist/mitigator.service \
-O /etc/systemd/system/mitigator.service
Настроить автозапуск Mitigator´а:
systemctl enable mitigator
При первом запуске или обновлении нужно совершить вход в хранилище образов со своими учетными данными:
docker login docker.mitigator.ru
Запустить Mitigator:
systemctl start mitigator
При первом запуске понадобится некоторое время для загрузки
образов. Процесс можно наблюдать в выводе docker-compose logs -f
или, для systemd:
journalctl -u mitigator -f
Спустя некоторое время, web-интерфейс Mitigator´а будет доступен по адресу интерфейса управления.
Если доступ к https://docker.mitigator.ru ведется через прокси, необходимо настроить Docker.
В системах под управлением systemd предлагается:
Создать drop-in к службе Docker´а с указанием прокси в окружении (детали подключения к прокси заменить на актуальные):
mkdir -p /etc/systemd/system/docker.service.d
cat >/etc/systemd/system/docker.service.d/proxy.conf <<END
[Service]
Environment=HTTP_PROXY=http://user:password@proxy.local:1234
Environment=HTTPS_PROXY=http://user:password@proxy.local:1234
Environment=NO_PROXY=docker.local
END
Добавить сертификат прокси в доверенные для Docker´а
(/path/to/proxy.crt
заменить на путь к сертификату прокси):
mkdir -p /etc/docker/certs.d/docker.mitigator.ru
cp /path/to/proxy.crt /etc/docker/certs.d/docker.mitigator.ru
Обновить описание службы Docker и перезапустить её:
systemctl daemon-reload
systemctl restart docker
Если Mitigator будет сообщаться с сервером лицензий (ls.mitigator.ru),
почтовым сервером и службой «Весточка» через прокси, нужно указать переменные
окружения. Для этого нужно создать файл docker-compose.override.yml
с таким содержимым:
version: "2.2"
services:
backend:
environment:
HTTP_PROXY: "http://user:password@proxy.local:3128"
HTTPS_PROXY: "http://user:password@proxy.local:3128"
При необходимости задать также NO_PROXY
(адреса, к которым нужно
обращаться без прокси), требуется включать в нее .mitigator
и localhost
:
NO_PROXY: "<новые серверы>,.mitigator,localhost"
После этого нужно перезапустить службу бэкенда:
docker-compose up -d backend
Для замены самоподписанного сертификата cert.crt
с ключом cert.key
на собственный, необходимо смонтировать сертификат и ключ через
/srv/mitigator/docker-compose.override.yml
:
version: "2.2"
services:
nginx:
volumes:
- example.com.crt:/etc/nginx/cert.crt:ro
- example.com.key:/etc/nginx/cert.key:ro
После этого нужно перезапустить службу Nginx:
docker-compose up -d nginx
Симптомы:
при загрузке модуля:
modprobe: FATAL: Module igb_uio not found in directory /lib/modules/4.9.0-6-amd64
при установке пакета:
Module build for kernel 4.9.0-6-amd64 was skipped since the
kernel headers for this kernel does not seem to be installed.
Необходимо установить пакет linux-headers-amd64
(Debian) и убедиться,
что загружена версия ядра, соответствующая версии этого пакета, после
чего выполнить:
dkms autoinstall
По умолчанию эти команды работают только для пользователей группы
docker
и для root
. Это стандартная мера безопасности Docker.
Решение:
sudo usermod -aG docker $USER
newgrp docker
Такое сообщение появляется в web-интерфейсе, если обработчик пакетов не
запустился или остановился. Диагностика (из /srv/mitigator
):
docker-compose logs data-plane
Ниже приводятся некоторые типовые проблемы и характерные сообщения.
EAL: Cannot get hugepage information.
Сообщение:
EAL: No free hugepages reported in hugepages-2048kB
EAL: No free hugepages reported in hugepages-1048576kB
EAL: FATAL: Cannot get hugepage information.
EAL: Cannot get hugepage information.
EAL: Error exiting with code: 1
Cause: DPDK init error: 1
Причина: не выделены или полностью заняты hugepages.
Нужно проверить наличие свободных hugepages и убедиться, что значения
HugePages_Total
и Hugepagesize
совпадают с настроенными,
а HugePages_Free
равно HugePages_Total
(или отличается не более,
чем на несколько страниц):
grep Huge /proc/meminfo
no port found with PCI address BB:DD.F
Сообщение:
/data-plane/config.click:12: no port found with pci address '04:00.0'
Нужно убедиться, что адрес устройства 04:00.0 соответствует действительности, и что устройство привязано к драйверу для DPDK точно так же, как при подготовке системы.
При просмотре логов docker-compose logs data-plane
сообщение:
Segmentation fault (core dumped)
Чтобы незамедлительно восстановить работу, можно дать команду:
docker-compose up -d data-plane
Далее рекомендуется связаться с разработчиками с целью точной диагностики и исправления, для чего им желательно иметь:
Описание ситуации, в которой произошла проблема (действий с Mitigator´ом, входящего трафика).
Описание аппаратной конфигурации сервера:
Файл /srv/mitigator/data-plane.conf
.
Core dump (слепок памяти процесса), который по умолчанию сохраняется
в /var/lib/docker/volumes/mitigator_coredumps/_data/core
. Его
размер — гигабайты, но он обычно хорошо сжимается.
В некоторых дистрибутивах (например, Ubuntu) файл core
не появляется,
потому что обработка сбоев настроена иначе.
Проверить настройку можно так:
cat /proc/sys/kernel/core_pattern
По умолчанию в Linux значение core
. Если оно другое:
Запомнить исходное значение:
cat /proc/sys/kernel/core_pattern > /tmp/old_core_pattern
Заменить его на core
:
echo core | sudo tee /proc/sys/kernel/core_pattern
Воспроизвести проблему, получить файл core
по указанному выше пути.
Восстановить оригинальное значение:
cat /tmp/old_core_pattern | sudo tee /proc/sys/kernel/core_pattern