Partager via


Examiner un appareil IoT suspect

Les alertes du service Defender pour IoT donnent des indications claires lorsqu’il est possible qu’un appareil IoT soit impliqué dans des activités suspectes ou compromis.

Dans ce guide, utilisez les suggestions d’enquête fournies afin de déterminer les risques potentiels pour votre organisation, de choisir le mode de correction adéquat et de vous prémunir au mieux contre des attaques similaires.

  • Rechercher les données de votre appareil
  • Investiguer avec des requêtes KQL

Accéder à ses données

Par défaut, Defender pour IoT stocke vos suggestions et alertes de sécurité dans votre espace de travail Log Analytics. Vous pouvez également choisir de stocker vos données de sécurité brutes.

Pour rechercher votre espace de travail Log Analytics pour le stockage des données :

  1. Ouvrez votre hub IoT.
  2. Sous Security (Sécurité), sélectionnez Settings (Paramètres), puis Data Collection (Collection de données).
  3. Changez les détails de la configuration de votre espace de travail Log Analytics.
  4. Sélectionnez Enregistrer.

Une fois la configuration effectuée, procédez comme suit pour accéder aux données stockées dans votre espace de travail Log Analytics :

  1. Dans votre hub IoT, sélectionnez une alerte Defender pour IoT et cliquez dessus.
  2. Sélectionnez Investigation poussée.
  3. Sélectionnez Pour voir quels sont les appareils qui ont cette alerte, cliquez ici et consultez la colonne DeviceId.

Étapes de l’examen des appareils IoT suspects

Pour accéder aux données brutes et aux insights de vos appareils IoT, allez dans votre espace de travail Log Analytics pour accéder à vos données.

Consultez les exemples de requêtes KQL ci-dessous pour commencer à investiguer les alertes et les activités sur votre appareil.

Vous pouvez savoir si d’autres alertes ont été déclenchées à peu près au même moment à l’aide de la requête KQL suivante :

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

Utilisateurs disposant d’un accès

Pour savoir quels utilisateurs ont accès à un appareil spécifique, utilisez la requête KQL suivante :

 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

Ces données répondent aux questions suivantes :

  • Quels sont les utilisateurs ayant accès à l’appareil ?
  • Les utilisateurs y ayant accès ont-ils les niveaux d’autorisation prévus ?

Ouvrir les ports

Pour savoir quels ports de l’appareil sont en cours d’utilisation ou ont été utilisés, exécutez la requête KQL suivante :

 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

Ces données répondent aux questions suivantes :

  • Quels sont les sockets d’écoute actifs sur l’appareil ?
  • Les sockets d’écoute actuellement actifs sont-ils censés être autorisés ?
  • Y a-t-il des adresses distantes suspectes connectées à l’appareil ?

Connexions utilisateur

Pour savoir quels utilisateurs se sont connectés à l’appareil, utilisez la requête KQL suivante :

 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

Les résultats de la requête répondent aux questions suivantes :

  • Quels sont les utilisateurs qui se sont connectés à l’appareil ?
  • Les utilisateurs qui se sont connectés sont-ils censés se connecter ?
  • Ces utilisateurs se sont-ils connectés à partir d’adresses IP attendues ou inattendues ?

Liste de processus

Pour savoir si la liste de processus est conforme à ce qui est attendu, utilisez la requête KQL suivante :

 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

Les résultats de la requête répondent aux questions suivantes :

  • Des processus suspects se sont-ils exécutés sur l’appareil ?
  • Les processus ont-ils été exécutés par les utilisateurs appropriés ?
  • Les exécutions de ligne de commande contenaient-elles les arguments corrects et attendus ?

Étapes suivantes

Après avoir examiné un appareil pour mieux comprendre les risques que vous encourez, vous pouvez envisager de configurer des alertes personnalisées pour améliorer la sécurité de votre solution IoT. Si vous ne disposez pas d’un agent d’appareil, envisagez de déployer un agent de sécurité ou de changer la configuration d’un agent d’appareil existant afin d’améliorer vos résultats.