Перейти к основному содержимому
Версия: 4.6.X

Кластеризация komrad-bus

KOMRAD Enterprise SIEM поддерживает организацию отказоустойчивой доставки событий с помощью кластера NATS JetStream. В данном разделе описаны шаги по созданию инфраструктуры из трёх связанных между собой узлов KOMRAD, обеспечивающих репликацию событий.

Целевая инфраструктура​

Для корректной работы кластер должен находиться в состоянии кворума --- как минимум половина узлов плюс один должна быть активна. По этой причине кластер рекомендуется строить из нечётного количества узлов. Минимальное количество --- три узла.

Для построения отказоустойчивой инфраструктуры необходимо разделить в komrad-bus два основных потока данных:

  • Поток событий --- события от коллекторов, отфильтрованные события.
  • Поток служебных сообщений --- управляющие сообщения, оповещения и прочие внутренние данные.
Важно

Если не разделить потоки, при кластеризации возникнет хаос: каждый из узлов сможет отправлять управляющие сообщения коллекторам и вмешиваться в работу других серверов.

Для разделения потоков на каждом узле необходимо запустить два экземпляра komrad-bus:

  • Событийный komrad-bus --- участвует в транспорте событий и входит в кластер JetStream.
  • Локальный (внутренний) komrad-bus --- обслуживает поток служебных сообщений и не входит в кластер, обеспечивая работу только компонентов KOMRAD на текущем узле.

Создание второго komrad-bus для кластера​

Создание systemd-юнита​

Скопируйте файл systemd-юнита установленного komrad-bus:

sudo cp /lib/systemd/system/komrad-bus.service /lib/systemd/system/komrad-bus-events.service

Отредактируйте файл /lib/systemd/system/komrad-bus-events.service, указав другой конфигурационный файл и файл переменных окружения:

EnvironmentFile=-/etc/default/komrad-bus-events
ExecStart=/usr/bin/komrad-bus -c /etc/echelon/komrad/komrad-bus-events.yaml

Создание конфигурации​

Скопируйте конфигурацию основного komrad-bus:

sudo cp /etc/echelon/komrad/komrad-bus.yaml /etc/echelon/komrad/komrad-bus-events.yaml

В файле komrad-bus-events.yaml измените путь к конфигурации NATS:

nats:
# Путь до файла конфигурации NATS
path: /etc/echelon/komrad/komrad-bus-events.conf

Настройте стандартный клиент NATS (замените komrad-1, komrad-2, komrad-3 на IP-адреса или доменные имена машин кластера):

bus:
default:
client-name: komrad-1
servers:
- nats://komrad-1:4490
- nats://komrad-2:4490
- nats://komrad-3:4490
# ...
replicas: 3

Установите права доступа:

sudo chmod 664 /etc/echelon/komrad/komrad-bus-events.yaml

Создание директории хранения​

sudo mkdir /var/lib/echelon/komrad/komrad-bus-events
sudo chown komrad:komrad /var/lib/echelon/komrad/komrad-bus-events

Конфигурация NATS JetStream​

Скопируйте конфигурационный файл NATS:

sudo cp /etc/echelon/komrad/komrad-bus.conf /etc/echelon/komrad/komrad-bus-events.conf

Добавьте блок кластеризации (замените адреса на актуальные):

cluster: {
listen: komrad-1:44900
name: events-cluster
routes: [
nats://komrad-2:44900
nats://komrad-3:44900
]
}

В поле listen укажите адрес текущей машины, в поле routes --- адреса всех остальных элементов кластера. Имя кластера (name) должно быть одинаковым на всех узлах.

Измените порт для основного прослушивания и HTTP-порт (поскольку на машине будет два экземпляра komrad-bus):

listen: komrad-1:4490
# ...
http_port: 4491

Измените директорию хранения:

STORE_DIR = "/var/lib/echelon/komrad/komrad-bus-events/.jetstream"

Обеспечьте уникальность поля server_name на каждом узле кластера. По умолчанию значение --- komrad. Добавьте суффикс, например: komrad-a, komrad-b, komrad-c.

Установите права доступа:

sudo chmod 664 /etc/echelon/komrad/komrad-bus-events.conf

Запуск сервиса​

sudo systemctl enable komrad-bus-events
sudo systemctl start komrad-bus-events

Настройка конфигурации сервисов​

После внесения поддержки кластеризации конфигурация блока bus в конфигурационных файлах представляет собой набор именованных конфигураций клиентов NATS:

КонфигурацияОписание
defaultИспользуется, если более специфичная конфигурация не указана. Обслуживает служебные сообщения
eventsСвязана с потоком событий: JetStream-потоки EVENTS, FILTERS и LOGS. Охватывает связку коллектор-процессор и коллектор-коррелятор
correlationСвязана с потоком инцидентов: охватывает связку коррелятор-менеджер инцидентов

Конфигурацию default можно оставить без изменений. Блок events настраивается для подключения сервисов к кластеру:

events:
servers:
- nats://komrad-1:4490
- nats://komrad-2:4490
- nats://komrad-3:4490
user: komrad
password: pass
user-credentials: ""
client-name: komrad-a
tls:
disable: false
ServerName: ""
TrustedCA: /var/lib/echelon/komrad/certs/ca.pem
Cert: /var/lib/echelon/komrad/certs/client.pem
CertKey: /var/lib/echelon/komrad/certs/client-key.pem
system-pool: false
min-version: "1.3"
client-auth: require-and-verify-client-cert
tuning:
connect-timeout: 10s
max-reconnects: 1000000
max-wait: 0s
ping-interval: 2m
max-pings-outstanding: 2
publish-async-max-pending: 0
reconnect-interval: 5s
reconnect-wait: 1s
retry-on-failed-connect: false
# Количество реплик потоков JetStream
replicas: 3
Обратите внимание

Блок events необходимо добавить во все конфигурационные файлы, где присутствует секция bus.

Ключевые параметры​

  1. servers --- перечислите адреса всех событийных komrad-bus, входящих в кластер.

  2. client-name --- для каждого узла задайте уникальное имя клиента. Если имена будут совпадать, узлы будут перехватывать данные друг у друга, что приведёт к потере событий и инцидентов.

  3. tuning.replicas --- коэффициент репликации потоков JetStream. Рекомендуется устанавливать значение, равное количеству узлов в кластере (в данном случае --- 3). Если оставить значение по умолчанию, при отказе любого узла будет утрачена часть данных.

Особенности работы кластера​

  1. Синхронизация идентификаторов фильтров. Одинаковые по смыслу фильтры на разных узлах должны иметь одинаковый ID. Идентификатор используется для дальнейшей корреляции и создания инцидентов. Без синхронизации возможно появление ложноположительных инцидентов и пропуск реальных угроз.

  2. Репликация событий. События от всех коллекторов поступают на все процессоры и корреляторы. При одинаковых фильтрах и директивах на узлах будут появляться идентичные инциденты.

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

  4. Сертификаты. У всех элементов кластера должен быть общий корневой сертификат.

Защита от split-brain​

KOMRAD реализует защиту от split-brain на двух уровнях через komrad-bus (NATS + JetStream):

  1. Кластер внутри ЦОД (routes) --- узлы объединяются постоянными маршрутами и обмениваются топологией автоматически.
  2. Суперкластер между ЦОД (gateway) --- отдельные кластеры ЦОД связываются шлюзами, а сообщения передаются только туда, где есть подписчики (interest-based routing).

JetStream использует Raft-консенсус для метаданных и репликации потоков. Запись в поток выполняет лидер, решения принимаются кворумом.

Кворум для replicas: N: допустим отказ до (N-1)/2 узлов (например, при 3 репликах --- 1 узел, при 5 --- 2 узла).

Примеры конфигураций​

Кластер внутри одного ЦОД (routes):

cluster {
listen: localhost:4244
routes = [
nats-route://route_user:pwd@127.0.0.1:4245
nats-route://route_user:pwd@127.0.0.1:4246
]
}

Суперкластер между ЦОД (gateway):

gateway {
name: "DC-Msk"
listen: "localhost:7222"
gateways: [
{name: "DC-Msk", url: "nats://gwu:gwp@localhost:7222"},
{name: "DC-Spb", url: "nats://gwu:gwp@localhost:7333"},
{name: "DC-Nsk", url: "nats://gwu:gwp@localhost:7444"},
]
}

Репликация потока JetStream в komrad-bus:

bus:
events:
tuning:
replicas: 3

Для контроля состояния используйте эндпоинты мониторинга NATS:

  • /routez --- состояние route-связей кластера.
  • /gatewayz --- состояние gateway-связей между ЦОД.
  • /jsz --- лидеры, реплики и лаг JetStream.