Analizzare un dispositivo IoT sospetto

Gli avvisi del servizio Defender per IoT forniscono indicazioni chiare quando i dispositivi IoT sono sospettati di coinvolgimento in attività sospette o quando esistono indicazioni che un dispositivo è compromesso.

In questa guida usare i suggerimenti di indagine forniti per determinare i potenziali rischi per l'organizzazione, decidere come correggere e individuare i modi migliori per prevenire attacchi simili in futuro.

  • Trovare i dati del dispositivo
  • Analizzare l'uso di query KQL

Come è possibile accedere ai dati?

Per impostazione predefinita, Defender per IoT archivia gli avvisi di sicurezza e le raccomandazioni nell'area di lavoro Log Analytics. È anche possibile scegliere di archiviare i dati di sicurezza non elaborati.

Per individuare l'area di lavoro Log Analytics per l'archiviazione dei dati:

  1. Aprire l'hub IoT.
  2. In Sicurezza selezionare Impostazioni e quindi selezionare Raccolta dati.
  3. Modificare i dettagli di configurazione dell'area di lavoro Log Analytics.
  4. Seleziona Salva.

In seguito alla configurazione, eseguire le operazioni seguenti per accedere ai dati archiviati nell'area di lavoro Log Analytics:

  1. Selezionare e selezionare un avviso di Defender per IoT nel hub IoT.
  2. Selezionare Altre indagini.
  3. Selezionare To see which devices have this alert click here and view the DeviceId column (Per vedere quali dispositivi hanno questo avviso fare clic qui e visualizzare la colonna DeviceId).

Procedure di indagine per dispositivi IoT sospetti

Per visualizzare informazioni dettagliate e dati non elaborati sui dispositivi IoT, passare all'area di lavoro Log Analytics per accedere ai dati.

Vedere le query KQL di esempio seguenti per iniziare a analizzare avvisi e attività nel dispositivo.

È possibile verificare se altri avvisi sono stati attivati nello stesso momento tramite la query KQL seguente:

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

Utenti con accesso

Per scoprire quali utenti hanno accesso a questo dispositivo, usare la query KQL seguente:

 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

Usare questi dati per scoprire:

  • Quali utenti hanno accesso al dispositivo
  • Gli utenti con accesso hanno i livelli di autorizzazione previsti?

Aprire le porte

Per scoprire quali porte nel dispositivo sono attualmente in uso o sono state usate, usare la query KQL seguente:

 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

Usare questi dati per scoprire:

  • Quali socket di ascolto sono attualmente attivi sul dispositivo
  • I socket in ascolto attualmente attivi devono essere consentiti?
  • Sono presenti indirizzi remoti sospetti connessi al dispositivo?

Account di accesso utente

Per trovare gli utenti che hanno eseguito l'accesso al dispositivo, usare la query KQL seguente:

 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

Usare i risultati della query per scoprire:

  • Quali utenti hanno eseguito l'accesso al dispositivo?
  • Gli utenti che hanno eseguito l'accesso dovrebbero accedere?
  • Gli utenti che hanno eseguito l'accesso si connettono da indirizzi IP previsti o imprevisti?

Elenco processi

Per verificare se l'elenco di processi è come previsto, usare la query KQL seguente:

 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

Usare i risultati della query per scoprire:

  • Se sono stati eseguiti processi sospetti sul dispositivo
  • Se i processi sono stati eseguiti dagli utenti appropriati
  • Le esecuzioni della riga di comando contengono gli argomenti corretti e previsti?

Passaggi successivi

Dopo aver analizzato un dispositivo e ottenuto una migliore comprensione dei rischi, si potrebbe voler considerare la configurazione di avvisi personalizzati per migliorare le condizioni di sicurezza della soluzione IoT. Se non si ha già un agente di dispositivo, per migliorare i risultati prendere in considerazione la distribuzione di un agente protezione oppure la modifica della configurazione di un agente di dispositivo esistente.