Найдите домен в URL-адресе с помощью Kusto (Advanced Hunting Defender ATP)

Есть внешний список вредоносных доменов/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?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
2 900
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуйте использовать 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 parsedurl = tostring(parseurl(abuse_domain).Host)

Mullets4All 11.01.2021 16:48

Извините, я слишком долго редактировал приведенное выше, здесь должно было быть сказано: Спасибо, что указали мне правильное направление - как лучше всего это сделать? Кажется очевидным, что мне нужно извлечь URL-адрес перед соединением, но если я вставлю эту строку: let evildomain = (parseurl(abuse_domain).Host) это пометит abuse_domain в этой строке с ожидаемым «значением строки типа». Но разве это не строка? Если я попытаюсь обернуть злоупотребление_доменом в tostring, это будет «ожидаемое скалярное значение».

Mullets4All 11.01.2021 16:56

Вы должны привести значения, извлеченные из значения dynamic, прежде чем их можно будет использовать (я думаю, потому что Kusto не может знать во время анализа запроса, каким будет тип извлеченного значения). Попробуйте let evildomain = tostring(parse_url(abuse_domain).Host)

Jonathan Myers 12.01.2021 18:07

Когда я это делаю, возникают ошибки, а для abuse_domain он говорит: «Ожидается значение строки». Это как странная проблема курицы и яйца.

Mullets4All 13.01.2021 19:16

Ага, теперь я вижу, что пошло не так. Вы пытаетесь разобрать abuse_domain, но это целая таблица. Что вам нужно, так это extendDeviceNetworkEvents внутри соединения с хостом, извлеченным из его столбца RemoteUrl. Я отредактировал свой ответ, указав, как это должно выглядеть. Извините за небольшую неточность.

Jonathan Myers 14.01.2021 21:58

Вы также можете добавить kind=inner сразу после ключевого слова join — значение по умолчанию может быть не таким, как вы ожидаете. См. learn.microsoft.com/en-us/azure/data-explorer/kusto/query/…

Jonathan Myers 14.01.2021 22:01

И вам также может понадобиться сделать это tolower(tostring(parse_url(RemoteUrl).Host)), так как соединения чувствительны к регистру.

Jonathan Myers 14.01.2021 22:05

Другие вопросы по теме