Dela via


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:

  1. Öppna din IoT-hubb,
  2. Under Säkerhet väljer du Inställningar och sedan Datainsamling.
  3. Ändra konfigurationsinformation för Log Analytics-arbetsytan.
  4. Välj Spara.

Följande konfiguration gör du för att komma åt data som lagras på din Log Analytics-arbetsyta:

  1. Välj och välj en Defender for IoT-avisering i din IoT Hub.
  2. Välj Ytterligare undersökning.
  3. 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.

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.