Лайфхаки для шаблонов
В KUMA во многих местах можно использовать шаблоны для обогащения. Но мало кто знает, что в template можно использовать не только значения полей, например, {{.DeviceAddress}}, но и другой функционал шаблонов GO (ссылка).
Ниже приведем несколько полезных лайфхаков, которые сделают ваши события красивыми и упростят обогащение и корреляцию.
Простое обогащение
Обогащать события можно не только классическими полями, например, {{.DeviceAddress}}, но и полями Extra, а также переменными.
Шаблон с обычными полем:
{{.DeviceAddress}}
Шаблон с Extra полем:
{{index .Extra "myField"}}
Шаблон с переменными (в функциях переменных):
template('Значения локальных переменных {{index . 0}} и {{index . 1}} а также {{index . 2}}', $var1, $var2, $var10)
Обогащение с условиями
Чтобы в message вставить текст "Пользователь user1 на хосте user1-pc.local (10.10.10.10) выполнил команду 'whoami'", а hostname и address не всегда могут быть указаны, но хочется красивую надпись без пустых скобок или лишних пробелов, то можно использовать условия:
Пользователь {{.DestinationNtDomain}}\{{.DestinationUserName}} на хосте {{if and .DeviceAddress .DeviceHostName}} {{.DeviceHostName}} ({{.DeviceAddress}}) {{else if .DeviceAddress}} {{.DeviceAddress}} {{ else }} {{.DeviceHostName}} {{ end }} выполнил команду "{{.DeviceCustomString4}}"
Такой же шаблон можно создать и с Extra-полями. Например, в поле события DeviceProcessName нужно записать значение из Extra-поля myField1, а в случае его отсутствия - myField2:
{{if index .Extra "myField1"}}{{index .Extra "myField1"}}{{else}}{{index .Extra "myField2"}}{{end}}
Еще пример:
{{if eq .DeviceCustomString1 "" }}{{""}}{{else}}{{"vlan"}}{{end}}
Также пример с использованием логических операторов and и or:
{{if and (eq .DeviceEventCategory "Application") ((or (eq .DeviceCustomString4 "MSSQL") (eq .DeviceCustomString4 "SQLISPackage")))}}{{.DestinationUserName}}{{end}}
Еще пример:
{{if and ((eq .DeviceCustomIPv6Address2 "") (not (eq .SourceAddress ""))) }}{{.SourceAddress}}{{else}}{{.DeviceCustomIPv6Address2}}{{end}}
Использование шаблонов с корреляционными правилами
В правилах standard можно в шаблоне указать количество базовых событий, которые попали в окно корреляции:
{{ len (.BaseEvents) }}
В правилах standard можно в шаблоне перечислить все значения, которые были в базовых событиях:
{{range .BaseEvents}} {{.SourceUserName}}{{end}}
В правилах standard можно в шаблоне достать значение из конкретного события, используя условия:
{{range .BaseEvents}}{{if eq .DeviceEventClassID "4688"}}{{.DestinationProcessName}}{{end}}{{end}}
Также в шаблонах можно использовать переменные, например, можем весь массив сырых событий положить в отдельную переменную $baseEvents и использовать её дальше. Пример ниже сортирует события 4104 по dcn1 и конкатенирует куски ScriptBlockText, чтобы в корреляционном событии получить весь PowerShell скрипт, а не куски из 15,5к символов.
{{ $baseEvents := .BaseEvents }}
{{range $index, $element := $baseEvents}}
{{range $i, $e := $baseEvents}}
{{if eq $e.DeviceCustomNumber1 (len (printf "a%*s" $index ""))}}
{{.S.ScriptBlockText}}
{{end}
}{{end}}
{{end}}
Полезные ссылки
Другие варианты работы с шаблонами GO в KUMA: