Поделиться через


Исследование подозрительного устройства Интернета вещей

Оповещения службы Defender для Интернета вещей предоставляют четкие сведения о том, что устройства Интернета вещей подозреваются в участии в подозрительных действиях или при наличии признаков компрометации устройства.

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

  • Поиск данных устройства
  • Изучение запросов KQL

Как получить доступ к данным?

По умолчанию Defender для Интернета вещей хранит оповещения системы безопасности и рекомендации в рабочей области Log Analytics. Вы также можете сохранить необработанные данные безопасности.

Чтобы найти рабочую область Log Analytics для хранилища данных, выполните следующие действия.

  1. Откройте Центр Интернета вещей,
  2. В разделе "Безопасность" выберите "Параметры" и выберите " Сбор данных".
  3. Измените сведения о конфигурации рабочей области Log Analytics.
  4. Выберите Сохранить.

Чтобы получить доступ к данным, хранящимся в рабочей области Log Analytics, сделайте следующее:

  1. Выберите оповещение Defender в вашем Центре интеграции Интернета вещей.
  2. Выберите "Дополнительное исследование".
  3. Выберите "Чтобы просмотреть, какие устройства имеют это оповещение", щелкните здесь и просмотрите столбец DeviceId.

Действия по расследованию подозрительных устройств Интернета вещей

Чтобы просмотреть аналитические сведения и необработанные данные о устройствах Интернета вещей, перейдите в рабочую область Log Analytics для доступа к данным.

Ознакомьтесь с примерами запросов KQL ниже, чтобы приступить к изучению оповещений и действий на устройстве.

Вы можете узнать, активируются ли другие оповещения примерно в то же время с помощью следующего запроса KQL:

let device = "YOUR_DEVICE_ID";
let hub = "YOUR_HUB_NAME";
SecurityAlert
| where ExtendedProperties contains device and ResourceId contains tolower(hub)
| project TimeGenerated, AlertName, AlertSeverity, Description, ExtendedProperties

Пользователи с доступом

Чтобы узнать, какие пользователи имеют доступ к этому устройству, используйте следующий запрос KQL:

 let device = "YOUR_DEVICE_ID";
 let hub = "YOUR_HUB_NAME";
 SecurityIoTRawEvent
 | where
    DeviceId == device and AssociatedResourceId contains tolower(hub)
    and RawEventName == "LocalUsers"
 | project
    TimestampLocal=extractjson("$.TimestampLocal", EventDetails, typeof(datetime)),
    GroupNames=extractjson("$.GroupNames", EventDetails, typeof(string)),
    UserName=extractjson("$.UserName", EventDetails, typeof(string))
 | summarize FirstObserved=min(TimestampLocal) by GroupNames, UserName

Используйте эти данные для обнаружения:

  • Какие пользователи имеют доступ к устройству?
  • Имеют ли пользователи с доступом ожидаемые уровни разрешений?

Открытие портов

Чтобы узнать, какие порты в настоящее время используются или использовались, используйте следующий запрос KQL:

 let device = "YOUR_DEVICE_ID";
 let hub = "YOUR_HUB_NAME";
 SecurityIoTRawEvent
 | where
    DeviceId == device and AssociatedResourceId contains tolower(hub)
    and RawEventName == "ListeningPorts"
    and extractjson("$.LocalPort", EventDetails, typeof(int)) <= 1024 // avoid short-lived TCP ports (Ephemeral)
 | project
    TimestampLocal=extractjson("$.TimestampLocal", EventDetails, typeof(datetime)),
    Protocol=extractjson("$.Protocol", EventDetails, typeof(string)),
    LocalAddress=extractjson("$.LocalAddress", EventDetails, typeof(string)),
    LocalPort=extractjson("$.LocalPort", EventDetails, typeof(int)),
    RemoteAddress=extractjson("$.RemoteAddress", EventDetails, typeof(string)),
    RemotePort=extractjson("$.RemotePort", EventDetails, typeof(string))
 | summarize MinObservedTime=min(TimestampLocal), MaxObservedTime=max(TimestampLocal), AllowedRemoteIPAddress=makeset(RemoteAddress), AllowedRemotePort=makeset(RemotePort) by Protocol, LocalPort

Используйте эти данные для обнаружения:

  • Какие сокеты прослушивания сейчас активны на устройстве?
  • Следует ли разрешить прослушивающие сокеты, которые в настоящее время активны?
  • Есть ли подозрительные удаленные адреса, подключенные к устройству?

Входы пользователей

Чтобы найти пользователей, вошедшего в устройство, используйте следующий запрос KQL:

 let device = "YOUR_DEVICE_ID";
 let hub = "YOUR_HUB_NAME";
 SecurityIoTRawEvent
 | where
    DeviceId == device and AssociatedResourceId contains tolower(hub)
    and RawEventName == "Login"
    // filter out local, invalid and failed logins
    and EventDetails contains "RemoteAddress"
    and EventDetails !contains '"RemoteAddress":"127.0.0.1"'
    and EventDetails !contains '"UserName":"(invalid user)"'
    and EventDetails !contains '"UserName":"(unknown user)"'
    //and EventDetails !contains '"Result":"Fail"'
 | project
    TimestampLocal=extractjson("$.TimestampLocal", EventDetails, typeof(datetime)),
    UserName=extractjson("$.UserName", EventDetails, typeof(string)),
    LoginHandler=extractjson("$.Executable", EventDetails, typeof(string)),
    RemoteAddress=extractjson("$.RemoteAddress", EventDetails, typeof(string)),
    Result=extractjson("$.Result", EventDetails, typeof(string))
 | summarize CntLoginAttempts=count(), MinObservedTime=min(TimestampLocal), MaxObservedTime=max(TimestampLocal), CntIPAddress=dcount(RemoteAddress), IPAddress=makeset(RemoteAddress) by UserName, Result, LoginHandler

Используйте результаты запроса для обнаружения:

  • Какие пользователи вошли на устройство?
  • Должны ли пользователи, которые уже вошли в систему, снова войти?
  • Выполнили ли пользователи вход с ожидаемых или неожиданных IP-адресов?

Список процессов

Чтобы проверить, соответствует ли список процессов ожиданиям, используйте следующий запрос KQL:

 let device = "YOUR_DEVICE_ID";
 let hub = "YOUR_HUB_NAME";
 SecurityIoTRawEvent
 | where
    DeviceId == device and AssociatedResourceId contains tolower(hub)
    and RawEventName == "ProcessCreate"
 | project
    TimestampLocal=extractjson("$.TimestampLocal", EventDetails, typeof(datetime)),
    Executable=extractjson("$.Executable", EventDetails, typeof(string)),
    UserId=extractjson("$.UserId", EventDetails, typeof(string)),
    CommandLine=extractjson("$.CommandLine", EventDetails, typeof(string))
 | join kind=leftouter (
    // user UserId details
    SecurityIoTRawEvent
    | where
       DeviceId == device and AssociatedResourceId contains tolower(hub)
       and RawEventName == "LocalUsers"
    | project
       UserId=extractjson("$.UserId", EventDetails, typeof(string)),
       UserName=extractjson("$.UserName", EventDetails, typeof(string))
    | distinct UserId, UserName
 ) on UserId
 | extend UserIdName = strcat("Id:", UserId, ", Name:", UserName)
 | summarize CntExecutions=count(), MinObservedTime=min(TimestampLocal), MaxObservedTime=max(TimestampLocal), ExecutingUsers=makeset(UserIdName), ExecutionCommandLines=makeset(CommandLine) by Executable

Используйте результаты запроса для обнаружения:

  • Были ли подозрительные процессы, запущенные на устройстве?
  • Выполнялись ли процессы соответствующими пользователями?
  • Содержат ли какие-либо выполнения командной строки правильные и ожидаемые аргументы?

Дальнейшие шаги

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