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>