xml
Модуль xml входит в состав YAML-модулей processors и используется для нормализации событий в формате XML (подобно тому, как это делает модуль json по отношению к формату json).
Для поиска нужных элементов в XML модуль использует выражения XPath (синтаксис, также можно найти в прочих источниках). Для реализации модуля использовалась библиотека xpath для Go, поэтому не все возможности XPath могут быть покрыты, но подавляющее большинство случаев должно ею удовлетворяться.
Модуль поддерживает эвристический анализ.
Конфигурация
Конфигурация модуля xml состоит из списка шаблонов извлечения полей события. Каждый шаблон содержит следующие поля:
expr— выражение XPath для поиска нужного узла (узлов) XML-документаfrom— поле исходного события, к которому применяется шаблон. Если не указано, шаблон применяется к исходному текстуRawto— поле события, в которое помещается результат извлечения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>