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

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

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

  • Поиск данных об устройстве
  • Анализ с использованием запросов KQL

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

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

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

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

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

  1. Выберите оповещение Defender для Интернета вещей в Центре Интернета вещей.
  2. Щелкните Further investigation (Дальнейшие исследования).
  3. Выберите To see which devices have this alert click here and view the DeviceId column (Чтобы узнать, какие устройства имеют это предупреждение, щелкните здесь и просмотрите столбец 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

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

  • Выполнялись ли подозрительные процессы на устройстве?
  • Запускались ли такие процессы санкционированным пользователем?
  • Вводились ли в командную строку правильные и ожидаемые аргументы?

Следующие шаги

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