Partilhar via


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:

  1. Abra seu hub IoT,
  2. Em Segurança, selecione Configurações e, em seguida, selecione Coleta de Dados.
  3. Altere os detalhes de configuração do espaço de trabalho do Log Analytics.
  4. 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:

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

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.