Триггеры в плейбуках
В SMP в плейбуках для описания триггеров, правил сегментации и агрегации, а также для фильтров в действиях плейбуков используется язык jq. В этой статье приведены выражения на языке jq, которые будут полезны при создании триггеров плейбуков.
Для тренировки в написании выражений на jq можно воспользоваться специальными платформами, например такой: https://www.devtoolsdaily.com/jq_playground/. Также, по опыту, LLM помощники хороши справляются с этой задачей.
Т.к. описание триггера плейбуков отличается для Алертов и Инцидентов данная статья разделена на две соответствующие части.
Алерты
Правила корреляции
Ниже приведены примеры триггеров для алертов, по свойствам правил корреляции
1. Правило начинается с Test
[.Rules[] | .Name | startswith("Test")] | any
2. Название правила Test
[.Rules[] | .Name=="Test"] | any
3. Название правила содержит Test
[.Rules[] | .Name | contains("Test")] | any
3. Правило соответствует регулярному выражению ^R\d{3}.+ (характерно для коробочного контента)
[.Rules[]| .Name | test("R\\d{3}.+") ] | any
4. Уровень важности правила critical
[.Rules[] | .Severity == "critical"] | any
Техники и тактики
Ниже приведены примеры триггеров для алертов, по техникам и тактиками матрицы MITRE ATT&CK
1. Тактика TA0003
[.MITRETactics[] | .ID == " TA0003"] | any
2. Техника T1098
[.MITRETechniques[] | .ID == " T1098"] | any
Активы
В разделе приведены примеры триггеров для активов, связанных с алертами. Т.к. в SMP активы объединяют в себе устройства и пользователей, раздел разделен на две соответствующие части.
Устройства
1. Имя устройства TEST-PC
[.Assets[] | select(.Type == "host") | .Name=="TEST-PC"] | any
2. ID устройства 00000000-0000-0000-0000-000000000000
[.Assets[] | select(.Type == "host") | .ID=="00000000-0000-0000-0000-000000000000"] | any
3. По категории критичности актива
3.1 Актив относится к КИИ
[.Assets[] | select(.Type == "host") | .CIICategory == "CII"] | any
3.2 Актив не относится к КИИ
[.Assets[] | select(.Type == "host") | .CIICategory == "notCII"] | any
Пользователи
1. Имя учетной записи test
[.Assets[] | select(.Type == "user") | .Name=="test"] | any
2. ID учетной записи (внутренний ID в платформе) 00000000-0000-0000-0000-000000000000
[.Assets[] | select(.Type == "user") | .ID=="00000000-0000-0000-0000-000000000000"] | any
Наблюдаемые объекты
В разделе приведены примеры триггеров для наблюдаемых объектов, связанных с алертами.
Наблюдаемые объекты - это индикаторы, в т.ч. хэши, ip-адреса, url, домены, имена пользователей и т.п., которые автоматически извлекаются из базовых и корреляционных событий по внутренней логике SMP и добавляются в карточку алерта/ицидента в соответствующий раздел.
1. Домен DEMO.LAB
[.Observables[] | select(.Type == "domain") | .Value=="DEMO.LAB"] | any
2. URL https://abc.demo.lab
[.Observables[] | select(.Type == "url") | .Value=="https://abc.demo.lab"] | any
3. Хэш
3.1 MD5 хэш 00000000000000000000000000000000
[.Observables[] | select(.Type == "md5") | .Value=="00000000000000000000000000000000"] | any
3.2 SHA256 хэш 0000000000000000000000000000000000000000000000000000000000000000
[.Observables[] | select(.Type == "sha256") | .Value=="0000000000000000000000000000000000000000000000000000000000000000"] | any
4. IP-адрес
4.1 IP-адрес равен 192.168.100.100
[.Observables[] | select(.Type == "ip") | .Value=="192.168.100.100"] | any
4.2 IP-адрес находится в подсети 192.168.100.0/24 (грубый пример)
[.Observables[] | select(.Type == "ip") | .Value | (test("^192\\.168\\.100\\.")] | any
В jq нет встроенной функции проверки адреса в подсети, поэтому предлагается использовать обходные пути через регулярные выражения или contains.
5. Имя пользователя Alice
[.Observables[] | select(.Type == "userName") | .Value=="Alice"] | any
6. Устройство
6.1 Имя устройства abc.demo.lab
[.Observables[] | select(.Type == "hostName") | .Value=="abc.demo.lab"] | any
6.1 Домен устройства demo.lab (грубый пример)
[.Observables[] | select(.Type == "hostName") | .Value | endswith(".demo.lab")] | any
События
Помимо прочего, в триггерах можно обращаться к базовым и корреляционным событиям и извлекать для проверки их них любую информацию. В виду большого числа вариантов ниже будет приведено лишь несколько примеров такого использования.
1. По SID пользователя из базового события в поле SourceUserID равный S-1-5-18
[.OriginalEvents[] | .BaseEvents[] | .SourceUserID == "S-1-5-18"] | any
2. По домену из базового события в поле SourceNtDomain равный DEMO.LAB
[.OriginalEvents[] | .BaseEvents[] .SourceNtDomain=="DEMO.LAB" ] | any