Перейти к содержанию

Защита от шторма сообщений

Назначение

Защита от шторма сообщений предназначена для использования в сервисах-коллекторах, то есть сервисах принимающих сообщения от устройств по протоколу UDP или любому другому. На текущий момент этому условию удовлетворяют сервисы syslogcollector и trapcollector.

Защита от шторма сообщений позволяет блокировать сообщения или выполнить другие действия в соответствии с политикой при приходе слишком большого количества сообщений от какого-либо из устройств не препятствуя приходу сообщений от других устройств.

Требования к сервису

В классе сервиса должен пристутствовать атрибут содержащий конфигурации устройств, включающую в себя как минимум следующие поля: * id - ID управляемного объекта * partition - партиция * storm_policy - политика защиты от шторма * storm_threshold - порог сообщений защиты от шторма

Его имя задается в модуле stormprotection.py константой COLLECTOR_CONFIG_ATTRNAME.

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

Защита осуществляется путем использования класса noc.core.service.stormprotection.StormProtection. При инициализации объекта данного класса происходит запуск периодически повторяющегося процесса - раунда проверки. В течении раунда проверки накапливаются данные по количеству пришедших сообщений с каждого из устройств. В конце раунда происходит определение факта превышения количеством принятых сообщений порога включения защиты для данного устройства. Если порог превышен, то предпринимаются действия в соответствии с политикой защиты от шторма для данного устройства. Эта информация сохраняется и далее используется в течении следующего раунда по отношению ко всем приходящим в сервис-коллектор сообщениям. Вышеперечисленные действия выполняются автоматически в классе StormProtection. В самом же сервисе помимо создания объекта StormProtection и его инициализации необходимо при приеме каждого сообщения выполнить метод process_messages. Он выполнит следующие действия: * увеличит на единицу счетчик сообщений для устройства * выполнит действия в соотвествии с текущим статусом превышения порога сообщений устройства - поднимет аварию, если она еще не поднята * в качестве результата вернет признак - требуется блокировка сообщения в сервисе или нет

Блокировка сообщения выполняется в самом сервисе путем не отправления сообщения, например выходом из соотвествующего метода.

Пример кода использования защита от шторма сообщений:

# создание и инициализация объекта `StormProtection`
class TrapCollectorService(FastAPIService):
    async def on_activate(self):
        ...
        self.storm_protection = StormProtection(
            config.trapcollector.storm_round_duration,
            config.trapcollector.storm_threshold_reduction,
            config.trapcollector.storm_record_ttl,
            TRAPCOLLECTOR_STORM_ALARM_CLASS,
        )
        self.storm_protection.initialize()


# обработка сообщения и его блокировка при необходимости
class TrapServer(UDPServer):
    def on_read(self, data: bytes, address: Tuple[str, int]):
        ...
        if cfg.storm_policy != "D":
            need_block = self.service.storm_protection.process_message(address[0])
            if need_block:
                return

Описание методов класса StormProtection

  • initialize() - инициализация объекта
  • pocess_message(ip_address: str) - обработка сообщения для указанного устройства. Выполняет следующие действия:
  • увеличивает на единицу счетчик сообщений для устройства
  • выполняет действия в соотвествии с текущим статусом превышения порога сообщений устройства - поднимает аварию, если она еще не поднята
  • в качестве результата возвращает признак - требуется блокировка сообщения в сервисе или нет

Дополнительные действия объекта StormProtection

В объекте класса StormProtection также автоматически при необходимости производятся следующие дополнительные действия: * Закрывается авария, если защита с устройства была снята * Из таблицы устройств (внутренней для класса StormProtection) удаляются записи об устройствах, от которых перестали приходить сообщения

Доступные настройки

В глобальных настройках (для конкретного сервиса): * storm_round_duration - длительность раунда проверки в секундах * storm_threshold_reduction - отношение порога отключения к порогу включения защиты * storm_record_ttl - максимальное время жизни (в раундах) записи об устройстве в случае отсутствия сообщений

В настройках устройства (SourceConfig): * storm_policy - политика защиты от шторма - отключить (Disabled - D) - блокировать отправителя (Block - B) - поднять аварию (Raise Alarm - R) - блокировать отправителя и поднять аварию (Block & Raise Alarm - A) * storm_threshold - пороговое количество сообщений за раунд для включения защиты