Учебное руководство по разработке приложения на Python: часть 2

13 марта 2025

ID 201594

В этом руководстве описывается реализация обмена данными с Kaspersky CyberTrace в приложении на Python.

В части 1 этого руководства описывается приложение, отправляющее данные в Kaspersky CyberTrace.

В части 2 этого руководства описывается приложение, ожидающее получения событий от Kaspersky CyberTrace.

Введение

Эта часть руководства посвящена реализации приложения Python, прослушивающего порт в ожидании событий от Kaspersky CyberTrace.

Имя для приложения можно выбрать произвольно. В примерах в этом руководстве для этого приложения используется имя файла listen_events_cybertrace.py.

О настройках подключения и форматах событий

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

Для определения адреса и порта, на которые отправляются события, в Kaspersky CyberTrace используется параметр OutputSettings > ConnectionString. Адрес и порт для исходящих событий можно просмотреть и настроить на странице Service settings в веб-интерфейсе Kaspersky CyberTrace.

Для определения формата событий Kaspersky CyberTrace использует форматы из раздела OutputSettings конфигурационного файла Kaspersky CyberTrace Service. Каждое событие заканчивается символом новой строки (\n). Форматы событий можно настроить на странице Service alerts settings в веб-интерфейсе Kaspersky CyberTrace.

1-й этап. Определение функции main()

На этом этапе выполняются следующие действия:

  1. Импорт модуля socket.

    Функции из этого модуля используются для установления соединения с Kaspersky CyberTrace и получения данных.

  2. Определение функции main().
  3. В переменных LISTEN_ADDR и LISTEN_PORT необходимо указать адрес и порт, которые приложение будет прослушивать в ожидании входящих событий.

    Эту информацию можно получить в веб-интерфейсе Kaspersky CyberTrace на странице General settings, в области Входящие события.

2-й этап. Добавление код сервера

На этом этапе выполняются следующие действия:

  1. Добавление в функцию main() кода, запускающего сервер, прослушивающий указанные адрес и порт.
  2. Добавление кода, обрабатывающего входящие соединения.

    Функция socket.accept() принимает входящее соединение. Она возвращает новый объект сокета для соединения (в переменной connection) и адрес на другом конце, инициировавший соединение (в переменной client_address).

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

    Приложение запускает бесконечный цикл. Его можно завершить стандартной комбинацией клавиш или командой операционной системы. В большинстве операционных систем это ^C или Ctrl+C.

3-й этап. Парсинг полученных данных

На этом этапе выполняются следующие действия:

  1. В блоке try... finally вызывается функцию, которая выполняет парсинг полученных данных на события.

    Поскольку в рамках каждого соединения может быть отправлено любое количество событий, приложение должно продолжать парсинг полученных данных, пока не будут обработаны все события. Функция parse_response() возвращает генератор. Затем этот генератор используется в цикле for для итерации по полученным событиям. На следующем шаге реализуется функция parse_response().

  2. Реализация функции parse_response().

    События Kaspersky CyberTrace оканчиваются символом новой строки (\n). Функция parse_response() считывает данные из сокетного соединения в буфер до тех пор, пока в буфере не окажется символ новой строки. Затем функция выделяет событие из буфера и возвращает его. Функция chunk_receive() выполняет итерацию по данным из сокетного соединения. Эта функция будет реализована на следующем этапе.

    Когда цикл for из функции main() переходит к следующей итерации, функция parse_response() выделяет из буфера очередное событие и возвращает его. Если это невозможно, функция считывает дополнительные данные из соединения в буфер. Процесс повторяется до тех пор, пока из соединения не перестанут поступать данные и все события в буфере не будут возвращены.

  3. Реализация функции chunk_receive().

    Функция chunk_receive() считывает 4096 байт данных из соединения и возвращает эти данные. Функция возвращает данные до тех пор, пока в соединении не закончатся данные.

    Функция socket.recv() получает данные из соединения. Если данных нет, функция ожидает получения новых данных. Функция возвращает ноль байтов при закрытии соединения, поэтому цикл while завершается при выполнении этого условия.

Этап 5. (Необязательный) Изменение приложения, отправляющее события

Если требуется отправлять события в Kaspersky CyberTrace с помощью приложения, реализованного в части 1 этого руководства, измените приложение так, чтобы события отправлялись без ожидания ответа.

На этом этапе выполняются следующие действия:

  1. Закомментируйте или удалите строку в коде приложения, которая отправляет флаги. Теперь Kaspersky CyberTrace отправляет события приложению-слушателю, поэтому флаг X-KF-ReplyBack становится излишним.
  2. Закомментируйте или удалите строки, которые получают и выводят ответ.

Ниже приведен блок try... finally из приложения с закомментированными строками.

6-й этап. Запуск приложения

Запуск приложения из консоли:

python3 ./listen_events_cybertrace.py

Приложение прослушивает порт в ожидании событий обнаружения киберугроз и оповещений о событиях из Kaspersky CyberTrace и выводит их в консоль.

Если требуется отправлять события в Kaspersky CyberTrace с помощью приложения, разработанного в части 1 этого руководства, запустите это приложение из консоли:

python3 ./send_events_cybertrace.py

Ниже приведен пример вывода приложения.

Полный код для части 2

Ниже приведен полный код для части 2 этого руководства.

Вам помогла эта статья?
Что нам нужно улучшить?
Спасибо за ваш отзыв, вы помогаете нам становиться лучше!
Спасибо за ваш отзыв, вы помогаете нам становиться лучше!