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
- Obtenga información sobre la administración de la superficie expuesta a ataques.
- Revise los permisos necesarios para trabajar con el gráfico.
Creación de consultas de búsqueda avanzadas
- Revisión de los procedimientos recomendados para crear consultas de búsqueda avanzadas
- Introducción al lenguaje de consulta Kusto (KQL)
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
,isempty
isnotnull
no use el índice cuando se aplique a una columna dinámica yisnotnull(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:
En el portal de Microsoft Defender, seleccione Búsqueda:> búsqueda avanzada.
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.
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/virtualmachines
con . 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 laExposureGraphEdges
tabla a laTargetNodeId
columna de laExposureGraphNodes
tabla mediante elmake-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 dondeSourceNode
yNodeLabel
coincidenmicrosoft.compute/virtualmachines
con . - El
project
operador se usa para mantener solo .OutgoingNodeLabels
Enumera los resultados porOutgoingNodeLabels
.
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
NodeProperties
exposedToInternet
vulnerableToRCE
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
) yVulnerableToPrivilegeEscalation
, la consulta comprueba que los elementos deCategories
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 medianteExposureGraphNodes
datos filtrados por dispositivos con un nivel de importancia superior a 4 o poridentity
. - A continuación, crea una estructura de gráfico con el
make-graph
operador , dondeEdgeLabel
esCan Authenticate As
. - Usa el
graph-match
operador para hacer coincidir las instancias en las que undevice
coincide con unidentity
. - 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 to
yUser 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
yCanRemoteInteractiveLogonTo
.
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 yExposureGraphEdges
y losmake-graph
operadores ygraph-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