#azure #logging #analytics #kql #azure-sentinel
Вопрос:
Я работаю над запросом, в котором мне нужен журнал, в котором есть сообщение «Скомпрометировано», затем я хочу, чтобы он вернул предыдущие 5 журналов «запретить». Новичок в KQL и просто не знаю оператора, поэтому я ценю помощь!
Текущий запрос:
| sort by TimeGenerated | where SourceIP == "555.555.555.555" | where TimeGenerated between (datetime(10/20/2021, 16:25:41.750).. datetime(10/20/2021, 16:35:41.750)) | where AdditionalExtensions has "Compromised" or DeviceAction == "deny"
В идеале в моей голове это было бы что-то вроде:
Необходимый запрос:
| sort by TimeGenerated | where SourceIP == "555.555.555.555" | where AdditionalExtensions has "Compromised" | \show preceding 5 logs that have DeviceAction = "deny"
Спасибо!
Ответ №1:
Вы можете использовать функцию prev()
Ответ №2:
Вот как вы это делаете:
let N = 5; // Number of records before/after records for which Cond is true YourTable | extend Cond = (SourceIP == "555.555.555.555") and (AdditionalExtensions has "Compromised") and (DeviceAction == "deny") // The predicate to "identify" relevant records | sort by TimeGenerated asc | extend rn = row_number(0, Cond) | extend nxt = next(rn, N), prv = prev(rn, N) | where nxt lt; N or (rn lt;= N and isnotnull(prv)) or Cond | project-away rn, nxt, prv, Cond
Обратите внимание , что сортировка выполняется после extend
, а не до — это более оптимально (всегда лучше опускать сортировку как можно ниже).
(Любезно предоставлено @RoyO)