Skip to main content

Триггеры в плейбуках

В 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

Инциденты