Compartir a través de


Consulta del gráfico de exposición empresarial

Use el gráfico de exposición empresarial de Administración de exposición de seguridad de Microsoft para buscar amenazas de exposición empresarial de forma proactiva en la búsqueda avanzada en el portal de Microsoft Defender.

En este artículo se proporcionan algunos ejemplos, sugerencias e sugerencias para construir consultas en el gráfico de exposición empresarial.

Security Exposure Management está actualmente en versión preliminar pública.

Importante

Parte de la información contenida en este artículo se refiere a un producto preliminar que puede sufrir modificaciones sustanciales antes de su lanzamiento comercial. Microsoft no otorga garantías, expresas o implícitas, con respecto a la información que aquí se proporciona.

Requisitos previos

Creación de consultas de búsqueda avanzadas

Uso del operador make-graph

El operador de make-graph Kusto carga los nodos y los bordes de los datos en la memoria.

  • Dado que Kusto solo carga las columnas que están en uso, no es necesario seleccionar columnas explícitamente.
  • Sin embargo, la columna contiene toda la NodeProperties información del nodo, por lo que es grande.
  • En la mayoría de los escenarios, es útil extraer solo la información necesaria antes de introducirla en el make-graph operador.

Ejemplo

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

Uso de columnas dinámicas e indexación inteligente

NodeProperties y Categories son columnas dinámicas.

  • Kusto sabe que esas columnas contienen contenido similar a json y aplica la indexación inteligente.
  • Sin embargo, no todos los operadores de Kusto usan el índice. Por ejemplo, set_has_element, isemptyisnotnull no use el índice cuando se aplique a una columna dinámica y isnotnull(Properties["containsSensitiveData"] no use el índice.
  • En su lugar, use el has() operador , que siempre usa el índice.

Ejemplo

En la consulta siguiente, el has operador busca la data cadena y set_has_element comprueba el data elemento .

El uso de ambos operadores es importante, ya que el has() operador devuelve true incluso para una categoría prefix_data.

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

Obtenga más información sobre la comprensión de los términos de cadena.

Consultas de exposición de ejemplo

Los ejemplos siguientes pueden ayudarle a escribir consultas para comprender los datos de exposición de seguridad en el inquilino.

Enumerar todas las etiquetas de nodo del inquilino

La consulta siguiente agrupa los datos de la tabla y usa el ExposureGraphNodes operador de summarize Kusto para enumerarlos por NodeLabel.

ExposureGraphNodes
| summarize by NodeLabel

Enumerar todas las etiquetas perimetrales del inquilino

La consulta siguiente agrupa los datos de la tabla y usa el ExposureGraphEdges operador de summarize Kusto para enumerarlos por etiquetas perimetrales (EdgeLabel).

ExposureGraphEdges
| summarize by EdgeLabel

Enumerar todas las conexiones de una etiqueta de nodo especificada

En la consulta siguiente se agrupan los datos de la ExposureGraphEdges tabla y, donde la etiqueta del nodo de origen es microsoft.compute/virtualmachines, se resume el de la máquina virtual por EdgeLabel. Resume los bordes que conectan los recursos a las máquinas virtuales en el gráfico de exposición de seguridad.

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

Enumerar todas las conexiones a una etiqueta de nodo específica

En la consulta siguiente se resumen los bordes que conectan las máquinas virtuales a otros recursos de grafos de exposición de seguridad. Agrupa los datos de la ExposureGraphEdges tabla y, donde la etiqueta del nodo de destino es microsoft.compute/virtualmachines, usa el operador de Kusto para enumerar la etiqueta de summarize nodo de destino por EdgeLabel.

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

Enumerar las propiedades de una etiqueta de nodo específica

En la consulta siguiente se enumeran las propiedades de la etiqueta de nodo de máquina virtual. Agrupa los datos de la ExposureGraphNodes tabla, filtrados para mostrar solo los resultados de la etiqueta de nodo "microsoft.compute/virtualmachines". Con el project-keep operador , la consulta mantiene la NodeProperties columna. Los datos devueltos están limitados a una fila.

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

Consulta del gráfico de exposición

Para consultar el gráfico de exposición:

  1. En el portal de Microsoft Defender, seleccione Búsqueda:> búsqueda avanzada.

  2. En el área Consulta, escriba la consulta. Use el esquema de grafos, las funciones y las tablas de operadores o los ejemplos siguientes para ayudarle a compilar la consulta.

  3. Seleccione Ejecutar consulta.

Ejemplos de consultas orientadas a gráficos

Use estos ejemplos de consulta orientados a gráficos para ayudarle a escribir consultas de exposición de seguridad mejores. Los ejemplos buscan patrones para exponer las relaciones entre entidades que pueden descubrir riesgos. Le muestran cómo correlacionar el contexto con las señales de incidentes o alertas.

Enumerar todas las etiquetas de nodo con un borde en una etiqueta de nodo específica

La consulta siguiente da como resultado una lista de todas las etiquetas de nodo entrantes con un conector a la etiqueta de nodo de máquina virtual. Crea una estructura de grafos mediante la asignación de los SourceNodeId datos de columna de la ExposureGraphEdges tabla a la TargetNodeId columna de la ExposureGraphNodes tabla con el make-graph operador para compilar una estructura de grafos.

A continuación, usa el graph-match operador para crear un patrón de gráfico en el que el nodo TargetNode de destino y NodeLabel coincidan microsoft.compute/virtualmachinescon . El project operador se usa para mantener solo .IncomingNodeLabels Enumera los 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

Enumeración de todas las etiquetas de nodo que eden una etiqueta de nodo específica

La consulta siguiente da como resultado una lista de todas las etiquetas de nodo salientes con un conector a la etiqueta de nodo de máquina virtual.

  • Crea una estructura de grafo mediante la asignación de que la SourceNodeId columna usa los datos de la ExposureGraphEdges tabla a la TargetNodeId columna de la ExposureGraphNodes tabla mediante el make-graph operador para compilar una estructura de grafo.
  • A continuación, usa el graph-match operador para coincidir con el patrón de gráfico donde SourceNode y NodeLabel coinciden microsoft.compute/virtualmachinescon .
  • El project operador se usa para mantener solo .OutgoingNodeLabels Enumera los 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

Detección de máquinas virtuales expuestas a Internet con una vulnerabilidad de RCE

La consulta siguiente permite detectar máquinas virtuales expuestas a Internet y a una vulnerabilidad de ejecución remota de código (RCE).

  • Usa la tabla de ExposureGraphNodes esquema.
  • Cuando y NodePropertiesexposedToInternetvulnerableToRCE son true, comprueba que la categoría (Categories) es máquinas virtuales (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")

Detección de dispositivos accesibles desde Internet con una vulnerabilidad de escalado de privilegios

La consulta siguiente busca dispositivos accesibles desde Internet expuestos a una vulnerabilidad de elevación de privilegios, lo que podría permitir el acceso a privilegios de nivel superior dentro del sistema.

  • Usa la tabla de ExposureGraphNodes esquema.
  • Cuando NodeProperties está orientado a Internet (IsInternetFacing) y VulnerableToPrivilegeEscalation, la consulta comprueba que los elementos de Categories son realmente dispositivos (device).
ExposureGraphNodes
| where isnotnull(NodeProperties.rawData.IsInternetFacing)
| where isnotnull(NodeProperties.rawData.VulnerableToPrivilegeEscalation)
| where set_has_element(Categories, "device")

Mostrar todos los usuarios que han iniciado sesión en más de un dispositivo crítico

Esta consulta da como resultado una lista de usuarios que han iniciado sesión en más de un dispositivo crítico, junto con el número de dispositivos en los que han iniciado sesión.

  • Crea una IdentitiesAndCriticalDevices tabla mediante ExposureGraphNodes datos filtrados por dispositivos con un nivel de importancia superior a 4 o por identity.
  • A continuación, crea una estructura de gráfico con el make-graph operador , donde EdgeLabel es Can Authenticate As.
  • Usa el graph-match operador para hacer coincidir las instancias en las que un device coincide con un identity.
  • A continuación, usa el project operador para mantener los identificadores de identidad y los identificadores de dispositivo.
  • El mv-apply operador filtra los identificadores de dispositivo y los identificadores de identidad por tipo. Los resume y muestra los resultados en una tabla con los encabezados , Number Of devices user is logged-in toy 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 con una vulnerabilidad crítica o usuarios que tienen acceso a servidores de alto valor

La consulta siguiente da como resultado una lista de dispositivos con vulnerabilidades de RCE y sus identificadores de dispositivo, y dispositivos con vulnerabilidades críticas elevadas y sus identificadores de dispositivo.

  • Crea una IdentitiesAndCriticalDevices tabla que incluye dispositivos (device) con vulnerabilidades de RCE con una importancia crítica inferior a cuatro e identidades (identity) que, con el filtrado y la coincidencia de patrones, muestran dispositivos con vulnerabilidades críticas.
  • La lista se filtra para mostrar solo las conexiones que tienen etiquetas perimetrales Can Authenticate As y 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

Proporcionar todas las rutas de acceso desde un identificador de nodo específico a un nodo con una etiqueta específica

Esta consulta muestra la ruta de acceso de un nodo IP específico, pasando hasta tres recursos que da como resultado una conexión a la etiqueta de nodo de máquina virtual.

  • Usa las ExposureGraphNodes tablas de esquema y ExposureGraphEdges y los make-graph operadores y graph-match para crear una estructura de grafos.
  • Con el project operador , muestra una lista de identificadores IP, propiedades IP, identificadores de máquina virtual y propiedades 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

Pasos siguientes

Explorar con el mapa de superficie expuesta a ataques.