Син­так­сис

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

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

В таб­ли­це со­бы­тий вы мо­же­те:

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

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

Поля recv_time, start_time, subevents, taxonomy_version, time не мо­гут быть ис­поль­зо­ва­ны для со­зда­ния усло­вия филь­тра­ции.
Поле body мо­жет быть ис­поль­зо­ва­но для со­зда­ния усло­вия филь­тра­ции толь­ко с опе­ра­то­ром CONTAINS.
Зна­че­ния по­лей со­бы­тий, со­дер­жа­щих GUID ак­ти­ва и дру­гие иден­ти­фи­ка­то­ры (agent_id, asset_ids, dst.asset, event_src.asset, input_id, recv_asset, site_id, src.asset, task_id, tenant_id, uuid), яв­ля­ют­ся ре­ги­стро­не­за­ви­си­мы­ми.

По умол­ча­нию таб­ли­ца со­дер­жит ко­лон­ки time (вре­мя со­зда­ния со­бы­тия), event_src.host (на­зва­ние или IP-ад­рес узла — ис­точ­ни­ка со­бы­тия) и text (опи­са­ние со­бы­тия). Для вы­бо­ра ко­ло­нок таб­ли­цы в поле Вы­бор по­лей необ­хо­ди­мо ука­зать поля со­бы­тий. Им бу­дут со­от­вет­ство­вать ко­лон­ки в таб­ли­це с ре­зуль­та­та­ми вы­пол­не­ния за­про­са.

Таб­ли­ца не мо­жет со­дер­жать дан­ные поля subevents.

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

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

По умол­ча­нию в таб­ли­це отоб­ра­жа­ют­ся все со­бы­тия. В поле Мак­си­маль­ное ко­ли­че­ство строк мож­но огра­ни­чить ко­ли­че­ство строк в таб­ли­це со­бы­тий.

При­ме­ры

Вы мо­же­те най­ти все неуспеш­ные по­пыт­ки вы­пол­не­ния дей­ствий в си­сте­ме с по­мо­щью сле­ду­ю­щих за­про­сов:

  • Select text, category.generic, status Where status = "failure" (для си­стем­но­го кон­струк­то­ра пред­став­ле­ния дан­ных);
  • filter(status = "failure") | select(text, category.generic, status) | sort(time desc) (для тек­сто­во­го пред­став­ле­ния в поле филь­тра­ции).

Для каж­до­го со­бы­тия в таб­ли­це бу­дут ука­за­ны его об­щая ка­те­го­рия, ста­тус и текст.

Вы мо­же­те най­ти все со­бы­тия по про­то­ко­лу, от­лич­но­му от UDP, че­рез порт ис­точ­ни­ка, вхо­дя­щий в мно­же­ство [80, 443, 8080, 8888, 88, 9050], с по­мо­щью сле­ду­ю­щих за­про­сов:

  • Select src.ip, dst.ip, src.port Where src.ip and dst.ip and src.port in [80, 443, 8080, 8888, 88, 9050] and protocol != "udp" (для си­стем­но­го кон­струк­то­ра пред­став­ле­ния дан­ных);
  • filter(src.ip and dst.ip and src.port in [80, 443, 8080, 8888, 88, 9050] and protocol != "udp") | select(time, src.ip, dst.ip, src.port) | sort(time desc) (для тек­сто­во­го пред­став­ле­ния в поле филь­тра­ции).

При этом для со­бы­тий долж­ны быть из­вест­ны IP-ад­ре­са ис­точ­ни­ка и по­лу­ча­те­ля. Для каж­до­го со­бы­тия в таб­ли­це бу­дут ука­за­ны IP-ад­ре­са ис­точ­ни­ка и по­лу­ча­те­ля и порт ис­точ­ни­ка.

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

  • Select src.host, subject, subject.name, object.name, object.path, event_src.host Where object = "file" and object.path startswith "C:\\ProgramData" Order by time (све­жее свер­ху) (для си­стем­но­го кон­струк­то­ра пред­став­ле­ния дан­ных);
  • filter(object = "file" and object.path startswith "C:\\ProgramData") | select(src.host, subject, subject.name, object.name, object.path, event_src.host) | sort(time desc) (для тек­сто­во­го пред­став­ле­ния в поле филь­тра­ции).

Для каж­до­го со­бы­тия в таб­ли­це бу­дет ука­за­но, с ка­ко­го ис­точ­ни­ка и кто осу­ще­ствил опе­ра­цию с объ­ек­том, а та­к­же сам объ­ект и ис­точ­ник, на ко­то­ром про­изо­шло со­бы­тие.

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

  • Select time, event_src.host, dst.hostname, text Where not(dst.hostname contains "itdepartment") (для си­стем­но­го кон­струк­то­ра пред­став­ле­ния дан­ных);
  • filter(not(dst.hostname contains "itdepartment")) | select(time, event_src.host, text) | sort(time desc) (для тек­сто­во­го пред­став­ле­ния в поле филь­тра­ции).

Для каж­до­го со­бы­тия в таб­ли­це бу­дет ука­за­но вре­мя, его ис­точ­ник, узел на­зна­че­ния и текст.

Вы мо­же­те най­ти все со­бы­тия с объ­ек­та­ми, рас­по­ло­жен­ны­ми не в пап­ке Program Files, с по­мо­щью сле­ду­ю­щих за­про­сов:

  • Select time, event_src.host, text Where (object.path != null) AND not(object.path match ".*Program Files.*") (для си­стем­но­го кон­струк­то­ра пред­став­ле­ния дан­ных);
  • filter((object.path != null) AND not(object.path match ".*Program Files.*")) | select(time, event_src.host, text) | sort(time desc) (для тек­сто­во­го пред­став­ле­ния в поле филь­тра­ции).

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

Вы мо­же­те най­ти все со­бы­тия от ис­точ­ни­ков, со­дер­жа­щих в на­зва­нии 'prod' и не на­хо­дя­щих­ся в под­се­ти 192.0.2.19/24, с по­мо­щью сле­ду­ю­щих за­про­сов:

  • Select time, event_src.host, text Where (event_src.host contains 'prod') and not(in_subnet(src.ip, "192.0.2.19/24")) (для си­стем­но­го кон­струк­то­ра пред­став­ле­ния дан­ных);
  • filter(event_src.host contains 'prod' and not(in_subnet(src.ip, "192.0.2.19/24"))) | select(time, event_src.host, src.ip) | sort(time desc) | limit(10000) (для тек­сто­во­го пред­став­ле­ния в поле филь­тра­ции).

Для каж­до­го со­бы­тия в таб­ли­це бу­дет ука­за­но вре­мя, его ис­точ­ник и текст.