Защита от шторма сообщений¶
Назначение¶
Защита от шторма сообщений предназначена для использования в сервисах-коллекторах, то есть сервисах принимающих сообщения от устройств по протоколу 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 - пороговое количество сообщений за раунд для включения защиты