Перейти к основному содержимому
Версия: 4.6.X

xml

Модуль xml входит в состав YAML-модулей processors и используется для нормализации событий в формате XML (подобно тому, как это делает модуль json по отношению к формату json).

Для поиска нужных элементов в XML модуль использует выражения XPath (синтаксис, также можно найти в прочих источниках). Для реализации модуля использовалась библиотека xpath для Go, поэтому не все возможности XPath могут быть покрыты, но подавляющее большинство случаев должно ею удовлетворяться.

Модуль поддерживает эвристический анализ.

Конфигурация

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

  • expr — выражение XPath для поиска нужного узла (узлов) XML-документа
  • from — поле исходного события, к которому применяется шаблон. Если не указано, шаблон применяется к исходному тексту Raw
  • to — поле события, в которое помещается результат извлечения
  • value-type — тип поля, в которое помещается результат извлечения. Если не указано, используется тип string. Если поле события, куда помещается результат (см. поле конфигурации to), соответствует какому-либо предзагруженному, то его тип используется независимо от значения этого поля

Примеры

Извлечение текста из полей XML

Предположим, у нас имеется следующий XML-документ:

<Event>
<ID>1</ID>
<Timestamp>2024-06-28T06:49:14Z</Timestamp>
<Data>event data</Data>
</Event>

Для извлечения всех текстов в поля можно использовать следующую конфигурацию:

processors:
- module: xml
patterns:
- expr: /Event/Data/text()
to: ECS.Base.Message
- expr: /Event/ID/text()
to: ECS.Event.ID
- expr: /Event/Timestamp/text()
to: ECS.Base.Timestamp

Важно добавлять в конце выражения функцию text, иначе модуль извлечет узел целиком (например, вместо event data будет <Data>event data</Data>).

Извлечение атрибутов

Улучшим документ из прошлого примера и добавим в него атрибуты:

<Event provider="provider-name">
<ID format="integer">1</ID>
<Timestamp>2024-06-28T06:49:14Z</Timestamp>
<Data>event data</Data>
</Event>

Дополним конфигурационный файл из предыдущего примера паттернами извлечения атрибутов:

processors:
- module: xml
patterns:
- expr: /Event/Data/text()
to: ECS.Base.Message
- expr: /Event/ID/text()
to: ECS.Event.ID
- expr: /Event/Timestamp/text()
to: ECS.Base.Timestamp
- expr: /Event/@provider
to: ECS.Event.Provider
- expr: /Event/ID/@format
to: Event.ID.Format

Извлечение с фильтрацией

Чтобы показать извлечение с использованием фильтрации в XPath, добавим в документ поле, содержащее либо IP-адрес источника, либо его доменное имя. На тип поля (IP или домен) будет указывать атрибут.

<Event provider="provider-name">
<ID format="integer">1</ID>
<Timestamp>2024-06-28T06:49:14Z</Timestamp>
<Data>event data</Data>
<SourceHost type="ip">127.0.0.1</SourceHost>
</Event>

Чтобы извлекать поле либо в ECS.Source.IP, либо в ECS.Source.Domain, нужно написать два шаблона для этих двух случаев с фильтрацией. Также в любом случае мы извлекаем поле в ECS.Source.Address, так что добавляется и третий шаблон:

processors:
- module: xml
patterns:
- expr: /Event/Data/text()
to: ECS.Base.Message
- expr: /Event/ID/text()
to: ECS.Event.ID
- expr: /Event/Timestamp/text()
to: ECS.Base.Timestamp
- expr: /Event/@provider
to: ECS.Event.Provider
- expr: /Event/ID/@format
to: Event.ID.Format
- expr: /Event/SourceHost/text()
to: ECS.Source.Address
- expr: /Event/SourceHost[@type="ip"]/text()
to: ECS.Source.IP
- expr: /Event/SourceHost[@type="domain"]/text()
to: ECS.Source.Domain

После применения к событию модуля, получаем в событии поле ECS.Source.IP со значением 127.0.0.1. Чтобы проверить случай с доменом, можно слегка изменить событие:

<Event provider="provider-name">
<ID format="integer">1</ID>
<Timestamp>2024-06-28T06:49:14Z</Timestamp>
<Data>event data</Data>
<SourceHost type="domain">localhost</SourceHost>
</Event>