Undersöka en misstänkt IoT-enhet
Defender för IoT-tjänstaviseringar ger tydliga indikationer när IoT-enheter misstänks vara inblandade i misstänkta aktiviteter eller när det finns indikationer på att en enhet har komprometterats.
I den här guiden använder du de undersökningsförslag som tillhandahålls för att fastställa potentiella risker för din organisation, bestämma hur du ska åtgärda och identifiera de bästa sätten att förhindra liknande attacker i framtiden.
- Hitta dina enhetsdata
- Undersöka med KQL-frågor
Hur kommer jag åt mina data?
Som standard lagrar Defender för IoT dina säkerhetsaviseringar och rekommendationer på Log Analytics-arbetsytan. Du kan också välja att lagra dina rådata.
Så här hittar du Log Analytics-arbetsytan för datalagring:
- Öppna din IoT-hubb,
- Under Säkerhet väljer du Inställningar och sedan Datainsamling.
- Ändra konfigurationsinformation för Log Analytics-arbetsytan.
- Välj Spara.
Följande konfiguration gör du för att komma åt data som lagras på din Log Analytics-arbetsyta:
- Välj och välj en Defender for IoT-avisering i din IoT Hub.
- Välj Ytterligare undersökning.
- Välj För att se vilka enheter som har den här aviseringen klickar du här och visar kolumnen DeviceId.
Undersökningssteg för misstänkta IoT-enheter
Om du vill visa insikter och rådata om dina IoT-enheter går du till Log Analytics-arbetsytan för att få åtkomst till dina data.
Se KQL-exempelfrågorna nedan för att komma igång med att undersöka aviseringar och aktiviteter på enheten.
Relaterade aviseringar
Du kan ta reda på om andra aviseringar utlöstes ungefär samtidigt via följande KQL-fråga:
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
Användare med åtkomst
Om du vill ta reda på vilka användare som har åtkomst till den här enheten använder du följande KQL-fråga:
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
Använd dessa data för att identifiera:
- Vilka användare har åtkomst till enheten?
- Har användarna med åtkomst de förväntade behörighetsnivåerna?
Öppna portar
Använd följande KQL-fråga för att ta reda på vilka portar på enheten som för närvarande används eller användes:
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
Använd dessa data för att identifiera:
- Vilka lyssningsuttag är för närvarande aktiva på enheten?
- Ska de lyssningsuttag som för närvarande är aktiva tillåtas?
- Finns det några misstänkta fjärradresser anslutna till enheten?
Användarinloggningar
Om du vill hitta användare som loggat in på enheten använder du följande KQL-fråga:
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
Använd frågeresultatet för att identifiera:
- Vilka användare loggade in på enheten?
- Ska de användare som loggade in logga in?
- Anslöt de användare som loggade in från förväntade eller oväntade IP-adresser?
Processlista
Om du vill ta reda på om processlistan är som förväntat använder du följande KQL-fråga:
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
Använd frågeresultatet för att identifiera:
- Kördes det några misstänkta processer på enheten?
- Kördes processer av lämpliga användare?
- Innehöll alla kommandoradskörningar rätt och förväntade argument?
Nästa steg
När du har undersökt en enhet och fått en bättre förståelse för dina risker kan du överväga att konfigurera anpassade aviseringar för att förbättra din säkerhetsstatus för IoT-lösningen. Om du inte redan har en enhetsagent kan du överväga att distribuera en säkerhetsagent eller ändra konfigurationen av en befintlig enhetsagent för att förbättra dina resultat.