Есть внешний список вредоносных доменов/URL-адресов, и я хочу периодически просматривать журналы, но есть очевидная проблема:
let abuse_domain = (externaldata(sentinel_domain: string )
[@"https://managedsentinel.com/downloads/covid19_domains.txt"]
with (format = "txt"))
| where sentinel_domain !startswith "#"
| project sentinel_domain;
abuse_domain
| join
(
DeviceNetworkEvents
| where Timestamp > ago(1h)
) on $left.sentinel_domain == $right.RemoteUrl
| project Timestamp,DeviceName,RemoteUrl,DeviceId,ReportId
Предложение On не будет работать, потому что два элемента никогда не будут полностью совпадать. Как я могу получить совпадение, если $left.sentinel_domain является подстрокой $rightRemoteUrl?
Попробуйте использовать parse_url, чтобы сначала извлечь домен (Host
) из RemoteUrl.
Вот так:
let abuse_domain = (externaldata(sentinel_domain: string )
[@"https://managedsentinel.com/downloads/covid19_domains.txt"]
with (format = "txt"))
| where sentinel_domain !startswith "#"
| project sentinel_domain;
abuse_domain
| join
(
DeviceNetworkEvents
| where Timestamp > ago(1h)
| extend Host = tostring(parse_url(RemoteUrl).Host)
) on $left.sentinel_domain == $right.Host
| project Timestamp,DeviceName,RemoteUrl,DeviceId,ReportId
Извините, я слишком долго редактировал приведенное выше, здесь должно было быть сказано: Спасибо, что указали мне правильное направление - как лучше всего это сделать? Кажется очевидным, что мне нужно извлечь URL-адрес перед соединением, но если я вставлю эту строку: let evildomain = (parseurl(abuse_domain).Host) это пометит abuse_domain в этой строке с ожидаемым «значением строки типа». Но разве это не строка? Если я попытаюсь обернуть злоупотребление_доменом в tostring, это будет «ожидаемое скалярное значение».
Вы должны привести значения, извлеченные из значения dynamic
, прежде чем их можно будет использовать (я думаю, потому что Kusto не может знать во время анализа запроса, каким будет тип извлеченного значения). Попробуйте let evildomain = tostring(parse_url(abuse_domain).Host)
Когда я это делаю, возникают ошибки, а для abuse_domain он говорит: «Ожидается значение строки». Это как странная проблема курицы и яйца.
Ага, теперь я вижу, что пошло не так. Вы пытаетесь разобрать abuse_domain
, но это целая таблица. Что вам нужно, так это extend
DeviceNetworkEvents
внутри соединения с хостом, извлеченным из его столбца RemoteUrl
. Я отредактировал свой ответ, указав, как это должно выглядеть. Извините за небольшую неточность.
Вы также можете добавить kind=inner
сразу после ключевого слова join
— значение по умолчанию может быть не таким, как вы ожидаете. См. learn.microsoft.com/en-us/azure/data-explorer/kusto/query/…
И вам также может понадобиться сделать это tolower(tostring(parse_url(RemoteUrl).Host))
, так как соединения чувствительны к регистру.
Спасибо, что указали мне правильное направление - как лучше всего это сделать? Кажется очевидным, что мне нужно извлечь URL-адрес перед соединением, но если я вставлю эту строку: let parsedurl = tostring(parseurl(abuse_domain).Host)