Badanie podejrzanego urządzenia IoT
Alerty usługi Defender for IoT zapewniają wyraźne wskazania, gdy urządzenia IoT są podejrzane o udział w podejrzanych działaniach lub gdy istnieją wskazania, że urządzenie zostało naruszone.
W tym przewodniku skorzystaj z sugestii dotyczących badania, aby ułatwić określenie potencjalnych zagrożeń dla organizacji, podjęcie decyzji o sposobie korygowania i odnalezienie najlepszych sposobów zapobiegania podobnym atakom w przyszłości.
- Znajdowanie danych urządzenia
- Badanie przy użyciu zapytań KQL
Jak mogę uzyskać dostęp do moich danych?
Domyślnie usługa Defender dla IoT przechowuje alerty zabezpieczeń i zalecenia w obszarze roboczym usługi Log Analytics. Możesz również przechowywać nieprzetworzone dane zabezpieczeń.
Aby zlokalizować obszar roboczy usługi Log Analytics na potrzeby przechowywania danych:
- Otwórz centrum IoT Hub
- W obszarze Zabezpieczenia wybierz pozycję Ustawienia, a następnie wybierz pozycję Zbieranie danych.
- Zmień szczegóły konfiguracji obszaru roboczego usługi Log Analytics.
- Wybierz pozycję Zapisz.
W celu uzyskania dostępu do danych przechowywanych w obszarze roboczym usługi Log Analytics wykonaj następujące czynności:
- Wybierz i wybierz alert usługi Defender for IoT w usłudze IoT Hub.
- Wybierz pozycję Dalsze badanie.
- Wybierz pozycję Aby zobaczyć, które urządzenia mają ten alert, kliknij tutaj i wyświetl kolumnę DeviceId.
Kroki badania dotyczące podejrzanych urządzeń IoT
Aby wyświetlić szczegółowe informacje i nieprzetworzone dane dotyczące urządzeń IoT, przejdź do obszaru roboczego usługi Log Analytics, aby uzyskać dostęp do danych.
Zapoznaj się z poniższymi przykładowymi zapytaniami KQL, aby rozpocząć badanie alertów i działań na urządzeniu.
Powiązane alerty
Możesz sprawdzić, czy inne alerty zostały wyzwolone w tym samym czasie za pomocą następującego zapytania 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
Użytkownicy z dostępem
Aby dowiedzieć się, którzy użytkownicy mają dostęp do tego urządzenia, użyj następującego zapytania 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
Użyj tych danych, aby odnaleźć:
- Którzy użytkownicy mają dostęp do urządzenia?
- Czy użytkownicy z dostępem mają oczekiwane poziomy uprawnień?
Otwarte porty
Aby dowiedzieć się, które porty na urządzeniu są aktualnie używane lub były używane, użyj następującego zapytania 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
Użyj tych danych, aby odnaleźć:
- Które gniazda nasłuchiwania są obecnie aktywne na urządzeniu?
- Czy gniazda nasłuchiwania, które są obecnie aktywne, powinny być dozwolone?
- Czy istnieją podejrzane adresy zdalne połączone z urządzeniem?
Identyfikatory logowania użytkownika
Aby znaleźć użytkowników zalogowanych na urządzeniu, użyj następującego zapytania 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
Użyj wyników zapytania, aby odnaleźć:
- Którzy użytkownicy logowali się na urządzeniu?
- Czy użytkownicy, którzy się zalogowali, powinni się zalogować?
- Czy użytkownicy, którzy zalogowali się, połączyli się z oczekiwanymi lub nieoczekiwanymi adresami IP?
Lista procesów
Aby dowiedzieć się, czy lista procesów jest zgodnie z oczekiwaniami, użyj następującego zapytania 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
Użyj wyników zapytania, aby odnaleźć:
- Czy na urządzeniu były uruchomione jakieś podejrzane procesy?
- Czy procesy były wykonywane przez odpowiednich użytkowników?
- Czy jakiekolwiek wykonania wiersza polecenia zawierają poprawne i oczekiwane argumenty?
Następne kroki
Po zbadaniu urządzenia i uzyskaniu lepszego zrozumienia ryzyka warto rozważyć skonfigurowanie alertów niestandardowych w celu poprawy stanu zabezpieczeń rozwiązania IoT. Jeśli nie masz jeszcze agenta urządzenia, rozważ wdrożenie agenta zabezpieczeń lub zmianę konfiguracji istniejącego agenta urządzenia, aby poprawić wyniki.