Prozkoumání podezřelého zařízení IoT
Výstrahy služby Defender for IoT poskytují jasné informace o tom, že zařízení IoT mají podezření na zapojení do podezřelých aktivit nebo když existují informace o ohrožení zařízení.
V této příručce využijte návrhy šetření, které vám pomůžou určit potenciální rizika pro vaši organizaci, rozhodnout se, jak napravit, a zjistit nejlepší způsoby, jak zabránit podobným útokům v budoucnu.
- Vyhledání dat zařízení
- Zkoumání pomocí dotazů KQL
Jak můžu získat přístup k datům?
Defender for IoT ve výchozím nastavení ukládá výstrahy zabezpečení a doporučení do pracovního prostoru služby Log Analytics. Můžete se také rozhodnout ukládat nezpracovaná data zabezpečení.
Vyhledání pracovního prostoru služby Log Analytics pro úložiště dat:
- Otevřete centrum IoT.
- V části Zabezpečení vyberte Nastavení a pak vyberte Shromažďování dat.
- Změňte podrobnosti konfigurace pracovního prostoru služby Log Analytics.
- Zvolte Uložit.
Pokud chcete získat přístup k datům uloženým v pracovním prostoru služby Log Analytics, postupujte následovně:
- Ve službě IoT Hub vyberte a vyberte výstrahu Defenderu pro IoT.
- Vyberte Další šetření.
- Vyberte , která zařízení mají toto upozornění, klikněte sem a zobrazte sloupec DeviceId.
Postup šetření pro podezřelá zařízení IoT
Pokud chcete zobrazit přehledy a nezpracovaná data o vašich zařízeních IoT, přejděte do pracovního prostoru služby Log Analytics a získejte přístup k datům.
Pokud chcete začít zkoumat výstrahy a aktivity na vašem zařízení, podívejte se na následující ukázkové dotazy KQL.
Související upozornění
Další výstrahy se aktivovaly přibližně ve stejnou dobu pomocí následujícího dotazu 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živatelé s přístupem
Pokud chcete zjistit, kteří uživatelé mají k tomuto zařízení přístup, použijte následující dotaz 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
Tato data použijte ke zjištění:
- Kteří uživatelé mají k zařízení přístup?
- Mají uživatelé s přístupem očekávané úrovně oprávnění?
Otevřené porty
Pokud chcete zjistit, které porty v zařízení se aktuálně používají nebo byly použity, použijte následující dotaz 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
Tato data použijte ke zjištění:
- Které naslouchací sokety jsou aktuálně v zařízení aktivní?
- Mají být povoleny naslouchací sokety, které jsou aktuálně aktivní?
- Jsou k zařízení připojené nějaké podezřelé vzdálené adresy?
Přihlášení uživatele
Pokud chcete najít uživatele, kteří se k zařízení přihlásili, použijte následující dotaz 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
Pomocí výsledků dotazu můžete zjistit:
- Kteří uživatelé se přihlásili k zařízení?
- Mají se přihlásit uživatelé, kteří se přihlásili?
- Přihlásili se uživatelé, kteří se přihlásili z očekávaných nebo neočekávaných IP adres?
Seznam procesů
Pokud chcete zjistit, jestli je seznam procesů očekávaný, použijte následující dotaz 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
Pomocí výsledků dotazu můžete zjistit:
- Byly na zařízení spuštěné nějaké podezřelé procesy?
- Byly procesy spouštěné příslušnými uživateli?
- Obsahovala některá spuštění příkazového řádku správné a očekávané argumenty?
Další kroky
Po prozkoumání zařízení a získání lepšího porozumění rizikům můžete zvážit konfiguraci vlastních upozornění , abyste zlepšili stav zabezpečení řešení IoT. Pokud ještě agenta zařízení nemáte, zvažte nasazení agenta zabezpečení nebo změnu konfigurace stávajícího agenta zařízení, aby se zlepšily výsledky.