Интеграция 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 (версий 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.

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

Интеграция с 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