Compartilhar via


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:

  1. Abra seu Hub IoT,
  2. Em Segurança, selecione Configurações e, em seguida, selecione Coleta de Dados.
  3. Altere seus detalhes de configuração do espaço de trabalho do Log Analytics.
  4. Selecione Salvar.

Após a configuração, faça o seguinte para acessar dados armazenados no espaço de trabalho do Log Analytics:

  1. Selecione e selecione em um alerta do Defender para IoT em seu Hub IoT.
  2. Selecione Investigação adicional.
  3. 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.

É 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.