Перейти к основному содержимому
Версия: 4.5.X

Директивы

Директивы позволяют выявлять инциденты информационной безопасности по срабатыванию фильтров и выполнению различных условий, определенных в директиве корреляции.

Директива корреляции – логическая совокупность правил, построенных по иерархическому принципу, в соответствии с которыми осуществляется сравнение параметров событий информационной безопасности, а также их количества и частоты с заданными показателями для выявления инцидентов информационной безопасности. Формирование директив производится следующим образом:

  1. Нажмите на кнопку Добавить и введите название директивы
  2. Сформируйте директиву корреляции с помощью Конструктора директив
  3. Перейдите на вкладку «Дополнительные настройки»
  4. Задайте уровень важности инцидента (критичности): несущественная, низкая, средняя, высокая
  5. Задайте ответственного
  6. Заполните рекомендации по реагированию на инцидент
  7. Сохраните директиву корреляции

Дополнительно каждой отдельной директиве можно задать:

  1. Запуск скрипта реакции на инцидент при его появлении

  2. Категорию ГосСОПКА

  3. Отправку инцидентов в ГосСОПКА

  4. Агрегирование однотипных инцидентов

  5. Создание в случае срабатывания директивы:

    • только инцидента
    • только события информационной безопасности
    • инцидента и события информационной безопасности одновременно
  6. Не создавать инцидент при провале корреляции

Конструктор директив

Расположение: Инциденты ⇒ Директивы ⇒ Добавить (или выбрать существующую директиву) ⇒ Конструктор директивы

1

Конструктор директив необходим для обнаружения инцидентов информационной безопасности. С помощью блоков составляется логическая цепочка для выявления инцидентов информационной безопасности.

примечание

В настройках директивы есть возможность включать и отключать создание инцидента в случае провала корреляции. Провал корреляции случается, когда невозможно извлечь одно из полей, указанных в настройках директивы.

1

Типы блоков

Доступные типы блоков в конструкторе директив:

  • Событие – блок конструктора директив на проверку приходящих событий на соответствие заранее созданным фильтрам. Данный тип блока может иметь привязку к времени до и после события, может дополнительно содержать выражение и переменные, также в нем доступна функция "Ветвление".
  • Отсутствие события – блок обратный блоку Событие. Данный блок сработает в случае, если событие, соответствующее указанным параметрам в данном блоке, не поступило.
  • Утверждение – блок на простое утверждение. Содержит булево выражение. Если результат вычисления выражения — истина, то выполнение правила корреляции продолжается, иначе — прерывается, инцидент не будет зарегистрирован.
  • Задержка – интервал времени, которое коррелятор проигнорирует. Отсчет выполняется от времени предыдущего найденного события.

Фильтр

Для каждого блока директивы типов «Событие» и «Отсутствие события» обязательным является выбор фильтра.

Выражение

В данном поле можно указать булево выражение. Помимо этого, можно работать с нормализованными полями и возвращаемыми параметрами событий (через ключевое слово ep) как, например, IP-адрес, который можно сравнивать по строке, узнать вхождение его в подстроку или использовать регулярные выражения. Также можно использовать в выражении переменные предыдущих блоков через ключевое слово vars. Пример сравнения IP-адресов двух подряд событий блокировки соединения межсетевым экраном представлен на скриншоте ниже (подробнее о работе данной директиве можно узнать в примере).

2

Для проверки того или иного выражения можно воспользоваться утилитой komrad-cli. Для этого необходимо ввести команду в терминале:

komrad-cli toolbox cel-go

Пример:

cel-repl> %let x = 1
cel-repl> x == 1
true : bool
cel-repl> (x == 1) && (x > 0)
true : bool

Также, выражение в блоке Событие может содержать правило агрегации о ключам. Подробнее о агрегации по ключам можно прочитать здесь

Переменные и логические условия

В переменные можно добавлять нормализованные поля и возвращаемые параметры события, используемые в корреляции, или добавлять свои значения.

Примеры:

С использованием логического "ИЛИ"

event["ECS.Source.IP"] == "8.8.8.10" || event["ECS.Event.Severity"] == 4

Создастся инцидент, при получении события:

Jan 08 2021 00:16:11 UTC+03 fw.network.lan CEF:0|npo-echelon.ru|echelon|1.1.1111|021|lock connection|5|src=8.8.8.10 spt=46117 dst=8.8.8.1 dpt=75 act=block

С использованием логического "И"

event["ECS.Source.IP"] == "8.8.8.10" && event["ECS.Event.Severity"] == 5

Создастся инцидент, при получении события:

Jan 08 2021 00:16:11 UTC+03 fw.network.lan CEF:0|npo-echelon.ru|echelon|1.1.1111|021|lock connection|5|src=8.8.8.10 spt=46117 dst=8.8.8.1 dpt=75 act=block

С использованием логического "не равно"

event["ECS.Source.IP"] != "8.8.8.1" && event["CEF.DeviceProduct"] == "echelon"

Создастся инцидент, при получении события

Jan 08 2021 00:16:11 UTC+03 fw.network.lan CEF:0|npo-echelon.ru|echelon|1.1.1111|021|block connection|5|src=8.8.8.10 spt=46117 dst=8.8.8.1 dpt=75 act=block

В самой директиве есть возможность извлечь значение поля и использовать его в выражении.

Пример:

3

Ветвление

Ветвление событий по одному блоку лучше всего понять на следующем примере: допустим, что у нас есть три фильтра

4

filter1

5

filter2

6

filter3

Создаем директиву, используя созданные нами фильтры

7

Directive (Filters 1 and 2 and 3)

В качестве входных данных (событий ИБ) используется следующая последовательность: «один», «два» (первое такое событие), «два» (второе такое событие), «три» (первое такое событие), «три» (второе такое событие). Рассмотрим 4 случая работы данной директивы, используя разные комбинации ветвлений.

Параметр1 случай2 случай3 случай4 случай
Ветвление 2 блока--++
Ветвление 3 блока-+-+
Количество инцидентов1111
История инцидента1 история: Filter 3 – три(первое событие) Filter 2 – два (первое событие) Filter 1 – один1 история: Filter 3 – три (первое событие) Filter 2 – два (первое событие) Filter 1 – один 2 история: Filter 3 – три (второе событие) Filter 2 – два (первое событие) Filter 1 – один1 история: Filter 3 – три (первое событие) Filter 2 – два (первое событие) Filter 1 – один 2 история: Filter 3 – три (первое событие) Filter 2 – два (второе событие) Filter 1 – один1 история: Filter 3 – три (первое событие) Filter 2 – два (первое событие) Filter 1 – один 2 история: Filter 3 – три (второе событие) Filter 2 – два (первое событие) Filter 1 – один 3 история: Filter 3 – три (первое событие) Filter 2 – два (второе событие) Filter 1 – один 4 история: Filter 3 – три (второе событие) Filter 2 – два (второе событие) Filter 1 – один

Визуально результаты можно представить так

8

Время после/до предыдущего блока

Время после предыдущего блока – время ожидания события после предыдущего найденного события в часах, минутах, секундах.

Время до предыдущего блока – время ожидания события в прошлом относительно предыдущего найденного события в часах, минутах, секундах

подсказка

Время до или после блока ориентируется на значение поля (GenerationTime)

CEL-Go

Для построения сложной логики в полях директивы можно использовать скриптовый язык Google CEL-Go

Директивы в формате YAML

Расположение: Инциденты ⇒ Директива ⇒ Добавить (или выбрать существующую директиву) ⇒ Код

Типы элементов

Правило корреляции представляет собой дерево, каждый элемент которого имеет структуру с одним набором полей.

В этой структуре семантику полей определяет поле Type, оно всегда является обязательным. Остальные поля могут быть задействованы, могут игнорироваться, все зависит от типа элемента, т.е. этого Type.

Виды Type:

  1. Filter – утверждение на присутствие фильтрованных данных по указанному фильтру. Иначе, поиск присутствия события.
  2. NoFilter – обратное типу Filter — утверждается отсутствие события по указанному фильтру.
  3. Assert – простое утверждение. Содержит булево выражение. Если результат вычисления выражения — истина, то выполнение правила корреляции продолжается, иначе — прерывается, инцидента не будет.
  4. Delay – задержка. Интервал времени, который коррелятор проигнорирует. Отсчет выполняется от времени предыдущего найденного события.
  5. Sequence – список элементов, который интерпретируется последовательно. Выполнение директивы продолжится, если будут выполнены все элементы. Операция «Последовательное И».
  6. OneOf – список элементов. Выполнение директивы продолжится, если будет выполнен хотя бы один из элементов. Операция «ИЛИ».

Поля общего назначения

ID – идентификатор элемента. Полезен для информирования об ошибках: ошибки и замечания содержат идентификатор элемента, к которому они относятся. В корреляции значение этого поля не играет никакой роли.

ParentID – идентификатор родительского элемента. Нужен только для корректной работы визуального конструктора. В корреляции значение этого поля не играет никакой роли.

Type – упомянутый ранее тип элемента.

Поля, зависящие от типа элемента

  • Variables – экспорт значений в переменные
  • NegativeWait – ожидание в прошлом относительно предыдущего найденного события в секундах (минутах, если NegativeWaitMinutes, и часах, если NegativeWaitHours)
  • PositiveWait – ожидание после предыдущего найденного события в секундах (минутах, если PositiveWaitMinutes, и часах, если PositiveWaitHours)
  • Filter – название фильтра
  • Expression – условие (where), булево выражение
  • Forking – включено ли ветвление
  • Children – список дочерних элементов

Удаление директив

Директивы можно удалять, предварительно выбрав их и нажав на значок с корзиной Удалить. Однако полностью из системы они удалены не будут. Это сделано для того, чтобы была возможность видеть срабатывания по удалённым директивам в списке старых инцидентов. Имя удалённой директивы будет отображаться серым цветом.

Alt text

При переходе в карточку инцидента в скобках будет указано, что директива удалена.

Alt text

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

Alt text

Для улучшения последующей обработки инцидентов следует указать дополнительные настройки для созданной директивы. В качестве таких настроек выступают:

  1. Важность: несущественная, низкая, средняя и высокая
  2. Ответственный – указать ответственного за расследование инцидента
  3. Рекомендации
  4. Категория ГосСОПКА
  5. Отправлять инциденты в ГосСОПКА
  6. Включить автоматический запуск реакции на инцидент
  7. Агрегировать инциденты
  8. Создавать инцидент
  9. Создавать событие информационной безопасности
  10. Не создавать инцидент при провале корреляции

Автоматическое реагирование на инциденты

Действия:

  1. Нажмите на директиву корреляции, к которой следует применить автоматический запуск реакции на инцидент
  2. Зайдите в «Дополнительные настройки»
  3. Отметьте функцию Включить автоматический запуск реакции на инцидент внизу страницы
  4. Выберите файл скрипта из выпадающего списка (будут указаны скрипты, находящиеся в директории скриптов)
  5. Нажмите на кнопку Сохранить

Агрегирование инцидентов

Данная функция позволяет агрегировать, т.е. собирать несколько однотипных инцидентов в один по заданным параметрам.

Параметры для агрегации инцидентов:

  1. Минимальное количество событий инцидентов в агрегированном - данное число однотипных инцидентов должно сформироваться для того, чтобы подвергнуть их агрегации и перевести в истории одного инцидента
  2. Временное окно – в течение данного времени будет работать «окно» агрегации, т.е. подсчет однотипных инцидентов, которые могут быть собраны в историю формирования одного уже агрегированного инцидента

Действия:

  1. Нажмите на директиву корреляции, к которой следует применить агрегацию инцидентов
  2. Зайдите в «Дополнительные настройки»
  3. Отметьте функцию Агрегировать инциденты внизу страницы
  4. Установите параметры агрегирования инцидентов
  5. Нажмите на кнопку Сохранить

В версии 4.5 механизмы агрегации инцидентов изменились. Подробнее о нововведениях можно прочитать здесь.

Создание инцидента

Действия:

  1. Нажать на директиву корреляции, у которой следует включить функцию создания инцидента
  2. Зайти в «Дополнительные настройки»
  3. Отметить функцию Создавать инцидент внизу страницы
  4. Нажать на кнопку Сохранить.

Создание события информационной безопасности из инцидента

Действия:

  1. Нажать на директиву корреляции, для которой требуется создание события ИБ в случае её срабатывания
  2. Зайти в «Дополнительные настройки»
  3. Отметить функцию Создавать событие информационной безопасности внизу страницы
  4. Нажать на кнопку Сохранить

Матрица атак

Нажмите кнопку Добавить, после чего появятся 5 граф для заполнения, с помощью которых можно классифицировать атаки: матрица атаки, версия матрицы атак, техника атаки, подтехника атаки и тактика атаки. В указанных выше полях можно классифицировать поступающие угрозы, например, с помощью базы Mitre Att&ck, либо банка угроз безопасности информации ФСТЭК России. После чего необходимо нажать кнопку Добавить, далее Сохранить.

В случае необходимости, эту информацию можно удалить — выбрать ненужные данные и нажать на значок удаления.

Alt text

Примеры директив корреляции

Инфраструктура: веб-сервер доступен из интернета и защищен межсетевым экраном. Нам необходимо выявлять попытки сканирования портов и факты запросов к веб-серверу с административными правами, которые сами по себе не являются инцидентами. В случае если сканирование портов и успешная авторизация были осуществлены с одного IP-адреса, должен создаваться инцидент.

Интересующие нас события:

  • блокировка соединения межсетевым экраном:
May 20 2022 00:16:11 UTC+03 fw.network.lan CEF:0|npo-echelon.ru|echelon|1.1.1111|021|block connection|5|src=8.8.8.10 spt=46117 dst=8.8.8.1 dpt=75 act=block
  • запрос к веб-серверу с учетной записью admin:
May 20 2021 00:16:30 UTC+03 http.network.lan CEF:0|npo-echelon.ru|echelon|1.1.1111|011|http request to web-server|5|src=8.8.8.10 spt=56117 dst=8.8.8.1 dpt=80 act=block duser=admin request=manager/html

Фильтр для выявления блокировки соединения, возвращающий IP-адрес источника соединения (идентификатор фильтра: 10001):

 local strings = require("strings")

function filter(event)
local ok_1 = true
-- and
do
ok_1 = ok_1 and event:hasString("CEF.DeviceEventClassID", "021") and event:hasString("ECS.Event.Action", "block")
end
if ok_1 then return {eventSrcIP=event:get('ECS.Source.IP')} end
end

Фильтр для выявления запросов к веб-серверу с учетной записью администратора (идентификатор фильтра: 10002):

local strings = require("strings")

function filter(event)
local ok_1 = true
-- and
do
ok_1 = ok_1 and event:hasString("CEF.DeviceEventClassID", "011") and event:hasString("ECS.Destination.UserName", "admin")
end
if ok_1 then return {eventSrcIP=event:get('ECS.Source.IP')} end
end

Пример директивы корреляции №1

Директива корреляции, которая будет срабатывать в случае прихода событий, удовлетворяющих любому из составленных выше фильтров, в Конструкторе директив приведена на рисунке

Alt text

Пример директивы корреляции №2

Директива корреляции, которая будет срабатывать после трех событий блокировки соединения и в случае появления запросов под административной учетной записью с этого же IP-адреса, в Конструкторе директив приведена ниже

Alt text Alt text

После срабатывания директивы появится инцидент с историей

Alt text

Поиск по директивам

Поиск осуществляется по названию директивы и содержащимся в нем сочетаниям символов.

Агрегация по ключам

ВАЖНО!

На данный момент присутствуют следующие ограничения: можно агрегировать только по одному полю, нельзя исключать дни недели и часы, а также задавать выборку. Поддерживается только английский язык. Агрегация по ключам работает только в KOMRAD версии 4.5, в версии 4.3 данная функция работать не будет.

Правило агрегации начинается с ключевого слова group_by (с нижним подчеркиванием, без пробела), после чего в квадратных скобках перечисляются ключи агрегации (пока что только один). Опционально можно использовать функцию unnest на поле-массив, чтобы рассматривать в качестве ключей каждый элемент массива.

Например, для значений AssetIPs1 = [127.0.0.1, 10.0.4.120] и AssetIPs2 = [10.0.4.120, 198.162.0.1] при агрегации с пороговым значением два будет следующим:

group_by [AssetIPs] ... -> нет результатов (массивы не совпадают)
group_by [unnest(AssetIPs)] -> один результат по 10.0.4.120

После перечисления ключей необходимо в блоке window задать два условия срабатывания — пороговое количество событий, при котором правило срабатывает сразу (n last events), временное окно (например, 1h), максимальное количество событий (но не менее 2) по ключу в конце временного окна (threshold m). Пороговое значение и временное окно нужно разделать оператором or. Пример — создание окна, срабатывающего сразу при накоплении 5 событий по ключу, либо минимум 2 событий в конце получасового окна:

group_by [Field]
window 5 last events
or 30m threshold 2 ...
подсказка

Для задания временного окна можно использовать как сокращенные обозначения единиц времени (s/sec, m/min, h, d), так и полные (seconds, minutes, hours, days)

На UI в KOMRAD версии 4.5 включение данной функции в дополнительных настройках карточки директивы и установка максимального количества в одном агрегированном инциденте вместе с заданием временного окна будет выглядеть следующим образом:

1

Далее идет необязательный блок вывода полей для создаваемого агрегированного события.

Образуемые поля будут записаны в переменные истории как "Agg.<название поля>". По умолчанию при агрегации должны создаваться следующие поля:

  • Agg.Count — количество агрегированных событий

  • Agg.ECS.Event.Start и Agg.ECS.Event.End — начало (временная метка первого события) и конец (временная метка последнего события) агрегации

  • Agg.RelatedKeys — ключи агрегированных событий (максимум 10);

  • Agg.AssetIPs — все уникальные IP агрегированных событий.

примечание

Если какое-то из полей отсутствует в событии, то в карточке инцидента оно будет обозначаться как "—" (прочерк)

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

поле-результат = <тип вывода> поле-источник

В настоящее время поле-результат игнорируется, поэтому все такие правила вывода представляются как:

поле-источник = <тип вывода> поле-источник

В качестве типа вывода можно использовать 7 правил:

  1. Значение поля из первого события - first
  2. Значение поля из последнего события - last
  3. Различные значения поля из всех событий - distinct
  4. Среднее значение поля из всех событий (только для числовых полей, остальные игнорируются) - avg
  5. Сумма значений поля из всех событий (только для числовых полей, остальные игнорируются) - sum
  6. Минимальное значение поля (только для числовых полей, остальные игнорируются) - min
  7. Максимальное значение поля (только для числовых полей, остальные игнорируются) - max

Также дополнительно можно указать вывод для всех остальных полей, написав правило для него после квадратных скобок для конкретных выводов. Синтаксис вывода всех полей выглядит как:

derive [<конкретные правила вывода>], * from <событие - первое(first) или последнее(last)> event with/without overwrite

Здесь в качестве правила можно использовать либо вывод из первого события (from first event), либо из последнего (from last event). Также нужно указать, перезаписываются ли уже выведенные поля или нет (with overwrite для включения перезаписи, without overwrite для ее выключения).

Простые примеры

Агрегация по AssetIPs с окном в одну минуту строго для пяти событий:

group_by [AssetIPs] window 5 last events or 1m threshold 5

Агрегация по элементам AssetIPs с окном в полторы минуты для трех событий, либо с моментальным срабатыванием при шести событиях:

group_by [unnest(AssetIPs)] window 6 last events or 1m 30s threshold 3

Сложный пример

Добавим пользовательские поля First, Last, Min, Max, Sum, Avg, Distinct для агрегации и поле MyEvent в качестве ключа. Составим правило для агрегации 25 событий в трёхчасовом окне с моментальным срабатыванием при 50 событиях. Добавим вывод полей согласно названием пользовательских полей, а также вывод всех остальных полей из последнего события без перезаписи:

group_by [MyEvent] window 50 last events or 3h threshold 25
derive [
First = first agg.First,
Last = last agg.Last,
Min = min agg.Min,
Max = max agg.Max,
Sum = sum agg.Sum,
Avg = avg agg.Avg,
Distinct = distinct agg.Distinct
],
* from last event without overwrite