# Плейбуки

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

<p class="callout info">Информация, приведенная на данной странице, является разработкой команды pre-sales и/или community KUMA и **НЕ** является официальной рекомендацией вендора.</p>

<p class="callout info">Официальная документация по данному разделу приведена в Онлайн-справке на продукт: [https://support.kaspersky.com/help/XDR/1.4/ru-RU/273327.htm](https://support.kaspersky.com/help/XDR/1.4/ru-RU/273327.htm)</p>

В SMP в плейбуках для описания триггеров, правил сегментации и агрегации, а также для фильтров в действиях плейбуков используется язык jq. В этой статье приведены выражения на языке jq, которые будут полезны при создании триггеров плейбуков.

<p class="callout info">Для тренировки в написании выражений на jq можно воспользоваться специальными платформами, например такой: [https://www.devtoolsdaily.com/jq\_playground/](https://www.devtoolsdaily.com/jq_playground/). Также, по опыту, LLM помощники хороши справляются с этой задачей. </p>

Т.к. описание триггера плейбуков отличается для Алертов и Инцидентов данная статья разделена на две соответствующие части.

---

### Алерты

#### Свойства алерта

Ниже приведены примеры триггеров для алертов, по их базовым свойствам

1\. Имя алерта начинается с `Test`

```jq
 .Name | startswith("Test")
```

2\. Имя алерта `Test`

```jq
 .Name == "Test"
```

3\. Тактика `TA0003`

```
[.MITRETactics[] | .ID == " TA0003"] | any
```

4\. Техника `T1098`

```
[.MITRETechniques[] | .ID == " T1098"] | any
```

5\. Уровень важности алерта высокий (`high`). Возможные значения: `low`, `medium`, `high`, `critical`.

```
.Severity =="high"
```

6\. Статус алерта - новый (`new`). Возможные значения: `new`, `inProgress`, `inIncident`, `closed`.

```
.Status == "new"
```


#### Правила корреляции

Ниже приведены примеры триггеров для алертов, по свойствам правил корреляции

1\. Правило начинается с `Test`

```jq
[.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`). Возможные значения: `low`, `medium`, `high`, `critical`.

```
[.Rules[] | .Severity == "critical"] | any
```

5\. Алерт относится к КИИ (содержит КИИ активы)

```
.IsCII
```


#### Активы

В разделе приведены примеры триггеров для активов, связанных с алертами. Т.к. в 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
```

#### Наблюдаемые объекты

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

<p class="callout info">Наблюдаемые объекты - это индикаторы, в т.ч. хэши, ip-адреса, url, домены, имена пользователей и т.п., которые автоматически извлекаются из базовых и корреляционных событий по внутренней логике SMP и добавляются в карточку алерта/ицидента в соответствующий раздел.</p>

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
```

<p class="callout info">В jq нет встроенной функции проверки адреса в подсети, поэтому предлагается использовать обходные пути через регулярные выражения или contains.</p>

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
```

---

### Инциденты

#### Свойства инцидента

Ниже приведены примеры триггеров для инцидентов, по их базовым свойствам

1\. Имя инцидента начинается с `Test`

```jq
 .Name | startswith("Test")
```

2\. Имя инцидента `Test`

```jq
 .Name == "Test"
```

3\. Тактика `TA0003`

```
[ .Alerts[] | .MITRETactics[] | .ID == " TA0003"] | any
```

4\. Техника `T1098`

```
[ .Alerts[] | .MITRETechniques[] | .ID == " T1098" ] | any
```

5\. Уровень важности инцидента высокий (`high`). Возможные значения: `low`, `medium`, `high`, `critical`.

```
.Severity =="high"
```

6\. Уровень приоритета инцидента высокий (`high`). Возможные значения: `low`, `medium`, `high`, `critical`.

```
.Priority =="high"
```

7\. Статус инциденнта - открыт (`open`). Возможные значения: `open`, `inProgress`, `hold`, `closed`.

```
.Status == "open"
```


8\. Имя рабочего процесса инцидента `standard`.

```
.WorkflowName == "standard"
```

9\. Инцидент относится к КИИ (содержит КИИ активы)

```
.IsCII
```

#### Правила корреляции

Ниже приведены примеры триггеров для инцидентов, по свойствам правил корреляции

1\. Правило начинается с `Test`

```jq
[ .Alerts[] | .Rules[] | .Name | startswith("Test")] | any
```

2\. Название правила `Test`

```
[ .Alerts[] | .Rules[] | .Name=="Test"] | any
```

3\. Название правила содержит `Test`

```
[ .Alerts[] | .Rules[] | .Name | contains("Test")] | any
```

3\. Правило соответствует регулярному выражению `^R\d{3}.+` (характерно для коробочного контента)

```
[ .Alerts[] | .Rules[]| .Name | test("R\\d{3}.+") ] | any
```

4\. Уровень важности правила - критический (`critical`). Возможные значения: `low`, `medium`, `high`, `critical`.

```
[ .Alerts[] | .Rules[] | .Severity == "critical"] | any
```

#### Активы

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

##### Устройства

1\. Имя устройства `TEST-PC`

```
[ .Alerts[] | .Assets[] | select(.Type == "host") | .Name=="TEST-PC"] | any
```

2\. ID устройства `00000000-0000-0000-0000-000000000000`

```
[ .Alerts[] | .Assets[] | select(.Type == "host") | .ID=="00000000-0000-0000-0000-000000000000"] | any
```

3\. По категории критичности актива

3.1 Актив относится к КИИ

```
[ .Alerts[] | .Assets[] | select(.Type == "host") | .CIICategory == "CII"] | any
```

3.2 Актив не относится к КИИ

```
[ .Alerts[] | .Assets[] | select(.Type == "host") | .CIICategory == "notCII"] | any
```

##### Пользователи

1\. Имя учетной записи `test`

```
[ .Alerts[] | .Assets[] | select(.Type == "user") | .Name=="test"] | any
```

2\. ID учетной записи (внутренний ID в платформе) `00000000-0000-0000-0000-000000000000`

```
[ .Alerts[] | .Assets[] | select(.Type == "user") | .ID=="00000000-0000-0000-0000-000000000000"] | any
```

#### Наблюдаемые объекты

В разделе приведены примеры триггеров для наблюдаемых объектов, связанных с инцидентами.

<p class="callout info">Наблюдаемые объекты - это индикаторы, в т.ч. хэши, ip-адреса, url, домены, имена пользователей и т.п., которые автоматически извлекаются из базовых и корреляционных событий по внутренней логике SMP и добавляются в карточку алерта/ицидента в соответствующий раздел.</p>

1\. Домен `DEMO.LAB`

```
[ .Alerts[] | .Observables[] | select(.Type == "domain") | .Value=="DEMO.LAB"] | any
```

2\. URL `https://abc.demo.lab`

```
[ .Alerts[] | .Observables[] | select(.Type == "url") | .Value=="https://abc.demo.lab"] | any
```

3\. Хэш

3.1 MD5 хэш `00000000000000000000000000000000`

```
[ .Alerts[] | .Observables[] | select(.Type == "md5") | .Value=="00000000000000000000000000000000"] | any
```

3.2 SHA256 хэш `0000000000000000000000000000000000000000000000000000000000000000`

```
[ .Alerts[] | .Observables[] | select(.Type == "sha256") | .Value=="0000000000000000000000000000000000000000000000000000000000000000"] | any
```

4\. IP-адрес

4.1 IP-адрес равен `192.168.100.100`

```
[ .Alerts[] | .Observables[] | select(.Type == "ip") | .Value=="192.168.100.100"] | any
```

4.2 IP-адрес находится в подсети `192.168.100.0/24` (грубый пример)

```
[ .Alerts[] | .Observables[] | select(.Type == "ip") | .Value | test("^192\\.168\\.100\\.")] | any
```

<p class="callout info">В jq нет встроенной функции проверки адреса в подсети, поэтому предлагается использовать обходные пути через регулярные выражения или contains.</p>

5\. Имя пользователя `Alice`

```
[ .Alerts[] | .Observables[] | select(.Type == "userName") | .Value=="Alice"] | any
```

6\. Устройство

6.1 Имя устройства `abc.demo.lab`

```
[ .Alerts[] | .Observables[] | select(.Type == "hostName") | .Value=="abc.demo.lab"] | any
```

6.1 Домен устройства `demo.lab` (грубый пример)

```
[ .Alerts[] | .Observables[] | select(.Type == "hostName") | .Value | endswith(".demo.lab")] | any
```

#### События

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

1\. По SID пользователя из базового события в поле `SourceUserID` равный `S-1-5-18`

```
[ .Alerts[] | .OriginalEvents[] | .BaseEvents[] | .SourceUserID == "S-1-5-18"] | any
```

2\. По домену из базового события в поле `SourceNtDomain` равный `DEMO.LAB`

```
[ .Alerts[] | .OriginalEvents[] | .BaseEvents[] .SourceNtDomain=="DEMO.LAB" ] | any
```

---

### Объединение условий

Приведенные выше условия можно объединять между собой используя различные логические операторы, такие как or, and, not.

Например, выражение для "Имя инцидента начинается с `Test`, статус инцидента - открыт (`open`) и инцидент не относится к КИИ

```
( .Name | startswith("Test")) and (.Status == "open") and (.IsCII | not)
```

В примерах с массивами выше часто встречается условие с `any`, которое означает "совпадение как минимум одного объекта", если для условия требуется совпадение всех объектов, то условие следует заменить на `all`.

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

```
[ .Alerts[] | .Rules[] | .Severity == "critical"] | all
```

Также для сравнения не с одним, но с массивом значений можно использовать оператор `IN`.

Например, триггер по нескольким именам хостов

```
[ .Alerts[] | .Assets[] | select(.Type == "host") | .Name | IN("TEST-PC1", "TEST-PC2", "ADMIN-PC")] | any
```

---

### Заключение

Данная статья содержит базовый набор выражений, которые пригодятся при описании триггеров плейбуков. Если у вас есть замечания или предложения по содержимому статьи, а также собственные идеи для выражений - пишите в наш телеграм-канал (ссылка и инструкция на главной странице).

---

### Полезные ссылки

Модель данных алерта - [https://support.kaspersky.com/help/XDR/1.4/ru-RU/269125.htm](https://support.kaspersky.com/help/XDR/1.4/ru-RU/269125.htm)

Модель данных инцидента - [https://support.kaspersky.com/help/XDR/1.4/ru-RU/269168.htm](https://support.kaspersky.com/help/XDR/1.4/ru-RU/269168.htm)

# Действия в плейбуках

<p class="callout info">Информация, приведенная на данной странице, является разработкой команды pre-sales и/или community KUMA и **НЕ** является официальной рекомендацией вендора.</p>

<p class="callout info">Официальная документация по данному разделу приведена в Онлайн-справке на продукт: [https://support.kaspersky.com/help/XDR/1.4/ru-RU/270357.htm](https://support.kaspersky.com/help/XDR/1.4/ru-RU/270357.htm) </p>

В SMP в плейбуках для описания триггеров, правил сегментации и агрегации, а также для фильтров в действиях плейбуков используется язык jq. В этой статье приведены выражения на языке jq, которые будут полезны при создании действий плейбуков.

<p class="callout info">Для тренировки в написании выражений на jq можно воспользоваться специальными платформами, например такой: [https://www.devtoolsdaily.com/jq\_playground/](https://www.devtoolsdaily.com/jq_playground/). Также, по опыту, LLM помощники хороши справляются с этой задачей. </p>

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

Также от объекта над которым выполняются действия - Алерт, Инцидент, Выбранные объекты - зависит jq-запрос. Поэтому запросы ниже разделены на три соответствующие группы.

---

### Алерты

В разделе приведены примеры фильтров для раличных типов действий, выполняемых над Алертом.

#### Активы

Ниже приведены примеры jq-выражений для извлечения активов. Выражение в общем смысле должно возвращать массив ID активов.

##### Устройства

1\. Имя устройства `TEST`

```
[ alert.Assets[] | select(.Name == "TEST") | .ID]
```

2\. Тип актива - устройство (host)

```
[ alert.Assets[] | select(.Type == "host") | .ID]
```

3\. Тип актива - устройство (host) и имеет признаки атакующего (IsAttacker)

```
[ alert.Assets[] | select(.Type == "host" and .IsAttacker) | .ID]
```

Тип актива - устройство (host) и имеет признаки жертвы (IsVictim)

```
[ alert.Assets[] | select(.Type == "host" and .IsVictim) | .ID]
```

<p class="callout info">Признак "атакующего" и признак "жертвы" настраиваются в правиле корреляции путем обогащения поля AttackerHostID и VictimHostID соответственно. В данные поля могут быть записаны значения из Device/Source/DestinationAssetID.</p>

##### Пользователи

Имя пользователя `Alice`

```
[ alert.Assets[] | select(.Name == "Alice") | .ID]
```

Тип актива - пользователь (user)

```
[ alert.Assets[] | select(.Type == "user") | .ID]
```

Тип актива - пользователь (user) и имеет признаки атакующего (IsAttacker)

```
[ alert.Assets[] | select(.Type == "user" and .IsAttacker) | .ID]
```

Тип актива - пользователь и имеет признаки жертвы (IsVictim)

```
[ alert.Assets[] | select(.Type == "user" and .IsVictim) | .ID]
```

<p class="callout info">Признак "атакующего" и признак "жертвы" настраиваются в правиле корреляции путем обогащения поля AttackerUserID и VictimUserID соответственно. В данные поля могут быть записаны значения из Source/DestinationAccountID.</p>

#### Наблюдаемые объекты

Ниже приведены примеры jq-выражений для извлечения наблюдаемых объектов. Выражение в общем смысле должно возвращать массив значений наблюдаемых объектов.

1\. Хэши

1.1 MD5

```
[ alert.Observables[] | select(.Type == "md5") | .Value ]
```

1.2 SHA256

```
[ alert.Observables[] | select(.Type == "sha256") | .Value ]
```

2\. IP-адреса

```
[ alert.Observables[] | select(.Type == "ip") | .Value ]
```

3\. URL

```
[ alert.Observables[] | select(.Type == "url") | .Value ]
```

4\. Все объекты (например, для действия по обогащению)

```
[ alert.Observables[] | .Value ]
```

#### Информация из событий

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

```
[ alert.OriginalEvents[] | .BaseEvents[] | select(.DeviceEventClassID == "4688") | .DestinationProcessName ]
```

---

### Инциденты

В разделе приведены примеры фильтров для раличных типов действий, выполняемых над Инцидентом.

#### Активы

Ниже приведены примеры jq-выражений для извлечения активов. Выражение в общем смысле должно возвращать массив ID активов.

##### Устройства

1\. Имя устройства `TEST`

```
[ incident.Alerts[] | .Assets[] | select(.Name == "TEST") | .ID]
```

2\. Тип актива - устройство (host)

```
[ incident.Alerts[] | .Assets[] | select(.Type == "host") | .ID]
```

3\. Тип актива - устройство (host) и имеет признаки атакующего (IsAttacker)

```
[ incident.Alerts[] | .Assets[] | select(.Type == "host" and .IsAttacker) | .ID]
```

Тип актива - устройство (host) и имеет признаки жертвы (IsVictim)

```
[ incident.Alerts[] | .Assets[] | select(.Type == "host" and .IsVictim) | .ID]
```

<p class="callout info">Признак "атакующего" и признак "жертвы" настраиваются в правиле корреляции путем обогащения поля AttackerHostID и VictimHostID соответственно. В данные поля могут быть записаны значения из Device/Source/DestinationAssetID.</p>

##### Пользователи

Имя пользователя `Alice`

```
[ incident.Alerts[] | .Assets[] | select(.Name == "Alice") | .ID]
```

Тип актива - пользователь (user)

```
[ incident.Alerts[] | .Assets[] | select(.Type == "user") | .ID]
```

Тип актива - пользователь (user) и имеет признаки атакующего (IsAttacker)

```
[ incident.Alerts[] | .Assets[] | select(.Type == "user" and .IsAttacker) | .ID]
```

Тип актива - пользователь и имеет признаки жертвы (IsVictim)

```
[ incident.Alerts[] | .Assets[] | select(.Type == "user" and .IsVictim) | .ID]
```

<p class="callout info">Признак "атакующего" и признак "жертвы" настраиваются в правиле корреляции путем обогащения поля AttackerUserID и VictimUserID соответственно. В данные поля могут быть записаны значения из Source/DestinationAccountID.</p>

#### Наблюдаемые объекты

Ниже приведены примеры jq-выражений для извлечения наблюдаемых объектов. Выражение в общем смысле должно возвращать массив значений наблюдаемых объектов.

1\. Хэши

1.1 MD5

```
[ incident.Alerts[] | .Observables[] | select(.Type == "md5") | .Value ]
```

1.2 SHA256

```
[ incident.Alerts[] | .Observables[] | select(.Type == "sha256") | .Value ]
```

2\. IP-адреса

```
[ incident.Alerts[] | .Observables[] | select(.Type == "ip") | .Value ]
```

3\. URL

```
[ incident.Alerts[] | .Observables[] | select(.Type == "url") | .Value ]
```

4\. Все объекты (например, для действия по обогащению)

```
[ incident.Alerts[] | .Observables[] | .Value ]
```


#### Информация из событий

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

```
[ incident.Alerts[] | .OriginalEvents[] | .BaseEvents[] | select(.DeviceEventClassID == "4688") | .DestinationProcessName ]
```

---

### Выбранные объекты

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

<details id="bkmrk-%D0%92%D1%8B%D0%B1%D0%BE%D1%80-%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BE%D0%B2-%D0%B4%D0%BB%D1%8F-%D0%B7"><summary>Выбор объектов для запуска плейбуков</summary>

Выбор объектов для запуска доступен при ручном запуске плейбука. Для этого надо поставить галочку у соответствующей настройки перед запуском плейбука.

[![image.png](https://kb.kuma-community.ru/uploads/images/gallery/2025-12/scaled-1680-/Kr3image.png)](https://kb.kuma-community.ru/uploads/images/gallery/2025-12/Kr3image.png)

</details>Т.к. объекты перед запуском выбирают вручную, то тонкая дополнительная фильтрация лишена смысла. Ниже будут приведены примеры для для указания активов и наблюдаемых объектов, разделенных только по их типам.

#### Активы

Ниже приведены примеры jq-выражений для извлечения активов. Выражение в общем смысле должно возвращать массив ID активов.

##### Устройства

```
[ .input.assets[] | select(.Type=="host") | .ID ]
```

##### Пользователи

```
[ .input.assets[] | select(.Type=="user") | .ID ]
```

#### Наблюдаемые объекты

Ниже приведены примеры jq-выражений для извлечения наблюдаемых объектов. Выражение в общем смысле должно возвращать массив значений наблюдаемых объектов.

1\. Хэши

1.1 MD5

```
[ .input.observables[] | select(.Type == "md5") | .Value ]
```

1.2 SHA256

```
[ .input.observables[] | select(.Type == "sha256") | .Value ]
```

2\. IP-адреса

```
[ .input.observables[] | select(.Type == "ip") | .Value ]
```

3\. URL

```
[ .input.observables[] | select(.Type == "url") | .Value ]
```

---

### Заключение

Данная статья содержит базовый набор выражений, которые пригодятся при описании действий плейбуков. Если у вас есть замечания или предложения по содержимому статьи, а также собственные идеи для выражений - пишите в наш телеграм-канал (ссылка и инструкция на главной странице).

---

### Полезные ссылки

Модель данных алерта - [https://support.kaspersky.com/help/XDR/1.4/ru-RU/269125.htm](https://support.kaspersky.com/help/XDR/1.4/ru-RU/269125.htm)

Модель данных инцидента - [https://support.kaspersky.com/help/XDR/1.4/ru-RU/269168.htm](https://support.kaspersky.com/help/XDR/1.4/ru-RU/269168.htm)