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:
- Open uw IoT-hub,
- Selecteer Onder Beveiliging instellingen en selecteer vervolgens Gegevensverzameling.
- Wijzig de configuratiegegevens van uw Log Analytics-werkruimte.
- Selecteer Opslaan.
Voer de volgende configuratie uit om toegang te krijgen tot gegevens die zijn opgeslagen in uw Log Analytics-werkruimte:
- Selecteer en selecteer een Defender for IoT-waarschuwing in uw IoT Hub.
- Selecteer Verder onderzoek.
- 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.
Bijgewerkte waarschuwingen
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.