Investigar um dispositivo IoT suspeito
Os alertas do serviço Defender for IoT fornecem indicações claras quando os dispositivos IoT são suspeitos de envolvimento em atividades suspeitas ou quando existem indícios de que um dispositivo está comprometido.
Neste guia, use as sugestões de investigação fornecidas para ajudar a determinar os riscos potenciais para sua organização, decidir como remediar e descobrir as melhores maneiras de evitar ataques semelhantes no futuro.
- Encontre os dados do seu dispositivo
- Investigar usando consultas KQL
Como posso aceder aos meus dados?
Por padrão, o Defender for IoT armazena seus alertas e recomendações de segurança em seu espaço de trabalho do Log Analytics. Você também pode optar por armazenar seus dados de segurança brutos.
Para localizar seu espaço de trabalho do Log Analytics para armazenamento de dados:
- Abra seu hub IoT,
- Em Segurança, selecione Configurações e, em seguida, selecione Coleta de Dados.
- Altere os detalhes de configuração do espaço de trabalho do Log Analytics.
- Selecione Guardar.
Após a configuração, faça o seguinte para acessar os dados armazenados em seu espaço de trabalho do Log Analytics:
- Selecione e selecione um alerta do Defender for IoT no seu Hub IoT.
- Selecione Investigação adicional.
- Selecione Para ver quais dispositivos têm esse alerta, clique aqui e visualize a coluna DeviceId.
Etapas de investigação para dispositivos IoT suspeitos
Para visualizar informações e dados brutos sobre seus dispositivos IoT, acesse o espaço de trabalho do Log Analytics para acessar seus dados.
Veja as consultas KQL de exemplo abaixo para começar a investigar alertas e atividades no seu dispositivo.
Alertas relacionados
Você pode descobrir se outros alertas foram acionados ao mesmo tempo através da seguinte consulta 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
Utilizadores com acesso
Para descobrir quais usuários têm acesso a este dispositivo, use a seguinte consulta 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
Use esses dados para descobrir:
- Que utilizadores têm acesso ao dispositivo?
- Os usuários com acesso têm os níveis de permissão esperados?
Portas abertas
Para descobrir quais portas no dispositivo estão atualmente em uso ou foram usadas, use a seguinte consulta 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
Use esses dados para descobrir:
- Quais soquetes de escuta estão atualmente ativos no dispositivo?
- Os soquetes de escuta que estão atualmente ativos devem ser permitidos?
- Existem endereços remotos suspeitos conectados ao dispositivo?
Logins de utilizador
Para localizar usuários que fizeram login no dispositivo, use a seguinte consulta 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
Use os resultados da consulta para descobrir:
- Que utilizadores iniciaram sessão no dispositivo?
- Os utilizadores que iniciaram sessão devem iniciar sessão?
- Os usuários que entraram se conectaram a partir de endereços IP esperados ou inesperados?
Lista de processos
Para descobrir se a lista de processos está conforme o esperado, use a seguinte consulta 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
Use os resultados da consulta para descobrir:
- Havia algum processo suspeito em execução no dispositivo?
- Os processos foram executados por usuários adequados?
- Alguma execução de linha de comando continha os argumentos corretos e esperados?
Próximos passos
Depois de investigar um dispositivo e obter uma melhor compreensão de seus riscos, você pode considerar Configurar alertas personalizados para melhorar sua postura de segurança da solução IoT. Se você ainda não tiver um agente de dispositivo, considere Implantar um agente de segurança ou alterar a configuração de um agente de dispositivo existente para melhorar seus resultados.