Интеграция KICS for Networks
- API KICS for Networks
- Настройка передачи событий из KICS for Networks (версий 4.3 и 4.5) в KUMA
- Интеграция с Zabbix
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.
- ОТКРЫТЬ ДОКУМЕНТАЦИЮ С ОПИСАНИЕМ ЗАПРОСОВ К СЕРВЕРУ REST API, версия 3
- ОТКРЫТЬ ДОКУМЕНТАЦИЮ С ОПИСАНИЕМ ЗАПРОСОВ К СЕРВЕРУ REST API, версия 4
Примеры использования
Рассмотрим пример использования API для локального экспорта данных об устройствах из KICS for Networks.
Для начала нужно создать коннектор, с типом Generic и именем, например, GetDeviceAll, указать пароль и адрес сервера, узел размещения коннектора в нашем случае будет такой же, как и адрес сервера (Рисунок 1). После создания коннектора у вас скачается файл свертки, который будет называться как коннектор_GetDeviceAll.zip.
Рисунок 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.
Рисунок 2 – Регистрация коннектора
После этого статус коннектора в KICS for Networks поменяется с “Ожидает регистрации” на “Работает”
Рисунок 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.
Рисунок 4 – Вывод логов скрипта по экспорту данных
Рисунок 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
- Перейдите в раздел «Ресурсы» и откройте вкладку «Коллекторы».
- Нажмите кнопку «+ Создать».
- В открывшемся окне укажите название коллектора. Рекомендуется использовать наименование продукта, тип подключения и порт (например, KICS_for_Networks_TCP\5160), чтобы в дальнейшем легко идентифицировать коллектор.
- На вкладке «Транспорт» укажите тип соединения (протокол) и порт, который будет использоваться для приема событий от источника.
- На вкладке «Парсинг событий» - «Настройки парсинга» выберите соответствующий нормализатор для обработки входящих событий.
- На вкладке «Маршрутизация» добавьте ранее созданные коррелятор и хранилище. Подробнее о развертывании этих компонентов см. в Справке по KUMA.
- На вкладке «Проверка параметров» нажмите кнопку «Сохранить и создать сервис».
- После создания коллектора скопируйте сгенерированную команду и выполните её в терминале сервера KUMA с правами администратора для развертывания сервиса.
Настройка KICS for Networks
- Перейдите в раздел «Параметры» - «Коннекторы» и нажмите кнопку «+ Добавить коннектор».
- В карточке нового коннектора заполните поля:
- Тип коннектора: SIEM.
- Имя коннектора: Произвольное наименование.
- Адрес сервера: IP-адрес узла, на котором развернут сервер KICS for Networks.
- Узел размещения коннектора: Server.
- Пользователь программы: Учетная запись администратора KICS for Networks.
- Адрес SIEM-сервера: IP-адрес узла, на котором развернут сервер KUMA.
- Номер порта: Порт, указанный при настройке коллектора KUMA (см. п. 4 раздела «Настройка KUMA»).
- Транспортный протокол: Протокол, указанный при настройке коллектора KUMA (см. п. 4 раздела «Настройка KUMA»).
- Нажмите кнопку «Сохранить».
- Убедитесь, что в свойствах созданного коннектора параметры имеют следующие значения:
- Включен: Да.
- Статус: Работает.
Если значения отличаются, проверьте выполненные настройки и перезапустите коннектор (выполните последовательность «Выключить» - «Включить»).
- Перейдите в раздел «Параметры» - «Типы событий». Выберите типы событий, которые необходимо передавать в KUMA, и активируйте для них отправку через созданный коннектор.
Проверка передачи событий
- В интерфейсе KUMA перейдите в раздел «События» и выполните опрос источников.
- Убедитесь в наличии событие об успешной аутентификации коннектора, которое должно появиться в момент его создания в KICS for Networks.
- Воспроизведите событие безопасности, например, запустите тестовый вирус на узле, который интегрирован с KICS for Networks.
- Убедитесь, что сработал модуль постоянной защиты KICS for Nodes (детектирование события на стороне источника).
- В интерфейсе KUMA снова перейдите в раздел «События» и выполните опрос.
- Убедитесь, что воспроизведенное событие безопасности успешно доставлено и отображается в 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 на следующие
- kics4net
- kics4net-apm
- kics4net-asset-config-repo
- kics4net-asset-inventory
- kics4net-blob-storage
- kics4net-config-control-orchestrator
- kics4net-connectors-launcher
- kics4net-email-gateway
- kics4net-epp-proxy
- kics4net-fts
- kics4net-nats-server
- kics4net-oval-facade
- kics4net-postgresql
- kics4net-report-builder
- kics4net-report-data-source
- kics4net-report-renderer
- kics4net-report-templates-catalog
- kics4net-report-templates-catalog-view
- kics4net-responses-manager
- kics4net-risk-oval-detector
- kics4net-scan-oval-manager
- kics4net-scap-manager
- kics4net-scap-manager-view
- kics4net-scheduler
- kics4net-secrets
- kics4net-task-manager
- kics4net-task-manager-view
- kics4net-vault
- 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
Указать параметры для правила обнаружения:
- Name: KICS Services Discovery
- Type: Zabbix agent
- Key: kics.discovery
- Update interval: 1h
3.5.3 Создать Item Prototype
Внутри Discovery Rule:
Item prototypes → Create item prototype
Указать параметры:
- Name: Service {#SERVICE} status
- Type: Zabbix agent
- Key: kics.status[{#SERVICE}]
- Type of information: Numeric (unsigned)
- Update interval: 1m
3.5.4 Создать Trigger Prototype
Внутри того же Discovery Rule открыть:
Trigger prototypes → Create trigger prototype
Указать параметры:
- Имя: Service {#SERVICE} is stopped
- Выражение: last(/KICS for Networks/kics.status[{#SERVICE}])=0
- Severity: High
После выполнения Discovery Zabbix автоматически создаст:
1) Элементы данных:
- Service kics4net status
- Service kics4net-apm status
- ..
- Service kics4net-webserver status
2) Триггеры:
- Service kics4net is stopped
- Service kics4net-apm is stopped
- ...
- Service kics4net-webserver is stopped
Если остановить один из сервисов KICS for Networks:
sudo systemctl stop kics4net-webserver
то в Problems появится новое сообщение: Service kics4net-webserver is stopped