Investigar um dispositivo IoT suspeito
Os alertas do serviço Defender para IoT fornecem indicações claras quando se desconfia que os dispositivos IoT estão envolvidos em atividades suspeitas ou quando há indicações 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, decida como corrigir e descubra as melhores maneiras de evitar ataques semelhantes no futuro.
- Encontrar dados do dispositivo
- Investigar o uso de consultas KQL
Como posso acessar meus dados?
Por padrão, o Defender para IoT armazena seus alertas de segurança e recomendações no workspace do Log Analytics. Você também pode optar por armazenar seus dados brutos de segurança.
Para localizar o seu workspace do Log Analytics para o armazenamento de dados:
- Abra seu Hub IoT,
- Em Segurança, selecione Configurações e, em seguida, selecione Coleta de Dados.
- Altere seus detalhes de configuração do espaço de trabalho do Log Analytics.
- Selecione Salvar.
Após a configuração, faça o seguinte para acessar dados armazenados no espaço de trabalho do Log Analytics:
- Selecione e selecione em um alerta do Defender para IoT em seu Hub IoT.
- Selecione Investigação adicional.
- Selecione Para ver quais dispositivos têm esse alerta, clique aqui e veja a coluna DeviceId.
Etapas de investigação para dispositivos de IoT suspeitas
Para visualizar informações e dados brutos sobre os dispositivos IoT, vá para o workspace do Log Analytics para acessar seus dados.
Confira as consultas KQL de exemplo abaixo para começar a investigar alertas e atividades no seu dispositivo.
Alertas relacionados
É possível saber se outros alertas foram disparados mais ou menos ao mesmo tempo usando a 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
Usuários com acesso
Para descobrir quais usuários têm acesso a esse 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:
- Quais usuários têm acesso ao dispositivo?
- Os usuários com acesso têm os níveis de permissão esperados?
Abrir portas
Para descobrir quais portas no dispositivo estão atualmente em uso ou já foram utilizadas, empregue 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 ativos no dispositivo no momento?
- Os soquetes de escuta que estão ativos no momento devem ser permitidos?
- Há algum endereço remoto suspeito conectado ao dispositivo?
Logons de usuário
Para descobrir quem fez logon 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:
- Quais usuários se conectaram ao dispositivo?
- Os usuários que se conectaram têm autorização para tal?
- Os usuários que se conectaram o fizeram com endereços de IP esperados ou inesperados?
Lista de processos
Para conferir se a lista de processos atende às expectativas, 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:
- Houve qualquer processo em execução suspeito no dispositivo?
- Os processos foram executados por usuários apropriados?
- As execuções de linha de comando continham os argumentos corretos e esperados?
Próximas etapas
Após investigar um dispositivo e obter uma melhor compreensão sobre os riscos, você talvez queira considerar Configurar alertas personalizados para melhorar sua postura de segurança da solução de 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 os resultados.