Compartilhar via


Consultar o grafo de exposição empresarial

Use o grafo de exposição empresarial no Gerenciamento de Exposição de Segurança da Microsoft para procurar proativamente ameaças de exposição corporativa na busca avançada no portal Microsoft Defender.

Este artigo fornece alguns exemplos, dicas e dicas para a construção de consultas no grafo de exposição empresarial.

O Gerenciamento de Exposição de Segurança está atualmente em versão prévia pública.

Importante

Algumas informações neste artigo estão relacionadas ao produto pré-lançado que pode ser modificado substancialmente antes de ser lançado comercialmente. A Microsoft não oferece garantias, expressas ou implícitas, com relação às informações aqui fornecidas.

Pré-requisitos

Criar consultas avançadas de caça

Usar o operador make-graph

O operador do make-graph Kusto carrega nós e borda dados na memória.

  • Como Kusto carrega apenas as colunas que estão em uso, não há necessidade de selecionar explicitamente colunas.
  • No entanto, a NodeProperties coluna contém todas as informações de nó e, portanto, é grande.
  • Na maioria dos cenários, é útil extrair apenas as informações necessárias antes de alimentá-la no make-graph operador.

Exemplo

let FilteredNodes = ExposureGraphNodes
| extend ContainsSensetiveData = NodeProperties has "containsSensitiveData"
| project Id, ContainsSensetiveData, Label, EntityIds, Categories;
Edges
| make-graph SourceNodeId --> TargetNodeId with FilteredNodes on Id
..

Usar colunas dinâmicas e indexação inteligente

NodeProperties e Categories são colunas dinâmicas.

  • Kusto sabe que essas colunas contêm conteúdo semelhante a json e aplica indexação inteligente.
  • No entanto, nem todos os operadores kusto usam o índice. Por exemplo, set_has_element, , isnotnullisemptynão use o índice quando eles são aplicados a uma coluna dinâmica e isnotnull(Properties["containsSensitiveData"] não usa o índice.
  • Em vez disso, use o has() operador, que sempre usa o índice.

Exemplo

Na consulta a seguir, o has operador verifica a data cadeia de caracteres e set_has_element verifica o data elemento.

O uso de ambos os operadores é importante, pois o has() operador retorna true mesmo para uma categoria prefix_data.

Categories has('data') and set_has_element(Categories, 'data')

Saiba mais sobre como entender os termos da cadeia de caracteres.

Consultas de exposição de exemplo

Os exemplos a seguir podem ajudá-lo a escrever consultas para entender os dados de exposição de segurança em seu locatário.

Listar todos os rótulos de nó em seu locatário

A consulta a seguir agrupa os dados na tabela e usa o ExposureGraphNodes operador do summarize Kusto para listá-los por NodeLabel.

ExposureGraphNodes
| summarize by NodeLabel

Listar todos os rótulos de borda em seu locatário

A consulta a seguir agrupa os dados na tabela e usa o ExposureGraphEdges operador do summarize Kusto para listá-los por rótulos de borda (EdgeLabel).

ExposureGraphEdges
| summarize by EdgeLabel

Listar todas as conexões de um rótulo de nó especificado

A consulta a seguir agrupa os dados na ExposureGraphEdges tabela e onde o rótulo de nó de origem é microsoft.compute/virtualmachines, ela resume os da máquina virtual por EdgeLabel. Ele resume as bordas que conectam ativos a máquinas virtuais no grafo de exposição de segurança.

ExposureGraphEdges
| where SourceNodeLabel == "microsoft.compute/virtualmachines"
| summarize by EdgeLabel

Listar todas as conexões com um rótulo de nó específico

A consulta a seguir resume bordas que conectam máquinas virtuais a outros ativos de grafo de exposição à segurança. Ele agrupa os dados na ExposureGraphEdges tabela e, onde o rótulo de nó de destino é microsoft.compute/virtualmachines, ele usa o operador do summarize Kusto para listar o rótulo de nó de destino por EdgeLabel.

ExposureGraphEdges
| where TargetNodeLabel == "microsoft.compute/virtualmachines"
| summarize by EdgeLabel

Listar propriedades de um rótulo de nó específico

A consulta a seguir lista as propriedades do rótulo de nó da máquina virtual. Ele agrupa os dados na ExposureGraphNodes tabela, filtrados para mostrar apenas os resultados do rótulo de nó "microsoft.compute/virtualmachines". Com o project-keep operador, a consulta mantém a NodeProperties coluna. Os dados retornados são limitados a uma linha.

ExposureGraphNodes
| where NodeLabel == "microsoft.compute/virtualmachines"
| project-keep NodeProperties
| take 1

Consultar o grafo de exposição

Para consultar o grafo de exposição:

  1. No portal Microsoft Defender, selecione caça –> caça avançada.

  2. Na área Consulta, digite sua consulta. Use o esquema de grafo, funções e tabelas de operador ou os exemplos a seguir para ajudar você a criar sua consulta.

  3. Selecione executar consulta.

Exemplos de consulta orientados ao grafo

Use esses exemplos de consulta orientados a grafo para ajudá-lo a escrever melhores consultas de exposição à segurança. Os exemplos buscam padrões para expor relações entre entidades que podem descobrir o risco. Eles mostram como correlacionar o contexto com sinais de incidente/alerta.

Listar todos os rótulos de nó com uma borda para um rótulo de nó específico

A consulta a seguir resulta em uma lista de todos os rótulos de nó de entrada com um conector para o rótulo de nó da máquina virtual. Ele cria uma estrutura de grafo mapeando os dados da SourceNodeIdExposureGraphEdges coluna na tabela para a TargetNodeId coluna na ExposureGraphNodes tabela com o make-graph operador para criar uma estrutura de grafo.

Em seguida, ele usa o graph-match operador para fazer um padrão de grafo em que o nó de TargetNode destino e NodeLabel corresponde microsoft.compute/virtualmachines. O project operador é usado para manter apenas o IncomingNodeLabels. Ele lista os resultados por IncomingNodeLabels.

ExposureGraphEdges
| make-graph SourceNodeId --> TargetNodeId with ExposureGraphNodes
on NodeId
| graph-match (SourceNode)-[edges]->(TargetNode)
       where TargetNode.NodeLabel == "microsoft.compute/virtualmachines"
       project IncomingNodeLabels = SourceNode.NodeLabel 
| summarize by IncomingNodeLabels

Listar todos os rótulos de nó que arrotam um rótulo de nó específico

A consulta a seguir resulta em uma lista de todos os rótulos de nó de saída com um conector para o rótulo de nó da máquina virtual.

  • Ele cria uma estrutura de grafo mapeando a SourceNodeId coluna usa os dados na ExposureGraphEdges tabela para a TargetNodeId coluna na ExposureGraphNodes tabela usando o make-graph operador para criar uma estrutura de grafo.
  • Em seguida, ele usa o graph-match operador para corresponder ao padrão de grafo em que SourceNode e NodeLabel corresponde microsoft.compute/virtualmachinesa .
  • O project operador é usado para manter apenas o OutgoingNodeLabels. Ele lista os resultados por OutgoingNodeLabels.
ExposureGraphEdges
| make-graph SourceNodeId --> TargetNodeId with ExposureGraphNodes
on NodeId
| graph-match (SourceNode)-[edges]->(TargetNode)
       where SourceNode.NodeLabel == "microsoft.compute/virtualmachines"
       project OutgoingNodeLabels = SourceNode.NodeLabel 
| summarize by OutgoingNodeLabels

Descobrir VMs expostas à Internet com uma vulnerabilidade RCE

A consulta a seguir permite descobrir máquinas virtuais expostas à Internet e a uma vulnerabilidade de RCE (Execução remota de Código).

  • Ele usa a ExposureGraphNodes tabela de esquema.
  • Quando ambos NodePropertiesexposedToInternet e vulnerableToRCE são verdadeiros, ele verifica se a categoria (Categories) é máquinas virtuais (virtual_machine).
ExposureGraphNodes
| where isnotnull(NodeProperties.rawData.exposedToInternet)
| where isnotnull(NodeProperties.rawData.vulnerableToRCE)
| where Categories has "virtual_machine" and set_has_element(Categories, "virtual_machine")

Descobrir dispositivos voltados para a Internet com uma vulnerabilidade de escalonamento de privilégios

A consulta a seguir procura dispositivos voltados para a Internet expostos a uma vulnerabilidade de escalonamento de privilégios, o que poderia permitir acesso a privilégios de nível mais alto no sistema.

  • Ele usa a ExposureGraphNodes tabela de esquema.
  • Quando NodeProperties está voltada para a Internet (IsInternetFacing) e VulnerableToPrivilegeEscalation, a consulta verifica se os itens em Categories são, na verdade, dispositivos (device).
ExposureGraphNodes
| where isnotnull(NodeProperties.rawData.IsInternetFacing)
| where isnotnull(NodeProperties.rawData.VulnerableToPrivilegeEscalation)
| where set_has_element(Categories, "device")

Mostrar todos os usuários conectados a mais de um dispositivo crítico

Essa consulta resulta em uma lista de usuários conectados a mais de um dispositivo crítico, juntamente com o número de dispositivos em que estão conectados.

  • Ele cria uma IdentitiesAndCriticalDevices tabela usando ExposureGraphNodes dados filtrados por dispositivos com um nível de criticidade acima de 4 ou por identity.
  • Em seguida, ele faz uma estrutura de grafo com o make-graph operador, onde o EdgeLabel é Can Authenticate As.
  • Ele usa o graph-match operador para corresponder a instâncias em que um device corresponde a um identity.
  • Em seguida, ele usa o project operador para manter IDs de identidade e IDs do dispositivo.
  • O mv-apply operador filtra IDs do dispositivo e IDs de identidade por tipo. Ele os resume e exibe os resultados em uma tabela com os cabeçalhos, Number Of devices user is logged-in toe User Id.
let IdentitiesAndCriticalDevices = ExposureGraphNodes
| where
 // Critical Device
 (set_has_element(Categories, "device") and isnotnull(NodeProperties.rawData.criticalityLevel) and NodeProperties.rawData.criticalityLevel.criticalityLevel < 4)
 // or identity
 or set_has_element(Categories, "identity");
ExposureGraphEdges
| where EdgeLabel == "Can Authenticate As"
| make-graph SourceNodeId --> TargetNodeId with IdentitiesAndCriticalDevices on NodeId
| graph-match (Device)-[canConnectAs]->(Identity)
       where set_has_element(Identity.Categories, "identity") and set_has_element(Device.Categories, "device")
       project IdentityIds=Identity.EntityIds, DeviceIds=Device.EntityIds
| mv-apply DeviceIds on (
    where DeviceIds.type == "DeviceInventoryId")
| mv-apply IdentityIds on (
    where IdentityIds.type == "SecurityIdentifier")
| summarize NumberOfDevicesUserLoggedinTo=count() by tostring(IdentityIds.id)
| where NumberOfDevicesUserLoggedinTo > 1
| project ["Number Of devices user is logged-in to"]=NumberOfDevicesUserLoggedinTo, ["User Id"]=IdentityIds_id

Mostrar dispositivos cliente com uma vulnerabilidade crítica/usuários que têm acesso a servidores de alto valor

A consulta a seguir resulta em uma lista de dispositivos com vulnerabilidades RCE e suas IDs de dispositivo, e dispositivos com vulnerabilidades críticas altas e suas IDs de dispositivo.

  • Ele cria uma IdentitiesAndCriticalDevices tabela que inclui dispositivos (device) com vulnerabilidades RCE com criticidade inferior a quatro e identidades (identity) que, com filtragem e correspondência de padrões, mostram dispositivos com vulnerabilidades críticas.
  • A lista é filtrada para mostrar apenas as conexões que têm rótulos Can Authenticate As de borda e CanRemoteInteractiveLogonTo.
let IdentitiesAndCriticalDevices = ExposureGraphNodes // Reduce the number of nodes to match
| where 
 // Critical devices & devices with RCE vulnerabilities
 (set_has_element(Categories, "device") and 
    (
        // Critical devices
        (isnotnull(NodeProperties.rawData.criticalityLevel) and NodeProperties.rawData.criticalityLevel.criticalityLevel < 4)
        or 
        // Devices with RCE vulnerability
        isnotnull(NodeProperties.rawData.vulnerableToRCE)
    )
  )
 or 
 // identity
 set_has_element(Categories, "identity");
ExposureGraphEdges
| where EdgeLabel in~ ("Can Authenticate As", "CanRemoteInteractiveLogonTo") // Reduce the number of edges to match
| make-graph SourceNodeId --> TargetNodeId with IdentitiesAndCriticalDevices on NodeId
| graph-match (DeviceWithRCE)-[CanConnectAs]->(Identity)-[CanRemoteLogin]->(CriticalDevice)
       where 
             CanConnectAs.EdgeLabel =~ "Can Authenticate As" and
             CanRemoteLogin.EdgeLabel =~ "CanRemoteInteractiveLogonTo" and
             set_has_element(Identity.Categories, "identity") and 
             set_has_element(DeviceWithRCE.Categories, "device") and isnotnull(DeviceWithRCE.NodeProperties.rawData.vulnerableToRCE) and
             set_has_element(CriticalDevice.Categories, "device") and isnotnull(CriticalDevice.NodeProperties.rawData.criticalityLevel)
       project DeviceWithRCEIds=DeviceWithRCE.EntityIds, DeviceWithRCEName=DeviceWithRCE.NodeName, CriticalDeviceIds=CriticalDevice.EntityIds, CriticalDeviceName=CriticalDevice.NodeName

Fornecer todos os caminhos da ID de nó específica para um nó com um rótulo específico

Essa consulta exibe o caminho de um nó IP específico, passando até três ativos que resultam em uma conexão com o rótulo de nó da máquina virtual.

  • Ele usa as ExposureGraphNodes tabelas de esquema e ExposureGraphEdges os make-graph operadores e graph-match para criar uma estrutura de grafo.
  • Com o project operador, ele exibe uma lista de IDs ip, propriedades IP, IDs de máquina virtual e propriedades de máquina virtual.
let IPsAndVMs = ExposureGraphNodes
| where (set_has_element(Categories, "ip_address") or set_has_element(Categories, "virtual_machine"));
ExposureGraphEdges
| make-graph SourceNodeId --> TargetNodeId with IPsAndVMs on NodeId
| graph-match (IP)-[anyEdge*1..3]->(VM)
       where set_has_element(IP.Categories, "ip_address") and set_has_element(VM.Categories, "virtual_machine")
       project IpIds=IP.EntityIds, IpProperties=IP.NodeProperties.rawData, VmIds=VM.EntityIds, VmProperties=VM.NodeProperties.rawData

Próximas etapas

Explore com o mapa da superfície de ataque.