Рассмотрим пример из предыдущей статьи о попытке пользователя войти в систему и напишем правило корреляции, которое будет формировать инциденты, если пользователи выполняют вход под дефолтными учетными записями.
Основная идея правила: в событиях типа
«action = login» проверять поле «
account» по списку дефолтных логинов:
1) Объявляем директиву
«query» для объявления запроса к нашему табличному списку.
query DefaultAccountQuery($account) from Default_accounts { column::account == $account}Условие запроса возвращает «True» если переданная в запрос УЗ находится в табличном списке.
2) Далее объявляем событие, подлежащее корреляции. В нашем случае это события
«Login» и
«Logout». В поле
«key» указываем поля
«event_src.host», «subject.name» по значению которых будет разделяться поток событий.
В инструкции «filter» указываем поля для настройки условия отбора события:- действие: вход или выход;
- субъект: УЗ (account);
- обязательно должно присутствовать значение УЗ, которое сохраняется в полях «subject.name» или «subject.account.name»;
- тип входа или выхода: удаленный по сети (не берем локальную аутентификацию);
- и стандартная обвязка для белых списков для исключения дефолтного логина при необходимости
event Login: key: event_src.host, subject.name filter { filter::NotFromCorrelator() and action == "login" and subject == "account" and (subject.name != null or subject.account.name != null) and (logon_auth_method == 'remote') and (exec_query("DefaultAccountQuery", [subject.name]) or exec_query("DefaultAccountQuery", [subject.account.name])) and filter::CheckWL_Specific_Only("Default_account_usage", lower(subject.account.name)) }event Logout: key: event_src.host, subject.name filter { filter::NotFromCorrelator() and action == "logout" and subject == "account" and (subject.name != null or subject.account.name != null) and (logon_auth_method == 'remote') and (exec_query("DefaultAccountQuery", [subject.name]) or exec_query("DefaultAccountQuery", [subject.account.name])) and filter::CheckWL_Specific_Only("Default_account_usage", lower(subject.account.name)) }3) Следующим шагом объявляем директиву
«rule» для описания правила корреляции:
rule Default_account_usage: (Login+ or Logout+) timer 10s init { $labels = "w_auto|default_subject_account_usage" } on Login { $subject.account.name = subject.account.name $subject.account.domain = subject.account.domain $subject.name = subject.name $src.host = src.host $src.fqdn = src.fqdn $src.hostname = src.hostname $src.ip = src.ip $src.asset = src.asset if subject.name != null then $alert.key = lower(subject.name) elif subject.account.name != null then $alert.key = lower(subject.account.name) endif $event_src.ip = event_src.ip $event_src.hostname = event_src.hostname $event_src.fqdn = event_src.fqdn $event_src.host = event_src.host $event_src.asset = event_src.asset $event_src.vendor = event_src.vendor $event_src.title = event_src.title $event_src.id = event_src.id $labels = $labels + "|CheckWL_Specific_Only" } on Logout { $subject.account.name = subject.account.name $subject.account.domain = subject.account.domain $subject.name = subject.name $src.host = src.host $src.fqdn = src.fqdn $src.hostname = src.hostname $src.ip = src.ip $src.asset = src.asset if subject.name != null then $alert.key = lower(subject.name) elif subject.account.name != null then $alert.key = lower(subject.account.name) endif $event_src.ip = event_src.ip $event_src.hostname = event_src.hostname $event_src.fqdn = event_src.fqdn $event_src.host = event_src.host $event_src.asset = event_src.asset $event_src.vendor = event_src.vendor $event_src.title = event_src.title $event_src.id = event_src.id $labels = $labels + "|CheckWL_Specific_Only" }4) Завершаем написание правила директивой «
emit», которая используется для заполнения полей корреляционного события:
emit { $correlation_type = "incident" $subject = "account" $action = "login" $object = "system" $status = "success" $category.generic = "Compliance" $category.high = "Policy Violation" $category.low = "IM Policy Violation" $importance = "high" $incident.severity = "high" #уровень опасности инцидента $incident.category = "PermissionViolation" #тип инцидента $incident.aggregation.timeout = 2h #время агрегации инцидента $id = "TSS_Password_Policy_Default_account_usage"}В правилах локализации укажем:id = "TSS_Password_Policy_Default_account_usage" and action = 'login'
The user logged in to the system from remote host {src.ip} using default accounts {subject.name}.
Пользователь с удаленного узла {src.ip} осуществил вход в систему под дефолтной учетной записью {subject.name}.
id = "TSS_Password_Policy_Default_account_usage" and action = 'logout'
The user log off the system from remote host {src.ip} using default accounts {subject.name}.
Пользователь с удаленного узла {src.ip} осуществил выход из системы, используя дефолтную учетную запись {subject.name}.