Исследование подозрительных устройств Интернета вещей
Оповещения Defender для Интернета вещей четко указывают на возможность выполнения несанкционированных действий с устройствами Интернета вещей или компрометацию этих устройств.
В этом руководстве описано, как использовать предположения для определения возможных рисков для вашей организации, выбрать способ их устранения, а также определить оптимальные способы предотвращения подобных атак в будущем.
- Поиск данных об устройстве
- Анализ с использованием запросов KQL
Как получить доступ к данным
По умолчанию Defender для Интернета вещей хранит оповещения системы безопасности и рекомендации в рабочей области Log Analytics. Можно также хранить необработанные данные системы безопасности.
Чтобы найти рабочую область Log Analytics для хранения данных, сделайте следующее:
- Откройте Центр Интернета вещей.
- В разделе Безопасность выберите Параметры, а затем Сбор данных.
- Измените сведения о конфигурации рабочей области Log Analytics.
- Выберите Сохранить.
После этого для доступа к данным, хранящимся в рабочей области Log Analytics, сделайте следующее:
- Выберите оповещение Defender для Интернета вещей в Центре Интернета вещей.
- Щелкните Further investigation (Дальнейшие исследования).
- Выберите 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
Используйте следующие результаты запроса для исследования:
- Выполнялись ли подозрительные процессы на устройстве?
- Запускались ли такие процессы санкционированным пользователем?
- Вводились ли в командную строку правильные и ожидаемые аргументы?
Следующие шаги
После изучения устройства и получения сведений о рисках вы можете настроить получаемые оповещения, чтобы повысить уровень безопасности решения Интернета вещей. Если у вас еще нет агента безопасности устройства, вы можете развернуть его или изменить его конфигурацию для улучшения результатов.