Een verdacht IoT-apparaat onderzoeken

Defender for IoT-servicewaarschuwingen bieden duidelijke aanwijzingen wanneer IoT-apparaten vermoedelijk betrokken zijn bij verdachte activiteiten of wanneer er aanwijzingen bestaan dat een apparaat wordt aangetast.

In deze handleiding gebruikt u de voorgestelde onderzoekssuggesties om de potentiƫle risico's voor uw organisatie te bepalen, te bepalen hoe u deze kunt herstellen en de beste manieren te ontdekken om soortgelijke aanvallen in de toekomst te voorkomen.

  • Uw apparaatgegevens zoeken
  • Onderzoeken met KQL-query's

Hoe krijg ik toegang tot mijn gegevens?

Defender for IoT slaat standaard uw beveiligingswaarschuwingen en aanbevelingen op in uw Log Analytics-werkruimte. U kunt er ook voor kiezen om uw onbewerkte beveiligingsgegevens op te slaan.

Ga als volgende te werk om uw Log Analytics-werkruimte voor gegevensopslag te vinden:

  1. Open uw IoT-hub,
  2. Selecteer onder Beveiliging Instellingen en selecteer vervolgens Gegevensverzameling.
  3. Wijzig de configuratiegegevens van uw Log Analytics-werkruimte.
  4. Selecteer Opslaan.

Voer de volgende configuratie uit om toegang te krijgen tot gegevens die zijn opgeslagen in uw Log Analytics-werkruimte:

  1. Selecteer en selecteer een Defender for IoT-waarschuwing in uw IoT Hub.
  2. Selecteer Verder onderzoek.
  3. Selecteer Om te zien welke apparaten deze waarschuwing hebben, klikt u hier en bekijkt u de kolom DeviceId.

Onderzoeksstappen voor verdachte IoT-apparaten

Als u inzichten en onbewerkte gegevens over uw IoT-apparaten wilt bekijken, gaat u naar uw Log Analytics-werkruimte voor toegang tot uw gegevens.

Zie de onderstaande KQL-voorbeeldquery's om aan de slag te gaan met het onderzoeken van waarschuwingen en activiteiten op uw apparaat.

U kunt nagaan of andere waarschuwingen rond dezelfde tijd zijn geactiveerd via de volgende KQL-query:

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

Gebruikers met toegang

Gebruik de volgende KQL-query om erachter te komen welke gebruikers toegang hebben tot dit apparaat:

 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

Gebruik deze gegevens om het volgende te detecteren:

  • Welke gebruikers hebben toegang tot het apparaat?
  • Hebben de gebruikers met toegang de verwachte machtigingsniveaus?

Poorten openen

Gebruik de volgende KQL-query om te achterhalen welke poorten op het apparaat momenteel in gebruik zijn of zijn gebruikt:

 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

Gebruik deze gegevens om het volgende te detecteren:

  • Welke luistersockets zijn momenteel actief op het apparaat?
  • Moeten de luistersockets die momenteel actief zijn, zijn toegestaan?
  • Zijn er verdachte externe adressen verbonden met het apparaat?

Gebruikersaanmelding

Als u wilt zoeken naar gebruikers die zijn aangemeld bij het apparaat, gebruikt u de volgende KQL-query:

 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

Gebruik de queryresultaten om het volgende te detecteren:

  • Welke gebruikers hebben zich aangemeld bij het apparaat?
  • Moeten de gebruikers zich aanmelden?
  • Hebben de gebruikers die zich hebben aangemeld, verbinding gemaakt vanaf verwachte of onverwachte IP-adressen?

Proceslijst

Gebruik de volgende KQL-query om erachter te komen of de proceslijst naar verwachting is:

 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

Gebruik de queryresultaten om het volgende te detecteren:

  • Zijn er verdachte processen uitgevoerd op het apparaat?
  • Zijn processen uitgevoerd door de juiste gebruikers?
  • Bevatten eventuele opdrachtregeluitvoeringen de juiste en verwachte argumenten?

Volgende stappen

Nadat u een apparaat hebt onderzocht en een beter inzicht hebt in uw risico's, kunt u overwegen om aangepaste waarschuwingen te configureren om de beveiligingsstatus van uw IoT-oplossing te verbeteren. Als u nog geen apparaatagent hebt, kunt u overwegen een beveiligingsagent te implementeren of de configuratie van een bestaande apparaatagent te wijzigen om uw resultaten te verbeteren.