Udostępnij za pośrednictwem


Badanie podejrzanego urządzenia IoT

Alerty usługi Defender for IoT zapewniają wyraźne wskazania, gdy urządzenia IoT są podejrzane o udział w podejrzanych działaniach lub gdy istnieją wskazania, że urządzenie zostało naruszone.

W tym przewodniku skorzystaj z sugestii dotyczących badania, aby ułatwić określenie potencjalnych zagrożeń dla organizacji, podjęcie decyzji o sposobie korygowania i odnalezienie najlepszych sposobów zapobiegania podobnym atakom w przyszłości.

  • Znajdowanie danych urządzenia
  • Badanie przy użyciu zapytań KQL

Jak mogę uzyskać dostęp do moich danych?

Domyślnie usługa Defender dla IoT przechowuje alerty zabezpieczeń i zalecenia w obszarze roboczym usługi Log Analytics. Możesz również przechowywać nieprzetworzone dane zabezpieczeń.

Aby zlokalizować obszar roboczy usługi Log Analytics na potrzeby przechowywania danych:

  1. Otwórz centrum IoT Hub
  2. W obszarze Zabezpieczenia wybierz pozycję Ustawienia, a następnie wybierz pozycję Zbieranie danych.
  3. Zmień szczegóły konfiguracji obszaru roboczego usługi Log Analytics.
  4. Wybierz pozycję Zapisz.

W celu uzyskania dostępu do danych przechowywanych w obszarze roboczym usługi Log Analytics wykonaj następujące czynności:

  1. Wybierz i wybierz alert usługi Defender for IoT w usłudze IoT Hub.
  2. Wybierz pozycję Dalsze badanie.
  3. Wybierz pozycję Aby zobaczyć, które urządzenia mają ten alert, kliknij tutaj i wyświetl kolumnę DeviceId.

Kroki badania dotyczące podejrzanych urządzeń IoT

Aby wyświetlić szczegółowe informacje i nieprzetworzone dane dotyczące urządzeń IoT, przejdź do obszaru roboczego usługi Log Analytics, aby uzyskać dostęp do danych.

Zapoznaj się z poniższymi przykładowymi zapytaniami KQL, aby rozpocząć badanie alertów i działań na urządzeniu.

Możesz sprawdzić, czy inne alerty zostały wyzwolone w tym samym czasie za pomocą następującego zapytania KQL:

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

Użytkownicy z dostępem

Aby dowiedzieć się, którzy użytkownicy mają dostęp do tego urządzenia, użyj następującego zapytania KQL:

 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

Użyj tych danych, aby odnaleźć:

  • Którzy użytkownicy mają dostęp do urządzenia?
  • Czy użytkownicy z dostępem mają oczekiwane poziomy uprawnień?

Otwarte porty

Aby dowiedzieć się, które porty na urządzeniu są aktualnie używane lub były używane, użyj następującego zapytania KQL:

 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

Użyj tych danych, aby odnaleźć:

  • Które gniazda nasłuchiwania są obecnie aktywne na urządzeniu?
  • Czy gniazda nasłuchiwania, które są obecnie aktywne, powinny być dozwolone?
  • Czy istnieją podejrzane adresy zdalne połączone z urządzeniem?

Identyfikatory logowania użytkownika

Aby znaleźć użytkowników zalogowanych na urządzeniu, użyj następującego zapytania KQL:

 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

Użyj wyników zapytania, aby odnaleźć:

  • Którzy użytkownicy logowali się na urządzeniu?
  • Czy użytkownicy, którzy się zalogowali, powinni się zalogować?
  • Czy użytkownicy, którzy zalogowali się, połączyli się z oczekiwanymi lub nieoczekiwanymi adresami IP?

Lista procesów

Aby dowiedzieć się, czy lista procesów jest zgodnie z oczekiwaniami, użyj następującego zapytania KQL:

 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

Użyj wyników zapytania, aby odnaleźć:

  • Czy na urządzeniu były uruchomione jakieś podejrzane procesy?
  • Czy procesy były wykonywane przez odpowiednich użytkowników?
  • Czy jakiekolwiek wykonania wiersza polecenia zawierają poprawne i oczekiwane argumenty?

Następne kroki

Po zbadaniu urządzenia i uzyskaniu lepszego zrozumienia ryzyka warto rozważyć skonfigurowanie alertów niestandardowych w celu poprawy stanu zabezpieczeń rozwiązania IoT. Jeśli nie masz jeszcze agenta urządzenia, rozważ wdrożenie agenta zabezpieczeń lub zmianę konfiguracji istniejącego agenta urządzenia, aby poprawić wyniki.