Найдите домен в 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?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
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

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