Интеграции

В данном разделе описаны инструкции по интеграции KICS и MLAD с различными системами

Интеграция KICS for Networks

Интеграция KICS for Networks

API KICS for Networks

Использование Kaspersky Industrial CyberSecurity for Networks API

В Kaspersky Industrial CyberSecurity for Networks реализован интерфейс прикладного программирования, который обеспечивает доступ к функциям программы для сторонних приложений.

В комплект поставки Kaspersky Industrial CyberSecurity for Networks входит пакет с описаниями спецификаций для представления данных в запросах к серверу REST API. Сервер REST API функционирует на компьютере Сервера Kaspersky Industrial CyberSecurity for Networks и обрабатывает запросы с использованием архитектурного стиля взаимодействия REST. Обращения к серверу REST API выполняются по протоколу HTTPS. Вы можете настроить параметры сервера REST API в разделе Параметры → Серверы подключений (в том числе заменить используемый по умолчанию самоподписанный сертификат на доверенный).

Для представления данных в запросах и ответах используется формат JSON.

Документация с описанием запросов на основе архитектурного стиля REST публикуется в виде онлайн-справки на странице Kaspersky Online Help.

  1. ОТКРЫТЬ ДОКУМЕНТАЦИЮ С ОПИСАНИЕМ ЗАПРОСОВ К СЕРВЕРУ REST API, версия 3
  2. ОТКРЫТЬ ДОКУМЕНТАЦИЮ С ОПИСАНИЕМ ЗАПРОСОВ К СЕРВЕРУ REST API, версия 4

Примеры использования

Рассмотрим пример использования API для локального экспорта данных об устройствах из KICS for Networks.

Для начала нужно создать коннектор, с типом Generic и именем, например, GetDeviceAll, указать пароль и адрес сервера, узел размещения коннектора в нашем случае будет такой же, как и адрес сервера (Рисунок 1). После создания коннектора у вас скачается файл свертки, который будет называться как коннектор_GetDeviceAll.zip.

image.png

Рисунок 1 – Создание коннектора

Далее необходимо создать директории для корректной работы кода. Впишите команды ниже последовательно:

cd

mkdir GetDeviceAll && cd GetDeviceAll

mkdir connector && cd connector && cp /opt/kaspersky/kics4net-connectors/libexec/default_connectors_registrar.py default_connectors_registrar.py

Далее в папку connector необходимо положить файл свертки коннектор_GetDeviceAll.zip, который мы получили при создании коннектора и распаковать его в эту директорию командой:

unzip -d коннектор_GetDeviceAll коннектор_GetDeviceAll.zip

Далее необходимо зарегистрировать коннектор командой:

sudo python3 default_connectors_registrar.py create

Далее необходимо выполнить действия показанные на Рисунке 2: ввести имя коннектора GetDeviceAll, ввести полный путь до файла свертки коннектор_GetDeviceAll.zip (/home/<username>/GetDeviceAll/connector/коннектор_GetDeviceAll.zip), ввести пароль, который вы указывали при создании коннектора в веб-интерфейсе и согласиться с запуском службы коннектора GetDeviceAll.

image.png

Рисунок 2 – Регистрация коннектора

После этого статус коннектора в KICS for Networks поменяется с “Ожидает регистрации” на “Работает”

image.png

Рисунок 3 – Статус работы коннектора в Веб-консоли

Теперь можно перейти к написанию кода, который будет взаимодействовать с KICS for Networks по API.

Код будет писаться на Python, но вы можете использовать любой удобный для вас язык 

Для начала напишем класс подключения к API сервера:

import logging
import json
import requests
from requests.exceptions import RequestException
from time import sleep


class KicsApiClient:
    def __init__(self, metadata_path, cert_path, key_path):
        self.metadata_path = metadata_path
        self.cert_path = cert_path
        self.key_path = key_path
        self.base_url = None
        self.token = None
        self._initialize()

    def _initialize(self):
        with open(self.metadata_path, 'r', encoding='utf-8') as f:
            metadata = json.load(f)
        self.base_url = metadata.get('serverUri', '').rstrip('/')
        if not self.base_url.endswith('/kics/api'):
            self.base_url += '/kics/api'
        logging.info(f"Базовый URL API: {self.base_url}")
        self._authenticate()

    def _authenticate(self):
        url = f"{self.base_url}/auth/token?grant_type=certificate"
        resp = requests.post(
            url,
            cert=(self.cert_path, self.key_path),
            verify=False
        )
        resp.raise_for_status()
        self.token = resp.json().get('access_token')
        if not self.token:
            raise ValueError("Аутентификация не удалась: токен не получен")
        logging.info("Аутентификация успешна")

    def _post_query(self, path, payload, offset=0, limit=1000, delay=1):
        all_items = []
        headers = {
            'Authorization': f'Bearer {self.token}',
            'Content-Type': 'application/json'
        }
        while True:
            body = payload.copy()
            body.update({'offset': offset, 'limit': limit})
            url = f"{self.base_url}{path}"
            try:
                resp = requests.post(url, headers=headers, json=body, verify=False)
                resp.raise_for_status()
            except RequestException as e:
                logging.error(f"Ошибка запроса к {url}: {e}")
                if hasattr(e, 'response') and e.response is not None:
                    try:
                        logging.error(f"Текст ответа: {e.response.text}")
                    except:
                        pass
                raise
            try:
                json_resp = resp.json()
            except ValueError:
                break
            data = json_resp.get('values') or json_resp.get('elements')
            if not data:
                break
            all_items.extend(data)
            logging.info(f"Получено {len(data)} записей из {path}, всего: {len(all_items)}")
            if len(data) < limit:
                break
            offset += limit
            sleep(delay)
        return all_items

Теперь добавим в этот класс функции которые будут вызываться в классе экспорта данных:

    def get_device_applications(self):
        return self._post_query('/v4/device-apps/query', {})

    def get_device_patches(self):
        return self._post_query('/v4/device-patches/query', {})

    def get_device_users(self):
        return self._post_query('/v4/device-users/query', {})

 Перейдем к написанию класса, который будет отвечать за экспорт данных из KICS for Networks по API и будет конвертировать полученные данные в csv файл:

import csv


class CsvExporter:
    @staticmethod
    def export_dicts(items, filename):
        if not items:
            logging.warning(f"Нет данных для файла {filename}")
            return
        fieldnames = set()
        for item in items:
            fieldnames.update(item.keys())
        fieldnames = sorted(fieldnames)
        headers_rus = [RUSSIAN_HEADERS.get(fn, fn) for fn in fieldnames]
        with open(filename, 'w', newline='', encoding='utf-8-sig') as f:
            writer = csv.writer(f, delimiter=';')
            writer.writerow(headers_rus)
            for item in items:
                row = [item.get(fn, '') for fn in fieldnames]
                writer.writerow(row)
        logging.info(f"Экспортировано {len(items)} записей в {filename}")

В этом классе используется глобальная переменная RUSSIAN_HEADERS, которая хранит в себе ключ - значение, для перевода ключей на русский язык: 

RUSSIAN_HEADERS = {
    'Id': 'Идентификатор',
    'id': 'Идентификатор',
    'DeviceId': 'Идентификатор устройства',
    'device': 'Устройство',
    'ApplicationName': 'Название приложения',
    'name': 'Имя',
    'fullName': 'Полное имя',
    'ApplicationVersion': 'Версия приложения',
    'PatchVersion': 'Версия патча',
    'UserName': 'Имя пользователя',
    'description': 'Описание',
    'Domain': 'Домен',
    'groups': 'Группы',
    'isDisabled': 'Отключен',
    'isLockedOut': 'Заблокирован',
    'lastSeen': 'Последний вход',
    'canChangePassword': 'Можно сменить пароль',
    'mustChangePassword': 'Требуется смена пароля',
    'passwordNeverExpires': 'Пароль не истекает',
    'sid': 'SID',
    'source': 'Источник',
    'installedOn': 'Установлено на',
    'version': 'Версия',
    'vendor': 'Производитель',
    'program': 'Программа',
    'size': 'Размер',
}

Почти все готово! Осталось написать main, который объединит в себе весь функционал нашего кода:

import os
import sys


def main():
    BASE_DIR = os.path.dirname(os.path.abspath(__file__))
    META = os.path.join(BASE_DIR, 'connector', 'коннектор_GetDeviceAll', 'metadata.json')
    CERT = '/var/opt/kaspersky/kics4net-connectors/instances/GetDeviceAll/ssl/connector.crt'
    KEY = '/var/opt/kaspersky/kics4net-connectors/instances/GetDeviceAll/ssl/connector.key'
    for path in (META, CERT, KEY):
        if not os.path.exists(path):
            logging.error(f"Не найден файл: {path}")
            sys.exit(1)
    client = KicsApiClient(META, CERT, KEY)
    apps = client.get_device_applications()
    patches = client.get_device_patches()
    users = client.get_device_users()
    CsvExporter.export_dicts(apps, 'DeviceApplications.csv')
    CsvExporter.export_dicts(patches, 'DevicePatches.csv')
    CsvExporter.export_dicts(users, 'DeviceUsers.csv')

if __name__ == '__main__':
    main()

Отлично! Код готов, теперь необходимо перенести файл GetDeviceAll.py в папку GetDeviceAll любым известным вам способом. В конечном счете директория должна выглядеть вот так:

└─./home/<username>
       ├─ ./GetDeviceAll
       │  ├─ ./connector
       │  │  ├─ . /коннектор_GetDeviceAll.zip
       │  │  ├─ ./default_connectors_registrar.py
       │  │  └─ ./коннектор_GetDeviceAll
       │  │         ├─ ./certificates.pfx
       │  │         ├─ ./metadata.json
       │  │         └─ ./webserver.pem
       └  └─ ./GetDeviceAll.py

Далее в консоли перейдем в директорию GetDeviceAll командой:

cd /home/<username>

 И запустить файл GetDeviceAll.py командой:

sudo python3 GetDeviceAll.py

В итоге мы получили 3 файла DeviceApplications.csv, DevicePatches.csv, DeviceUsers.csv которые находятся в этой же директории GetDeviceAll.

image.png

Рисунок 4 – Вывод логов скрипта по экспорту данных

image.png

Рисунок 5 – Результат работы скрипта

P.S.

Полный код :)

import os
import sys
import json
import logging
import requests
import csv
from requests.exceptions import RequestException
import urllib3
from time import sleep

urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

logging.basicConfig(
    format='%(asctime)s %(levelname)s %(message)s',
    datefmt='%Y-%m-%d %H:%M:%S',
    level=logging.INFO
)

RUSSIAN_HEADERS = {
    'Id': 'Идентификатор',
    'id': 'Идентификатор',
    'DeviceId': 'Идентификатор устройства',
    'device': 'Устройство',
    'ApplicationName': 'Название приложения',
    'name': 'Имя',
    'fullName': 'Полное имя',
    'ApplicationVersion': 'Версия приложения',
    'PatchVersion': 'Версия патча',
    'UserName': 'Имя пользователя',
    'description': 'Описание',
    'Domain': 'Домен',
    'groups': 'Группы',
    'isDisabled': 'Отключен',
    'isLockedOut': 'Заблокирован',
    'lastSeen': 'Последний вход',
    'canChangePassword': 'Можно сменить пароль',
    'mustChangePassword': 'Требуется смена пароля',
    'passwordNeverExpires': 'Пароль не истекает',
    'sid': 'SID',
    'source': 'Источник',
    'installedOn': 'Установлено на',
    'version': 'Версия',
    'vendor': 'Производитель',
    'program': 'Программа',
    'size': 'Размер',
}

class KicsApiClient:
    def __init__(self, metadata_path, cert_path, key_path):
        self.metadata_path = metadata_path
        self.cert_path = cert_path
        self.key_path = key_path
        self.base_url = None
        self.token = None
        self._initialize()

    def _initialize(self):
        with open(self.metadata_path, 'r', encoding='utf-8') as f:
            metadata = json.load(f)
        self.base_url = metadata.get('serverUri', '').rstrip('/')
        if not self.base_url.endswith('/kics/api'):
            self.base_url += '/kics/api'
        logging.info(f"Базовый URL API: {self.base_url}")
        self._authenticate()

    def _authenticate(self):
        url = f"{self.base_url}/auth/token?grant_type=certificate"
        resp = requests.post(
            url,
            cert=(self.cert_path, self.key_path),
            verify=False
        )
        resp.raise_for_status()
        self.token = resp.json().get('access_token')
        if not self.token:
            raise ValueError("Аутентификация не удалась: токен не получен")
        logging.info("Аутентификация успешна")

    def _post_query(self, path, payload, offset=0, limit=1000, delay=1):
        all_items = []
        headers = {
            'Authorization': f'Bearer {self.token}',
            'Content-Type': 'application/json'
        }
        while True:
            body = payload.copy()
            body.update({'offset': offset, 'limit': limit})
            url = f"{self.base_url}{path}"
            try:
                resp = requests.post(url, headers=headers, json=body, verify=False)
                resp.raise_for_status()
            except RequestException as e:
                logging.error(f"Ошибка запроса к {url}: {e}")
                if hasattr(e, 'response') and e.response is not None:
                    try:
                        logging.error(f"Текст ответа: {e.response.text}")
                    except:
                        pass
                raise
            try:
                json_resp = resp.json()
            except ValueError:
                break
            data = json_resp.get('values') or json_resp.get('elements')
            if not data:
                break
            all_items.extend(data)
            logging.info(f"Получено {len(data)} записей из {path}, всего: {len(all_items)}")
            if len(data) < limit:
                break
            offset += limit
            sleep(delay)
        return all_items

    def get_device_applications(self):
        return self._post_query('/v4/device-apps/query', {})

    def get_device_patches(self):
        return self._post_query('/v4/device-patches/query', {})

    def get_device_users(self):
        return self._post_query('/v4/device-users/query', {})

class CsvExporter:
    @staticmethod
    def export_dicts(items, filename):
        if not items:
            logging.warning(f"Нет данных для файла {filename}")
            return
        fieldnames = set()
        for item in items:
            fieldnames.update(item.keys())
        fieldnames = sorted(fieldnames)
        headers_rus = [RUSSIAN_HEADERS.get(fn, fn) for fn in fieldnames]
        with open(filename, 'w', newline='', encoding='utf-8-sig') as f:
            writer = csv.writer(f, delimiter=';')
            writer.writerow(headers_rus)
            for item in items:
                row = [item.get(fn, '') for fn in fieldnames]
                writer.writerow(row)
        logging.info(f"Экспортировано {len(items)} записей в {filename}")


def main():
    BASE_DIR = os.path.dirname(os.path.abspath(__file__))
    META = os.path.join(BASE_DIR, 'connector', 'коннектор_GetDeviceAll', 'metadata.json')
    CERT = '/var/opt/kaspersky/kics4net-connectors/instances/GetDeviceAll/ssl/connector.crt'
    KEY = '/var/opt/kaspersky/kics4net-connectors/instances/GetDeviceAll/ssl/connector.key'
    for path in (META, CERT, KEY):
        if not os.path.exists(path):
            logging.error(f"Не найден файл: {path}")
            sys.exit(1)
    client = KicsApiClient(META, CERT, KEY)
    apps = client.get_device_applications()
    patches = client.get_device_patches()
    users = client.get_device_users()
    CsvExporter.export_dicts(apps, 'DeviceApplications.csv')
    CsvExporter.export_dicts(patches, 'DevicePatches.csv')
    CsvExporter.export_dicts(users, 'DeviceUsers.csv')

if __name__ == '__main__':
    main()
Интеграция KICS for Networks

Настройка передачи событий из KICS for Networks (версий 4.3 и 4.5) в KUMA

Настройка интеграции выполняется в два этапа: сначала создается и настраивается коллектор в KUMA, затем создается коннектор в KICS for Networks.

Настройка KUMA

    1. Перейдите в раздел «Ресурсы» и откройте вкладку «Коллекторы».

      Название картинки


    1. Нажмите кнопку «+ Создать».

      Название картинки


    1. В открывшемся окне укажите название коллектора. Рекомендуется использовать наименование продукта, тип подключения и порт (например, KICS_for_Networks_TCP\5160), чтобы в дальнейшем легко идентифицировать коллектор.

      Название картинки


    1. На вкладке «Транспорт» укажите тип соединения (протокол) и порт, который будет использоваться для приема событий от источника.

      Название картинки


    1. На вкладке «Парсинг событий» - «Настройки парсинга» выберите соответствующий нормализатор для обработки входящих событий.

      Название картинки


    1. На вкладке «Маршрутизация» добавьте ранее созданные коррелятор и хранилище. Подробнее о развертывании этих компонентов см. в Справке по KUMA.

      Название картинки


    1. На вкладке «Проверка параметров» нажмите кнопку «Сохранить и создать сервис».

      Название картинки


    1. После создания коллектора скопируйте сгенерированную команду и выполните её в терминале сервера KUMA с правами администратора для развертывания сервиса.

      Название картинки


Настройка KICS for Networks

    1. Перейдите в раздел «Параметры» - «Коннекторы» и нажмите кнопку «+ Добавить коннектор».
    2. В карточке нового коннектора заполните поля:
      • Тип коннектора: SIEM.
      • Имя коннектора: Произвольное наименование.
      • Адрес сервера: IP-адрес узла, на котором развернут сервер KICS for Networks.
      • Узел размещения коннектора: Server.
      • Пользователь программы: Учетная запись администратора KICS for Networks.
      • Адрес SIEM-сервера: IP-адрес узла, на котором развернут сервер KUMA.
      • Номер порта: Порт, указанный при настройке коллектора KUMA (см. п. 4 раздела «Настройка KUMA»).
      • Транспортный протокол: Протокол, указанный при настройке коллектора KUMA (см. п. 4 раздела «Настройка KUMA»).

      Название картинки


    1. Нажмите кнопку «Сохранить».
    2. Убедитесь, что в свойствах созданного коннектора параметры имеют следующие значения:
      • Включен: Да.
      • Статус: Работает.

      Название картинкиЕсли значения отличаются, проверьте выполненные настройки и перезапустите коннектор (выполните последовательность «Выключить» - «Включить»).
    3. Перейдите в раздел «Параметры» - «Типы событий». Выберите типы событий, которые необходимо передавать в KUMA, и активируйте для них отправку через созданный коннектор.

      Название картинки

Проверка передачи событий

    1. В интерфейсе KUMA перейдите в раздел «События» и выполните опрос источников.

      Название картинки
    2. Убедитесь в наличии событие об успешной аутентификации коннектора, которое должно появиться в момент его создания в KICS for Networks.

      Название картинки


    1. Воспроизведите событие безопасности, например, запустите тестовый вирус на узле, который интегрирован с KICS for Networks.

      Название картинки


    1. Убедитесь, что сработал модуль постоянной защиты KICS for Nodes (детектирование события на стороне источника).

      Название картинки


    1. В интерфейсе KUMA снова перейдите в раздел «События» и выполните опрос.

      Название картинки


    1. Убедитесь, что воспроизведенное событие безопасности успешно доставлено и отображается в KUMA.

      Название картинки
Интеграция KICS for Networks

Интеграция с Zabbix

Интеграция KICS for Networks 4.3 с Zabbix

В данной статье описан порядок обеспечения мониторинга работоспособности сервисов KICS for Networks 4.3 с помощью Zabbix.

1.                   Настройка сервера Zabbix

         1.1        Подготовка системы

Проверьте наличие локали en_US.UTF-8:

locale -a | grep en_US

Если локаль отсутствует, добавьте её:

sudo sed -i "s/^#\s*\(en_US.UTF-8 UTF-8\)/\1/" /etc/locale.gen
sudo locale-gen en_US.UTF-8
sudo update-locale en_US.UTF-8

1.2               Установка пакетов Zabbix Server

sudo apt update
sudo apt install -y zabbix-server-pgsql zabbix-frontend-php php-pgsql postgresql apache2 libapache2-mod-php

1.3               Настройка часового пояса в PHP

Отредактировать файл /etc/php/*/apache2/php.ini :

sudo nano /etc/php/*/apache2/php.ini

Ctrl+o, Ctrl+x для сохранения и выхода

Найти и раскомментировать строку [Date]:

date.timezone = Europe/Moscow

1.4               Настройка PostgreSQL

Создание базы данных и пользователя

sudo -u postgres psql
CREATE DATABASE zabbix;
CREATE USER zabbix WITH PASSWORD 'Qwerty!@#123';
GRANT ALL PRIVILEGES ON DATABASE zabbix TO zabbix;
\q

Импорт схемы базы данных

sudo -u postgres psql -d zabbix -c "GRANT ALL ON SCHEMA public TO zabbix;"
sudo -u postgres zcat /usr/share/zabbix-server-pgsql/{schema,images,data}.sql.gz | PGPASSWORD='Qwerty!@#123' psql -U zabbix -d zabbix -h 127.0.0.1

1.5               Настройка мандатного доступа (МРД/МКЦ)

Если на сервере Zabbix включены режимы "Воронеж" или "Смоленск", выполнить дополнительные настройки:

Назначение меток безопасности:

sudo pdpl-user -l 0:0 postgres
sudo pdpl-user -l 0:0 zabbix
Права на чтение базы меток

Права на чтение базы меток:

sudo setfacl -d -m u:postgres:r /etc/parsec/{macdb,capdb}
sudo setfacl -R -m u:postgres:r /etc/parsec/{macdb,capdb}
sudo setfacl -m u:postgres:rx /etc/parsec/{macdb,capdb}

1.6               Настройка Zabbix Server

Отредактировать конфигурационный файл:

sudo nano /etc/zabbix/zabbix_server.conf

Указать параметры подключения к БД (в данном примере будем считать, что БД установлена на самом сервере Zabbix):

DBHost=127.0.0.1
DBName=zabbix  (может быть уже указано в файле)
DBUser=zabbix (может быть уже указано в файле)
DBPassword=Qwerty!@#123 (для примера взят пароль Qwerty!@#123)

Ctrl+o, Ctrl+x для сохранения и выхода

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

sudo systemctl restart zabbix-server
sudo systemctl enable zabbix-server
sudo systemctl status zabbix-server

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

Копирование конфигурационного файла 

sudo cp /usr/share/zabbix/conf/zabbix.conf.php.example /etc/zabbix/zabbix.conf.php
sudo chown www-data:www-data /etc/zabbix/zabbix.conf.php
sudo chmod 644 /etc/zabbix/zabbix.conf.php

Настройка пароля в конфигурации

Отредактировать конфигурационный файл:

sudo nano /etc/zabbix/zabbix.conf.php

Найти строку с типом СУБД и указать:

$DB['TYPE'] = 'POSTGRESQL';

Найти строку с паролем и указать:

$DB['PASSWORD'] = 'Qwerty!@#123';

Ctrl+o, Ctrl+x для сохранения и выхода

Включение конфигурации Zabbix в Apache

sudo a2enconf zabbix-frontend-php
sudo systemctl start apache2
sudo systemctl enable apache2
sudo systemctl reload apache2

1.8               Настройка AstraMode

Для корректной работы веб-интерфейса добавьте в конфигурацию Apache:

sudo nano /etc/apache2/apache2.conf

Добавьте строку (только для тестовой среды):

AstraMode off

Ctrl+o, Ctrl+x для сохранения и выхода

Перезагрузить Apache:

sudo systemctl reload apache2

1.9               Проверка веб-интерфейса

Открыть в браузере: http://<IP_сервера_Zabbix>/zabbix

Учётные данные для входа (по умолчанию):

·  Username: Admin

·  Password: zabbix

Должны отобразиться дашборды сервиса Zabbix

2.                  Настройка сервера KICS for Networtks

2.1               Установка Zabbix Agent

sudo apt update
sudo apt install -y zabbix-agent

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

Отредактировать файл /etc/zabbix/zabbix_agentd.conf:

sudo nano /etc/zabbix/zabbix_agentd.conf

Указать параметры:

Server=<IP_сервера_Zabbix>
ServerActive=<IP_ сервера_Zabbix >
Hostname=kics4networks

Ctrl+o, Ctrl+x для сохранения и выхода

2.3             Настройка прав для сбора данных аудита

sudo usermod -aG adm zabbix

2.4              Создание пользовательского параметра для мониторинга сервиса kics4net-webserver

Проверьте каталог, используемый директивой Include в файле /etc/zabbix/zabbix_agentd.conf:

Include=/etc/zabbix/zabbix_agentd.conf.d/*.conf

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

sudo mkdir -p /etc/zabbix/zabbix_agentd.conf.d/
sudo nano /etc/zabbix/zabbix_agentd.conf.d/kics_services.conf

Вставьте содержимое:

UserParameter=kics.status[*],test "$(systemctl is-active "$1" 2>/dev/null)" = "active" && echo 1 || echo 0

Ctrl+o, Ctrl+x для сохранения и выхода

Установка прав

sudo chown zabbix:zabbix /etc/zabbix/zabbix_agentd.d/kics_services.conf
sudo chmod 644 /etc/zabbix/zabbix_agentd.d/kics_services.conf

2.5             Проверка директивы Include в основном конфиге

Убедиться, что в файле /etc/zabbix/zabbix_agentd.conf присутствует строка:

Include=/etc/zabbix/zabbix_agentd.conf.d/*.conf
sudo nano /etc/zabbix/zabbix_agentd.conf

Проверьте корректность конфигурации:

sudo zabbix_agentd -T

Ожидаемый результат:

Validation successful

2.6             Запуск и проверка агента

sudo systemctl restart zabbix-agent
sudo systemctl enable zabbix-agent
sudo systemctl status zabbix-agent

2.7              Проверка пользовательского параметра

На сервере KICS for Networks выполнить проверку:

sudo zabbix_agentd -t 'kics.status[kics4net-webserver]'

Ожидаемый результат: (если сервис запущен)

kics.status[kics4net-webserver] [u|1]

или

kics.status[kics4net-webserver] [t|1]

С сервера Zabbix выполнить проверку:

zabbix_get -s <IP_сервера_KICS for Networks> -p 10050 -k "kics.status[kics4net-webserver]"

Ожидаемый результат: (если сервис запущен): 1

3.                  Настройка мониторинга в веб-интерфейсе Zabbix

3.1               Импорт шаблона Astra Linux (опционально)

Войти в веб-интерфейс Zabbix (Admin / zabbix)

Перейти: Data collection (или Configuration) → Templates

Нажать Import

Выбрать файл: /usr/share/zabbix/conf/zabbix_astra_template.xml

Нажать Import два раза

3.2             Создание узла сети (Host)

Перейти: Data collection (или Configuration) → Hosts

Нажать Create host

Заполнить форму:

Host name

kics4networks (строго совпадает с Hostname в конфиге агента)

Groups

Linux servers

Interfaces

Agent

Agent interface

IP-адрес сервера KICS for Networks, порт 10050

Нажать Add

Спустя примерно 1 минуту в графе Availability на строке kics4networks значок ZBX должен окраситься в зелёный цвет.

3.3             Создание элемента данных (Item) для мониторинга сервиса kics4net-webserver

Перейти: Data collection (или Configuration) → Hosts

На строке узла kics4networks нажать на Items

Нажать Create item

Заполнить форму:

Name

KICS: kics4net-webserver service status

Type

Zabbix agent

Key

kics.status[kics4net-webserver]

Type of information

Numeric (unsigned)

Update interval

30s

History storage period

90d

Нажать Add

Аналогично можно добавить Item для мониторинга других сервисов KICS for Networks, заменив в параметре “Key” значение kics4net-webserver на следующие

3.4             Создание триггера для оповещения

На вкладке Items найти созданный элемент

Перейти на вкладку Triggers → Create trigger

Заполнить форму:

Name

KICS: kics4net-webserver is not running

Severity

High

Expression

last(/kics4networks/kics.status[kics4net-webserver])=0

Нажать Add

3.5             Создание агрегирующего триггера для оповещения об остановке хотя бы одной из служб KICS for Networks

3.5.1       Добавить UserParameter для обнаружения сервисов

Создать файл:

sudo nano /etc/zabbix/zabbix_agentd.conf.d/kics_discovery.conf

Содержимое:

 UserParameter=kics.discovery,echo '{"data":[{"{#SERVICE}":"kics4net"},{"{#SERVICE}":"kics4net-apm"},{"{#SERVICE}":"kics4net-asset-config-repo"},{"{#SERVICE}":"kics4net-asset-inventory"},{"{#SERVICE}":"kics4net-blob-storage"},{"{#SERVICE}":"kics4net-config-control-orchestrator"},{"{#SERVICE}":"kics4net-connectors-launcher"},{"{#SERVICE}":"kics4net-email-gateway"},{"{#SERVICE}":"kics4net-epp-proxy"},{"{#SERVICE}":"kics4net-fts"},{"{#SERVICE}":"kics4net-nats-server"},{"{#SERVICE}":"kics4net-oval-facade"},{"{#SERVICE}":"kics4net-postgresql"},{"{#SERVICE}":"kics4net-report-builder"},{"{#SERVICE}":"kics4net-report-data-source"},{"{#SERVICE}":"kics4net-report-renderer"},{"{#SERVICE}":"kics4net-report-templates-catalog"},{"{#SERVICE}":"kics4net-report-templates-catalog-view"},{"{#SERVICE}":"kics4net-responses-manager"},{"{#SERVICE}":"kics4net-risk-oval-detector"},{"{#SERVICE}":"kics4net-scan-oval-manager"},{"{#SERVICE}":"kics4net-scap-manager"},{"{#SERVICE}":"kics4net-scap-manager-view"},{"{#SERVICE}":"kics4net-scheduler"},{"{#SERVICE}":"kics4net-secrets"},{"{#SERVICE}":"kics4net-task-manager"},{"{#SERVICE}":"kics4net-task-manager-view"},{"{#SERVICE}":"kics4net-vault"},{"{#SERVICE}":"kics4net-webserver"}]}'

Перезапустить агент: 

sudo systemctl restart zabbix-agent

Проверить UserParameter для обнаружения сервисов:

sudo zabbix_agentd -t kics.discovery

Должен вернуться JSON.

 3.5.2      Создать Discovery Rule

На сервере Zabbix перейти на вкладки:

Configuration

→ Hosts → KICS for Networks → Discovery → Create discovery rule

Указать параметры для правила обнаружения:

3.5.3      Создать Item Prototype

Внутри Discovery Rule:

Item prototypes → Create item prototype

Указать параметры:

3.5.4      Создать Trigger Prototype

Внутри того же Discovery Rule открыть:

Trigger prototypes → Create trigger prototype

Указать параметры:

После выполнения Discovery Zabbix автоматически создаст:

1)                   Элементы данных:

2)                 Триггеры:

 Если остановить один из сервисов KICS for Networks:

sudo systemctl stop kics4net-webserver

то в Problems появится новое сообщение: Service kics4net-webserver is stopped

Интеграция KICS for Networks

Инструкция по настройке коннектора KUMA в KICS for Networks

Коннектор KUMA обеспечивает интеграцию KICS for Networks и Kaspersky Unified Monitoring and Analysis Platform в части

отправки сведений об устройствах и рисках, а также применения команд на изменение статусов устройств.      

Для настройки коннектора:

1.    В интерфейсе KICS for Networks перейдите в раздел «Параметры», выберите вкладку «Коннекторы» и нажмите кнопку «Добавить коннектор».

2.    В открывшейся карточке введите имя коннектора и адрес узла, на котором будет размещаться коннектор, а также установите пароль для доступа к сертификату коннектора, после чего нажмите кнопку «Сохранить».

image.png

3.    Дождитесь автоматического сохранения архива с сертификатом коннектора. Архив сохраняется в каталог загрузок вашего браузера. На текущем шаге коннектор должен иметь статус «Ожидает регистрации» и признак «Нет» по параметру «Включён».

image.png

4.    В интерфейсе KUMA перейдите в раздел «Интеграции», выберите вкладку «KICS/KATA» и нажмите кнопку «Добавить параметры для нового тенанта».

image.png

5.    В открывшейся карточке выберите тенант Main, установите интервал обновления данных и нажмите кнопку «Добавить».

image.png

6.    В карточке подключения добавьте файл свёртки и введите ранее установленный пароль для сертификата, после чего нажмите кнопку «Добавить».

image.png

7.    В карточке настройки интеграции проверьте корректность адреса сервера KICS for Networks, нажмите кнопку «Импортировать активы KICS/KATA», после чего нажмите кнопку «Сохранить».

image.png

8.    В интерфейсе KUMA перейдите в раздел «Активы» и убедитесь в наличии в системе информации, полученной об активах от соответствующего источника.

image.png

9.    Выберите интересующий вас актив и откройте его карточку, убедитесь в наличии информации об активе в карточке актива.

image.png

Добавление активов других источников выполняется аналогично.

Интеграция KICS for Nodes

Интеграция KICS for Nodes

Интеграция KICS for Nodes и KICS for Networks + EDR основные возможности и руководство по настройке

Kaspersky Industrial CyberSecurity for Networks (KICS for Networks) предоставляет нативную интеграцию с KICS for Nodes, благодаря чему предоставляется возможность получать телеметрию с конечных узлов за счет интеграции с Kaspersky Endpoint Agent и выполнять функции реагирования на конечном узле (изоляция устройство от сети, запрет запуска, поместить на карантин). KEA – это отдельное лицензируемое ПО, которое устанавливается на каждый конечный узел.


Возможности интеграции


Настройка интеграции KICS for Networks и KICS for Nodes

Интеграция осуществляется через интерфейс KICS for Networks. Для этого необходимо следующие шаги:

Шаг 1. Переходим во вкладку «Параметры» и выбираем раздел «Серверы подключений»;

Шаг 2. Нажимаем кнопку «Добавить сервер интеграции с Kaspersky Endpoint Agent» (см. пример на Рисунке 1).

Примечание: В роли сервера, который будет получать телеметрию с KEA-агента, может выступать как сервер, так и любой сенсор KICS for Networks. Важно, чтобы между конечным узлом, с которого будет передаваться информация и сервером/сенсором KICS for Networks был настроен маршрут и разрешены соответствующие порты и протоколы (TLS, порт 8081).

image.png

Рисунок 1 - Добавление сервера интеграции

Шаг 3. Далее нам предоставляется возможность выбрать узел, на который будет приходить телеметрия с KEA-агента. Например, мы можем выбрать узел «Server» или сенсор «sensor_1» (см. на примере Рисунка 2).

image.png

Рисунок 2 - Создание сервера интеграции

Шаг 4. Нажимаем кнопку «Создать новый сертификат» (см. Рисунок 3).

Примечание: Если необходимо дополнительно осуществлять проверку сертификата клиента (конечного узла), то, помимо нажатия кнопки «Создать новый сертификат», необходимо активировать переключатель «Проверять сертификаты клиентов» и кнопку «Сохранить».

image.png

Рисунок 3 - Создание сервера интеграции

Шаг 5. После нажатия кнопки «Создать новый сертификат» отобразятся сведения о сертификате. Необходимо нажать кнопку «Сохранить».

Шаг 6. В результате в источниках появится выбранный узел (сервер или сенсор) KICS for Networks и будет указан IP-адрес его интерфейса MGMT, куда в последствии будут направляться данные от конечных узлов. Далее необходимо настроить KEA-агент на конечных узлах, для этого необходимо получить свертку сертификата от узла, на котором развернут сервер интеграции KICS for Networks.

Выбираем сервер интеграции. Нажимаем кнопку «Включить» и далее кнопку «Получить файл свертки для клиентов» (см. Рисунок 4).

image.png

Рисунок 4 - Создание файла свертки для клиентов

Шаг 7. Сервер интеграции изменит свой статус на «Включен» и осуществит загрузку zip-архива с вложенным файлом server.cer. После чего необходимо доставить загруженный zip-архив на конечные узлы с установленным KEA-агентом. Есть несколько способов настройки интеграции на стороне узла, и мы рассмотрим каждый из них подробнее ниже.

Примечание: Если ранее был активирован переключатель «Проверять сертификаты клиентов», то для обеспечения подлинности клиентского сертификата, нужно указать пароль при формировании файла свертки. Нажать кнопку «Создать файл свертки».

Шаг 8. Переходим к настройке интеграции на стороне конечных узлов с KICS for Nodes и KEA. Есть два способа: через web-консоль KSC и локально из командной строки.


1 способ: настройка интеграции через web-консоль KSC

Важным условием является наличие установленных KEA-агентов на каждом конечном узле, а также на сервере администрирования KSC установлен web-плагин KEA.

В веб-консоли KSC переходим в раздел «Устройства – Политики и профили политик». Выбрать политику для KEA (см. Рисунок 5).

image.png

Рисунок 5 - Начало настройки "Политики и профилей политики"

Далее переходим на вкладку «Параметры программы – Серверы сбора телеметрии». Выбираем пункт «Интеграция с KICS for Networks». После чего необходимо активировать переключатель «Принудительно», если он не активирован. Отметить чекбокс «Включить интеграцию с KICS for Networks». В графе «Адрес сервера» указать адрес сервера интеграции. Остальные настройки оставить по умолчанию. Нажать кнопку «Добавить новый TLS-сертификат» (см. Рисунок 6) – для этого нажимаем кнопку «Обзор». Выбрать файл TLS-сертификата server.cer (предварительно извлечь его из архива). После чего отобразятся данные TLS-сертификата и нажимаем кнопку «ОК», после кнопку «Сохранить».

image.png

Рисунок 6 - Настройка интеграции с KICS for Networks


2 способ: настройка локально из командной строки на конечном узле (для Windows систем)

Если отсутствует сервер администрирования KSC, то настройку можно осуществить локально. Для этого переносим сертификат server.cer из файла свертки сервера интеграции KICS for Networks. Открываем командную строку и вводим (см. пример наи Рисунке 7):

cd C:\Program Files (x86)\Kaspersky Lab\Endpoint Agent\
agent.exe --message-broker=enable --type=kics --tls=yes --servers=ip-адрес сервера, настроенный как сервер интеграции Networks:8081 --pinned-certificate="путь до файла server.cer"

image.png

Рисунок 7 - Пример ввода команды

По умолчанию время синхронизации (sync_priod) составляет 300 секунд. Чтобы сократить его, например, до 60 секунд нужно ввести команду:

agent --message-broker=enable --type=kics –-sync-period=60

где --message-broker=<enable|disable|show> - обязательный параметр. Позволяет включить, выключить и отобразить статус отправки телеметрии в направлении сервера. 

Для того, чтобы проверить корректноcть настроек нужно ввести команду:

agent –-message-broker=show

2 способ: настройка локально из командной строки на конечном узле (для Linux систем)

Если отсутствует сервер администрирования KSC, то настройку можно осуществить локально. Для этого переносим сертификат server.cer из файла свертки сервера интеграции KICS for Networks. Открываем командную строку и вводим (см. пример наи Рисунке 8):

kics-control --add-kics4networks-server-certificate путь до файла server.cer

image.png

Рисунок 8 - Пример ввода команды

Указать адрес сервера KICS for Networks и перезапустить задачу интеграции:

kics-control --set-settings 23 Endpoints.item_0001.Address=1 ip-адрес сервера, настроенный как сервер интеграции Networks

Далее запускаем команды, чтобы перезапустить сервер:

kics-control --stop-task 23
kics-control --start-task 23

Шаг 9. Для того, чтобы проверить интеграцию KEA с KICS for Networks, переходим в веб-интерфейс KICS for Networks и посмотреть свойства актива, на котором установлен KEA, проверить наличие информации о KEA и KICS for Nodes на узле (см. пример на Рисунке 9).

image.png

Рисунок 9 - Пример интеграции

Интеграция KICS for Networks и SD-WAN: варианты совместного применения

Kaspersky Industrial CyberSecurity for Networks (KICS for Networks) поддерживает интеграцию с Kaspersky SD-WAN, что позволяет расширить возможности мониторинга и защиты промышленных сетей. В таком режиме KICS for Networks получает зеркалированный трафик с удаленных площадок через устройства Customer Premise Equipment (CPE) SD-WAN.


Архитектура «Транспорт SPAN»

Данная схема предполагает передачу трафика промышленных сетей с географически распределенных объектов в KICS for Networks через защищенные каналы SD-WAN.

Принцип работы:

  1. Устройства CPE на удаленных площадках получают зеркалированный трафик через сетевые коммутаторы.
  2. Трафик шифруется и передается на принимающие CPE-устройства, расположенные в одной сети с узлами KICS for Networks.
  3. Принимающие CPE выполняют роль шлюза SD-WAN (если требуется маршрутизация через шлюз) и передают трафик на сетевые интерфейсы KICS for Networks.

Идентификация трафика

Для корректного определения источника трафика используется VLAN (IEEE 802.1q). Каждому устройству CPE назначается уникальный VLAN-ID, который должен совпадать с настройками на узле KICS for Networks.

Ограничения режима интеграции


Архитектура с использованием CPE в качестве TAP-устройств

Если на удаленной площадке нет возможности зеркалировать трафик через коммутаторы, CPE SD-WAN могут выступать в роли TAP-устройств, захватывая и передавая трафик в KICS for Networks.


Дополнительные варианты применения SD-WAN

1. Вариант «Транспорт»

Используется для организации защищенных каналов связи между компонентами сети Kaspersky Industrial Cyber Security и охватывает решения:

Такая схема обеспечивает безопасный обмен данными в управляющей сети.

2. Вариант «Растянутый коммутатор»

Позволяет объединить географически распределенные объекты в единую защищенную сеть, обеспечивая безопасное взаимодействие между ними.


Заключение

Все описанные варианты интеграции KICS for Networks и SD-WAN могут комбинироваться в зависимости от задач проекта. Это позволяет гибко настраивать защиту промышленной инфраструктуры, обеспечивая безопасность и контроль трафика на всех уровнях.

Если требуется индивидуальная конфигурация, рекомендуется обратиться к документации или специалистам Kaspersky для оптимального развертывания решений.