INGEST
Understanding how to write an \[INGEST\] section in a Parsing Rules file and the syntax to use.
An INGEST section is used to define the resulting dataset. The COLLECT, CONST, and RULE sections are only add-ons, used to help organize the INGEST sections, and are optional to configure. Yet, a Parsing Rules file that contains no INGEST sections, generates no Parsing Rules. Therefore, the INGEST section is mandatory to configure.
INGEST syntax is derived from Cortex Query Language (XQL) with a few modifications as explained in the Parsing Rules syntax. In addition, INGEST sections contain the following syntax add-ons:
INGESTsections can have more than one XQLp statement, separated by a semicolon (;). Each statement creates a different Parsing Rule.The following XQL functions and stages are also supported in the
INGESTsection:Functions: arrayfilter, arraycreate, arraymerge, object_create, parse_cef, parse_cisco, and parse_json.
Stages: iploc and arrayexpand.
fields: Using the
fieldsstage in the[INGEST]section of the parsing rule explicitly controls the schema creation of the raw dataset. If you explicitly define only to ingest a few fields, then only these fields will be stored in Cortex XDR and available to query. Definingfieldsis a good way to only ingest clean data without including any corrupt data. Cortex XDR enforces a 2,000-field limit for every dataset. If a dataset has reached its 2,000-field limit, you can use thefieldsstage to manage these larger datasets.
Another new stage is available called
drop.droptakes a condition similar to the XQLfilterstage (same syntax), but drops every log entry that passes that condition. One can think of it as a negative filter, sodrop <condition>is not equivalent tofilter not <condition>.dropcan only appear last in a statement. No other XQLp rules can follow.
INGESTsections take parameters, and not names asRULEsections use, where some are mandatory and others optional.[ingest:vendor=<vendor>, product=<product>, target_dataset=<dataset>, no_hit=<keep\drop>, ingestnull=<true\false>] filter raw_log not contains "alert";
The parameter descriptions are explained in the following table:
vendor
The vendor that the specified Parsing Rules apply to (mandatory).
product
The product that the specified Parsing Rules apply to (mandatory).
target_dataset
The name of the dataset to insert every row with the results after applying any of the specified Parsing Rules (mandatory).
no_hit
No-match strategy to use for the entire specified group of rules (optional). The default is keep.
If
no_hit = drop, then in a scenario where none of the rules in the group generates output for a given log record, that record is discarded.If
no_hit = keep, then in a scenario where none of the rules in the group generates output for a given log record, that record is kept in the_raw_logfield. This record is inserted into the group's dataset once, but every column holdsNULLexcept for_raw_log, which holds the original JSON log record.
ingestnull
Defines whether null value fields are ingested (optional). By default this is set to true, so you only need to set this parameter when you want to overwrite the default definition.
Each statement represents a different Parsing Rule in the same group as depicted in the following example:
Example:
This generates 1 group of 2 Parsing Rules for panw/ngfw, where all the ingested data into panw_ngfw_ds dataset.
The following represents the syntax for the rules:
A few more points to keep in mind when writing INGEST sections:
INGESTparameter names are not case-sensitive. Therefore,vendor=PANWandvendor=panware the same.Since section order is unimportant, you do not have to declare a
RULEor aCONSTbefore using it in anINGESTsection.You can have multiple
INGESTsections with the samevendor,product,dataset, andno_hitvalues. Yet, this can lead to unexpected results. Consider the following example:Let
lwbe a log row. Iflw.raw_logdoesn't contain analertandlw.device_typedoesn't contain anagent, thenlwis inserted twice into thepan_ngfw_dsdataset as every section is standalone.To eliminate these kind of errors and misunderstandings, it is highly advised to group all rules having the same
vendor,product,dataset, andno_hitvalues in a singleINGESTsection.Logs that were discarded by a
dropstage are considered ingested with a no-match policy. This means they are not kept even ifno_hit = keep.Keep in mind that all rules inside a group get evaluated independently. This is in contrast to firewall-like rules, which stop evaluating the first rule that is able to make a decision. Therefore, without proper filtering, it is possible to ingest the same log more than once.
You can override the default raw dataset in
INGESTsections. For more information, see Parsing Rules Raw Dataset.Cortex XDR supports configuring case sensitivity in Parsing Rules only within the
INGESTsection using the following configuration stage:You can add a single tag or list of tags to the ingested data as part of the ingestion flow that you can easily query. You can add tags as part of the
INGESTsection or use both theINGESTandRULEsections.Note
You can't add tags to parsing rules using the Next-Generation Firewall (NGFW) datasets that are in the format
panw_ngfw_<text>_rawThe following are examples of each:
INGESTsection:Example:
Adding a single tag:
Adding a list of tags:
INGESTandRULEsections:Example:
Adding a single tag:
Adding a list of tags:
Last updated
Was this helpful?
