Создание средства синтаксического анализа ASIM

Завершено

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

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

Когда ваше устройство предоставляет события, соответствующие схеме ASIM, но в Microsoft Sentinel отсутствуют средство синтаксического анализа для конкретного источника и устройства или соответствующая схема.

Когда для вашего устройства доступны зависящие от источника средства синтаксического анализа ASIM, но ваше устройство отправляет события методом или в формате, отличном от ожидаемого средствами синтаксического анализа ASIM. Например:

исходное устройство может быть настроено для отправки событий нестандартным образом;

устройство может иметь версию, отличную от той, которая поддерживается средством синтаксического анализа ASIM;

события могут собираться, изменяться и пересылаться промежуточной системой.

Процесс разработки пользовательского средства синтаксического анализа

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

  1. Соберите образцы журналов.

  2. Определите схемы или схемы, которые представляют события, отправляемые из источника.

  3. Сопоставьте поля исходного события с выбранной схемой или схемами.

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

  5. Протестируйте свое средство синтаксического анализа.

  6. Разверните средства синтаксического анализа в рабочих областях Microsoft Sentinel.

  7. Обновите соответствующее объединяющее средство синтаксического анализа ASIM, чтобы оно ссылалось на новое пользовательское средство синтаксического анализа.

  8. Вы также можете добавить собственные средства синтаксического анализа в основной дистрибутив ASIM. Добавленные вами средства синтаксического анализа также можно сделать доступными во всех рабочих областях в качестве встроенных.

Сбор образцов журналов

Для создания эффективных средств синтаксического анализа ASIM вам потребуется репрезентативный набор журналов, для чего в большинстве случаев понадобится настроить исходную систему и подключить ее к Microsoft Sentinel. Если у вас нет доступа к исходному устройству, вы можете развернуть любое из множества устройств для разработки и тестирования в облачных службах с оплатой по мере использования.

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

Репрезентативный набор журналов должен включать:

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

Сопоставление

Перед разработкой средства синтаксического анализа сопоставьте сведения, доступные в исходном событии или событиях, с выбранной вами схемой.

  • Сопоставьте все обязательные поля (желательно также сопоставить рекомендуемые).
  • Попробуйте сопоставить доступные в источнике сведения с нормализованным полями. Если она недоступна в рамках выбранной схемы, рассмотрите возможность сопоставления полей, доступных в других схемах.
  • Сопоставьте значения полей в источнике с нормализованными значениями, допустимыми в ASIM. Исходное значение сохраняется в отдельном поле, например EventOriginalResultDetails.

Разработка средств синтаксического анализа

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

Пользовательское средство синтаксического анализа — это запрос KQL, разработанный на странице Журналы Microsoft Sentinel. Запрос средства синтаксического анализа состоит из трех частей:

Фильтрация > Синтаксический анализ > Подготовка полей

Фильтрация соответствующих записей

Часто таблица в Microsoft Sentinel содержит события нескольких типов. Например:

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

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

Фильтрация в KQL выполняется с помощью оператора where. Например, событие Sysmon 1 сообщает о создании процесса и поэтому должно быть нормализовано до схемы ProcessEvent. Событие Sysmon 1 является частью таблицы Event, поэтому нужно использовать следующий фильтр:

Event | where Source == "Microsoft-Windows-Sysmon" and EventID == 1

Важно!

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

Фильтрация по типу источника с помощью списка отслеживания

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

Например, события Infoblox DNS отправляются в виде сообщений системного журнала, и их трудно отличить от сообщений системного журнала, отправленных из других источников. В таких случаях средство синтаксического анализа использует список источников, определяющих соответствующие события. Этот список сохраняется в списке отслеживания ASimSourceType.

Чтобы использовать список отслеживания ASimSourceType в средствах синтаксического анализа:

  • Включите следующую строку в начале средства синтаксического анализа:
let Sources_by_SourceType=(sourcetype:string){_GetWatchlist('ASimSourceType') | where SearchKey == tostring(sourcetype) | extend Source=column_ifexists('Source','') | where isnotempty(Source)| distinct Source };
  • Добавьте фильтр, использующий список отслеживания, в разделе фильтрации средства синтаксического анализа. Например, средство синтаксического анализа DNS Infoblox включает в себя следующее в разделе фильтрации:
| where Computer in (Sources_by_SourceType('InfobloxNIOS'))

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

  • Замените значение Computer реальным именем поля, которое содержит сведения о вашем источнике. Для любых средств синтаксического анализа на основе syslog можно сохранить значение Computer.

  • Замените маркер InfobloxNIOS любым значением, которое будет удобным для вашего средства синтаксического анализа. Сообщите пользователям средства синтаксического анализа, что они должны обновить список отслеживания ASimSourceType, включив в него выбранное вами значение, а также список источников, которые отправляют события этого типа.

Фильтрация на основе параметров средства синтаксического анализа

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

При фильтрации необходимо помнить о следующих моментах.

  • Выполняйте фильтрацию перед синтаксическим анализом с использованием физических полей. Если отфильтрованные результаты недостаточно точны, повторите тест после синтаксического анализа для дополнительной настройки результатов. Дополнительные сведения см. в разделе Оптимизация фильтрации.
  • Не выполняйте фильтрацию, если параметр не определен и по-прежнему содержит значение по умолчанию.

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

srcipaddr=='*' or ClientIP==srcipaddr
array_length(domain_has_any) == 0 or Name has_any (domain_has_any)

Оптимизация фильтрации

Чтобы средство синтаксического анализа работало с достаточной производительностью, обратите внимание на следующие рекомендации по фильтрации:

  • Всегда фильтруйте по встроенным, а не по проанализированным полям. Иногда бывает проще выполнять фильтрацию по проанализированным полям, но это значительно снижает производительность.
  • Используйте операторы, которые обеспечивают оптимальную производительность. В частности, это ==, has и startswith. Использование таких регулярных выражений, как contains или matches, также существенно влияет на производительность.

Рекомендации по фильтрации для повышения производительности не всегда легко выполнить. Например, использование has приводит к менее точным результатам, чем contains. В других случаях сопоставление встроенного поля, например SyslogMessage, дает менее точный результат, чем сравнение по извлеченным полям, например DvcAction. В таких случаях рекомендуется предварительно отфильтровать данные с помощью оператора оптимизации производительности по встроенному полю, а затем повторять фильтрацию с более точными условиями после синтаксического анализа.

Пример см. в следующем фрагменте кода средства синтаксического анализа DNS Infoblox. Сначала средство синтаксического анализа проверяет наличие слова client в поле SyslogMessage. Однако этот термин может использоваться в другом месте сообщения, поэтому после синтаксического анализа поля Log_Type средство синтаксического анализа снова проверяет, действительно ли значение поля содержит слово client.

Syslog | where ProcessName == "named" and SyslogMessage has "client"
…
      | extend Log_Type = tostring(Parser[1]),
      | where Log_Type == "client"

Разбор

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

Ниже перечислены упорядоченные по производительности операторы KQL, которые выполняют синтаксический анализ. Первый из них обеспечивает оптимальную производительность, а последний — производительность с наименьшим уровнем оптимизации.

Operator Description
split Синтаксический анализ строки значений с разделителями.
parse_csv Синтаксический анализ строки значений в формате CSV (значения с разделителями-запятыми).
parse Анализ нескольких значений из произвольной строки на основе шаблона, который может быть упрощенным шаблоном с повышенной производительностью или регулярным выражением.
extract_all Анализ отдельных значений из произвольной строки с использованием регулярного выражения. extract_all имеет примерно такую же производительность, как и parse, в котором используется регулярное выражение.
extract Извлечение одного значения из произвольной строки с использованием регулярного выражения. Использование extract обеспечивает производительность выше, чем у parse или extract_all, если требуется только одно значение. Однако несколько активаций extract для одной и той же исходной строки будут менее эффективны, чем одна активация parse или extract_all, поэтому такого варианта следует избегать.
parse_json Синтаксический анализ значений в строке в формате JSON. Если вам нужно получить из JSON только несколько значений, использование parse, extract или extract_all обеспечит лучшую производительность.
parse_xml Синтаксический анализ значений в строке в формате XML. Если вам нужно получить из XML только несколько значений, использование parse, extract или extract_all обеспечит лучшую производительность.

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

  • Форматирование и преобразование типов. Исходное поле после извлечения может потребоваться отформатировать в соответствии с полем целевой схемы. Например, может понадобиться преобразовать строку, представляющую дату и время, в формат поля datetime. В таких случаях полезны такие функции, как todatetime и tohex.

  • Поиск значения. Значение исходного поля после извлечения может потребоваться сопоставить с набором значений, указанных для поля целевой схемы. Например, некоторые источники сообщают числовые коды ответов DNS, а схема требует расширенных текстовых кодов ответа. Функции iff и case могут быть полезны для сопоставления нескольких значений.

    Например, средство синтаксического анализа Microsoft DNS назначает поле EventResult на основе идентификатора события и кода ответа с помощью инструкции iff следующим образом:

    extend EventResult = iff(EventId==257 and ResponseCode==0 ,'Success','Failure')
    

    Для нескольких значений используйте datatable и lookup, как демонстрирует то же средство синтаксического анализа DNS:

    let RCodeTable = datatable(ResponseCode:int,ResponseCodeName:string) [ 0, 'NOERROR', 1, 'FORMERR'....];
    ...
     | lookup RCodeTable on ResponseCode
     | extend EventResultDetails = case (
     isnotempty(ResponseCodeName), ResponseCodeName,
     ResponseCode between (3841 .. 4095), 'Reserved for Private Use',
     'Unassigned')
    

Сопоставление значений

Во многих случаях извлеченное исходное значение необходимо нормализовать. Например, в ASIM в MAC-адресе в качестве разделителя используются двоеточия, а источник может отправлять MAC-адрес с разделителями-дефисами. Основным оператором преобразования значений является extend; кроме того, применяется широкий набор функций KQL для работы со строками, числами и датами, как показано в разделе "Синтаксический анализ" выше.

Чтобы сопоставить набор значений со значениями, допустимыми целевым полем, используйте операторы case, iff и lookup.

Если каждое исходное может быть сопоставлено с некоторым целевым значением, определите сопоставление с помощью оператора datatable и lookup. Например.

let NetworkProtocolLookup = datatable(Proto:real, NetworkProtocol:string)[
        6, 'TCP',
        17, 'UDP'
   ];
    let DnsResponseCodeLookup=datatable(DnsResponseCode:int,DnsResponseCodeName:string)[
      0,'NOERROR',
      1,'FORMERR',
      2,'SERVFAIL',
      3,'NXDOMAIN',
      ...
   ];
   ...
   | lookup DnsResponseCodeLookup on DnsResponseCode
   | lookup NetworkProtocolLookup on Proto

Обратите внимание, что поиск полезен и эффективен, если у сопоставления есть только два возможных значения.

Если условия сопоставления более сложные, используйте функции iff и case. Функция iff выполняет сопоставление двух значений:

| extend EventResult = 
      iff(EventId==257 and ResponseCode==0,'Success','Failure’)

Функция case поддерживает более двух целевых значений. В приведенном ниже примере показано, как объединить lookup и case. В примере c lookup выше в поле DnsResponseCodeName возвращается пустое значение, если не найдено указанное в lookup значение. Представленный ниже пример с case добавляет к этому использование результата операции lookup, если он доступен, и указанием дополнительных условий в противном случае.

| extend DnsResponseCodeName = 
      case (
        DnsResponseCodeName != "", DnsResponseCodeName,
        DnsResponseCode between (3841 .. 4095), 'Reserved for Private Use',
        'Unassigned'
      )

Подготовка полей в результирующем наборе

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

Для подготовки полей в результирующем наборе используются следующие операторы KQL:

Operator Description Когда следует использовать в средстве синтаксического анализа
project-rename Переименовывает поля. Используйте project-rename, если поле существует в фактическом событии и его нужно переименовать. Переименованное поле ведет себя так же, как и встроенное, а операции с ним отличаются гораздо более высокой производительностью.
project-away Удаляет поля. Используйте project-away для удаления отдельных полей из результирующего набора. Исходные (ненормализованные) поля не рекомендуется удалять из результирующего набора, если для этого нет особой причины (например, если они создают путаницу или из-за большого размера могут повлиять на производительность).
проект Выбирает поля, которые существовали ранее или были созданы с помощью инструкции, и удаляет все остальные поля. Эту функцию не рекомендуется использовать в средстве синтаксического анализа, так как он не должен удалять остальные, ненормализованные поля. Если необходимо удалить из результата определенные поля, например временные значения, используемые во время синтаксического анализа, примените для этого project-away.
extend Добавьте псевдонимы. Помимо участия в создании вычисляемых полей, оператор extend также используется для создания псевдонимов.

Обработка вариантов синтаксического анализа

Во многих случаях события в потоке событий предполагают варианты, для которых требуется другая логика синтаксического анализа. Чтобы выполнять в одном средстве синтаксического анализа проверку нескольких вариантов, используйте условные операторы, такие как iff и case, или структуру union.

Чтобы использовать union для обработки нескольких вариантов, создайте отдельную функцию для каждого из них и объедините результаты с помощью оператора union:

let AzureFirewallNetworkRuleLogs = AzureDiagnostics
    | where Category == "AzureFirewallNetworkRule"
    | where isnotempty(msg_s);
let parseLogs = AzureFirewallNetworkRuleLogs
    | where msg_s has_any("TCP", "UDP")
    | parse-where
        msg_s with           networkProtocol:string 
        " request from "     srcIpAddr:string
        ":"                  srcPortNumber:int
    …
    | project-away msg_s;
let parseLogsWithUrls = AzureFirewallNetworkRuleLogs
    | where msg_s has_all ("Url:","ThreatIntel:")
    | parse-where
        msg_s with           networkProtocol:string 
        " request from "     srcIpAddr:string
        " to "               dstIpAddr:string
    …
union parseLogs,  parseLogsWithUrls…

Чтобы избежать дублирования событий и лишней обработки, каждая функция должна начинать работу с фильтрации по стандартным полям, чтобы отобрать для синтаксического анализа только "свои" события. Кроме того, при необходимости используйте оператор project-away в каждой ветви перед объединением.

Развертывание средств синтаксического анализа

Средства синтаксического анализа развертываются вручную путем копирования на страницу журнала Azure Monitor и сохранения запроса в качестве функции. Этот способ удобен для тестирования. Дополнительные сведения см. в статье Создание функции.

Чтобы развернуть большое количество средств синтаксического анализа, рекомендуется использовать шаблоны ARM для средств синтаксического анализа следующим образом.

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

  2. Используйте преобразователь шаблонов ASIM Yaml в ARM, чтобы преобразовать файл YAML в шаблон ARM.

  3. При развертывании обновления удалите старые версии функций с помощью портала или инструмента PowerShell для удаления функций.

  4. Разверните шаблон с помощью портала Azure или PowerShell.

Можно также объединить несколько шаблонов в один процесс развертывания, используя связанные шаблоны.