Создание правила
Запрос
| Тип | Метод |
|---|---|
POST |
/logmule_go_rules/create |
Описание: При выполнении запроса будет создано правило корреляции с заданными параметрами.
Позволяет также управлять связями многие ко многим с другими моделями через поле _relations.
Ключами в поле _relations могут быть названия полей моделей, ссылающиеся на другие. Например, если у модели связь с моделью правил корреляции и в нем хранится объект связанного правила, то это поле можно использовать при управлении данной связью.
Управление работает следующим образом:
- Если поля в объекте
_relationsотсутствуют, то зависимости не обновляются. - Если поле зависимости указано и в значении не пустой список идентификаторов, то связи модели приводятся к описанному состоянию.
- Если поле зависимости указано и в значении пустой список, то все связи удаляются.
- Зависимости игнорируются в теле запроса.
- Зависимости в ответе всегда
null.
Например, следующий запрос:
{
"name": "Test",
...
"_relations": {
"filters": [] // - очистит все связи с фильтрами
// "filters": ["uuid1", "uuid2"] // - создаст связь с 2 фильтрами
// "filters": ["uuid1"] // - оставит связь только с первым фильтром
}
}
Пример запроса
POST
http://127.0.0.1/cruddy/v2/logmule_go_rules/create
Тело запроса:
| Параметр | Тип | Обязательность | Описание |
|---|---|---|---|
| id | string |
Required | Идентификатор правила |
| created_at | string time |
Required | Дата создания правила в формате: date-time |
| updated_at | string time |
Required | Дата изменения правила в формате: date-time |
| trace_id | string |
Required | Идентификатор трассировки действия пользователя для аудита |
| name | string |
Required | Название правила |
| frontend_data | object |
Optional | Данные визуального конструктора правила |
| test_data | Array<object> |
Optional | Список событий для тестирования правила (логлайны) |
| settings | Array<SettingRule> |
Required | Список настроек правила |
| active | boolean |
Required | Флаг активности правила |
| reload | boolean |
Required | Флаг перезагрузки правила после обновления |
| finding_id | string |
Required | Идентификатор инцидента |
| description | string |
Required | Описание правила |
| lua | string |
Required | Код правила в формате Lua |
| is_retro | boolean |
Required | Флаг: используется ли правило для ретроспективной корреляции |
| is_system | boolean |
Required | Флаг: системное ли правило |
| stats | object |
Optional | Статистика сработок и ошибок правила |
| stats{result_count} | integer |
Optional | Количество срабатываний правила |
| stats{error_count} | integer |
Optional | Количество ошибок правила |
| is_error | integer |
Required | Количество ошибок |
| running_at | string time |
Required | Дата и время запуска в формате date-time |
| logmule_go_filters | Array<object> |
Optional | Фильтры потока событий |
| logmule_go_modules | Array<object> |
Optional | Макросы |
| finding | object |
Optional | Тип инцидента, с которым работает правило |
| logmule_go_results | Array<object> |
Optional | Результат сработки правила корреляции |
Если поле lua не задано, ему присваивается значение по умолчанию:
local detection_windows = "10m"
local create_incident = false
local assign_to_customer = false
local risk_score = 2
local grouped_by = {}
local aggregated_by = {}
local grouped_time_field = "@timestamp"
local template = ""
function on_logline(logline)
log("accept logline")
-- meta = {}
-- incident_identifier = logline:get("event.field", "")
-- alert({
-- template = template,
-- risk_level = risk_score,
-- asset_ip = logline:get_asset_data("target.host.ip"),
-- asset_hostname = logline:get_asset_data("target.host.hostname"),
-- asset_fqdn = logline:get_asset_data("target.host.fqdn"),
-- asset_mac = logline:get_asset_data("target.host.mac"),
-- create_incident = create_incident,
-- assign_to_customer = assign_to_customer,
-- logs = {loglines},
-- meta = meta,
-- incident_identifier = incident_identifier
-- })
-- -- grouper1:feed(logline)
end
-- function on_grouped(grouped)
--
-- grouper1:clear()
-- end
-- grouper1 = grouper.new(
-- grouped_by,
-- aggregated_by,
-- grouped_time_field,
-- detection_windows,
-- on_grouped
-- )
SettingRule
| Параметр | Тип | Обязательность | Описание |
|---|---|---|---|
| function_metrics | boolean |
Optional | Флаг: собирать ли дополнительные метрики |
| is_constructor | boolean |
Optional | Флаг: создано ли правило с помощью визуального конструктора |
| max_alerts | integer |
Optional | Максимальное количество сработок |
| max_alerts_per_second | integer |
Optional | Максимальное количество сработок в секунду |
| max_rule_memory_mb | integer |
Optional | Ограничение памяти (Мб) |
Пример тела запроса
{
"id": "uuid",
"created_at": "2023-12-20T00:00:01.652259Z",
"updated_at": "2023-12-20T00:00:01.652259Z",
"trace_id": "uuid",
"name": "string",
"frontend_data": null,
"test_data": [
{}
],
"settings": {
"function_metrics": false,
"is_constructor": false,
"max_alerts": 1,
"max_alerts_per_second": 1,
"max_rule_memory_mb": 1
},
"active": true,
"reload": true,
"finding_id": "uuid",
"description": "string",
"lua": "string",
"is_retro": false,
"is_system": true,
"stats": {
"result_count": 1,
"error_count": 0
},
"is_error": 0,
"running_at": "2023-12-20T00:00:01.652259Z",
"logmule_go_filters": null,
"logmule_go_modules": null,
"finding": null,
"logmule_go_results": null
}
Успешный ответ
Статус код: 201 - успешное создание правила.
Формат: JSON.
Тело ответа:
| Параметр | Тип | Обязательность | Описание |
|---|---|---|---|
| id | string |
Required | Идентификатор правила |
| created_at | string time |
Required | Дата создания правила в формате: date-time |
| updated_at | string time |
Required | Дата изменения правила в формате: date-time |
| trace_id | string |
Required | Идентификатор трассировки действия пользователя для аудита |
| name | string |
Required | Название правила |
| frontend_data | object |
Optional | Данные визуального конструктора правила |
| test_data | Array<object> |
Optional | Список событий для тестирования правила (логлайны) |
| settings | Array<SettingRule> |
Required | Список настроек правила |
| active | boolean |
Required | Флаг активности правила |
| reload | boolean |
Required | Флаг перезагрузки правила после обновления |
| finding_id | string |
Required | Идентификатор инцидента |
| description | string |
Required | Описание правила |
| lua | string |
Required | Код правила в формате Lua |
| is_retro | boolean |
Required | Флаг: используется ли правило для ретроспективной корреляции |
| is_system | boolean |
Required | Флаг: системное ли правило |
| stats | object |
Optional | Статистика сработок и ошибок правила |
| stats{result_count} | integer |
Optional | Количество срабатываний правила |
| stats{error_count} | integer |
Optional | Количество ошибок правила |
| is_error | integer |
Required | Количество ошибок |
| running_at | string time |
Required | Дата и время запуска в формате date-time |
SettingRule
| Параметр | Тип | Обязательность | Описание |
|---|---|---|---|
| function_metrics | boolean |
Optional | Флаг: собирать ли дополнительные метрики |
| is_constructor | boolean |
Optional | Флаг: создано ли правило с помощью визуального конструктора |
| max_alerts | integer |
Optional | Максимальное количество сработок |
| max_alerts_per_second | integer |
Optional | Максимальное количество сработок в секунду |
| max_rule_memory_mb | integer |
Optional | Ограничение памяти (Мб) |
Пример ответа
{
"name": "string",
"frontend_data": {
"alert": {
"id": "uuid",
"trace_id": "uuid",
"name": "string",
"create_incident": true,
"assign_to_customer": true,
"risk_level": 5.35,
"asset_ip": "string",
"asset_hostname": "string",
"asset_fqdn": "string",
"asset_mac": "string",
"first_and_last_logs": false,
"trim_logs": 1,
"template": "string",
"mitre": ""
},
"grouper": {
"id": "uuid",
"trace_id": "uuid",
"name": "string",
"grouped_by": [
"string"
],
"aggregated_by": [
"string"
],
"grouped_time_field": "string",
"grouped_time_type": "2023-12-20T00:00:01.652259Z",
"detection_windows": 5,
"detection_windows_unit": "ms",
"aggregate_count": 1,
"aggregate_unique": true
},
"actions": [
{
"TTL": "string",
"key": {
"_default": {
"type": "value",
"value": "string"
}
},
"type": "store-set",
"store": "string",
"value": "string",
"column": "string"
}
],
"conditions": [
{
"type": "compare-condition",
"id": "uuid",
"parentId": null,
"negation": false,
"compareFn": "eq",
"expressions": [
{
"type": "logline-get",
"value": "string"
}
]
}
],
"version": 2
},
"test_data": [
{}
],
"settings": {
"function_metrics": false,
"is_constructor": false,
"max_alerts": 1,
"max_alerts_per_second": 1,
"max_rule_memory_mb": 1
},
"active": true,
"reload": true,
"finding_id": "uuid",
"description": "string",
"lua": "string",
"is_retro": false,
"is_system": true,
"stats": {
"result_count": 1,
"error_count": 0
},
"is_error": 0,
"running_at": "2023-12-20T00:00:01.652259Z"
}
Другие возможные ответы
| Код | Ответ | Описание |
|---|---|---|
400 |
Bad Request |
Неверный тип параметра запроса, либо отсутствует обязательный параметр |
409 |
name_already_used |
Попытка создать объект с существующим уникальным атрибутом |
500 |
Internal Server Error |
Другие ошибки при создании объекта |
Примечание: Текст ошибки не фиксированный, может изменяться в зависимости от фактического ответа получателя запроса.
Пример ответа
Код 400
{
"error": "Bad Request",
"error_code": 400
}
Код 409
{
"error": "name_already_used",
"error_code": 409,
"extra": {
"fields": [
"name"
]
}
}
Код 500
{
"error": "Internal Server Error",
"error_code": 500
}