Eseguire query sul grafico dell'esposizione enterprise

Usare il grafico dell'esposizione aziendale in Gestione dell'esposizione in Microsoft Security per cercare in modo proattivo le minacce all'esposizione aziendale tra endpoint, ambienti cloud e infrastrutture ibride nella ricerca avanzata nel portale di Microsoft Defender. Con l'integrazione di Defender per il cloud nel portale di Defender, il grafico dell'esposizione include ora tipi di nodi cloud ed entità provenienti da ambienti Azure, AWS e GCP.

Le sezioni seguenti forniscono esempi, suggerimenti e suggerimenti per la creazione di query nel grafico dell'esposizione aziendale.

Prerequisiti

Creare query di ricerca avanzata

Usa l'operatore make-graph

L'operatore make-graph di Kusto carica in memoria i dati relativi a nodi e archi.

  • Poiché Kusto carica solo le colonne in uso, non è necessario selezionare in modo esplicito le colonne.
  • Tuttavia, la NodeProperties colonna contiene tutte le informazioni sui nodi e quindi è di grandi dimensioni.
  • Nella maggior parte degli scenari è utile estrarre solo le informazioni necessarie prima di immetterle nell'operatore make-graph .

Esempio

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

Usare colonne dinamiche e indicizzazione intelligente

NodeProperties e Categories sono colonne dinamiche.

  • Kusto sa che tali colonne contengono contenuto simile a json e applica l'indicizzazione intelligente.
  • Tuttavia, non tutti gli operatori Kusto usano l'indice. Ad esempio, set_has_element, isempty, isnotnull non usano l'indice quando vengono applicati a una colonna dinamica e isnotnull(Properties["containsSensitiveData"] non usa l'indice.
  • Usare invece l'operatore has() , che usa sempre l'indice.

Esempio

Nella query seguente l'operatore has controlla la data stringa e set_has_element verifica la presenza dell'elemento data .

L'uso di entrambi gli operatori è importante perché l'operatore has() restituisce true anche per una categoria prefix_data.

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

Scopri di più su la comprensione dei termini relativi alle stringhe.

Esempi di query di esposizione

Gli esempi seguenti consentono di scrivere query per comprendere i dati sull'esposizione alla sicurezza nel tenant.

Elencare tutte le etichette dei nodi nel tenant

La query seguente raggruppa i dati nella tabella ExposureGraphNodes e usa l'operatore summarize di Kusto per elencarli in base a NodeLabel.

ExposureGraphNodes
| summarize by NodeLabel

Elencare tutte le etichette edge nel tenant

La query seguente raggruppa i dati nella tabella e usa l'operatore ExposureGraphEdges di summarize Kusto per elencarli in base alle etichette perimetrali (EdgeLabel).

ExposureGraphEdges
| summarize by EdgeLabel

Elencare tutte le connessioni da un'etichetta di nodo specificata

La query seguente raggruppa i dati nella tabella ExposureGraphEdges e, quando l'etichetta del nodo di origine è microsoft.compute/virtualmachines, riepiloga le macchine virtuali per EdgeLabel. Riepiloga i bordi che connettono gli asset alle macchine virtuali nel grafico dell'esposizione alla sicurezza. Con l'integrazione di Defender per cloud nel portale di Defender, ora sono incluse le risorse cloud di più ambienti.

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

Elencare tutte le connessioni a un'etichetta di nodo specifica

La query seguente riepiloga i bordi che connettono le macchine virtuali ad altri asset del grafico di esposizione alla sicurezza. Raggruppa i dati nella tabella ExposureGraphEdges e, dove l'etichetta del nodo di destinazione è microsoft.compute/virtualmachines, usa l'operatore summarize di Kusto per visualizzare l'etichetta del nodo di destinazione in base a EdgeLabel.

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

Elencare le proprietà di un'etichetta di nodo specifica

La query seguente elenca le proprietà dell'etichetta del nodo della macchina virtuale. Raggruppa i dati nella ExposureGraphNodes tabella, filtrati per visualizzare solo i risultati dell'etichetta del nodo "microsoft.compute/virtualmachines". Con l'operatore project-keep , la query mantiene la NodeProperties colonna . I dati restituiti sono limitati a una riga. Con l'integrazione di Defender per cloud nel portale di Defender, NodeProperties include ora altre relazioni e attributi specifici del cloud.

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

Esempio: Eseguire query sulle risorse cloud in più ambienti

La query seguente illustra come eseguire query sulle risorse cloud da ambienti diversi ora disponibili con l'integrazione di Defender per il cloud nel portale di Defender:

ExposureGraphNodes
| where NodeLabel contains "microsoft.compute" or NodeLabel contains "aws." or NodeLabel contains "gcp."
| summarize count() by NodeLabel
| order by count_ desc

Eseguire query nel grafico di esposizione

Per eseguire query sul grafico di esposizione:

  1. Nel portale di Microsoft Defender selezionare Ricerca > avanzata.

  2. Nell'area Query, digitare la query. Usare lo schema del grafico, le funzioni e le tabelle degli operatori oppure gli esempi seguenti per creare la query.

  3. Selezionare Esegui query.

Esempi di query orientate al grafico

Usa questi esempi di query basate su grafi per scrivere query sull'esposizione alla sicurezza più efficaci. Gli esempi cercano modelli per esporre le relazioni tra entità che possono individuare rischi. Viene illustrato come correlare il contesto con i segnali di evento imprevisto/avviso.

Elencare tutte le etichette dei nodi collegate tramite un arco a un'etichetta di nodo specifica

La query seguente restituisce un elenco di tutte le etichette dei nodi in ingresso con un connettore all'etichetta del nodo della macchina virtuale. Crea una struttura a grafo mappando i dati della colonna SourceNodeId nella tabella ExposureGraphEdges alla colonna TargetNodeId nella tabella ExposureGraphNodes con l'operatore make-graph.

Usa quindi l'operatore graph-match per creare un modello del grafo in cui il nodo di destinazione TargetNode e NodeLabel corrispondono a microsoft.compute/virtualmachines. L'operatore project viene utilizzato per mantenere solo l'oggetto IncomingNodeLabels. Elenca i risultati in base a 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

Elencare tutte le etichette dei nodi adiacenti a una specifica etichetta di nodo

La query seguente restituisce un elenco di tutte le etichette dei nodi in uscita con un connettore all'etichetta del nodo della macchina virtuale.

  • Crea una struttura grafico eseguendo il mapping della colonna SourceNodeId che usa i dati della tabella ExposureGraphEdges alla colonna TargetNodeId della tabella ExposureGraphNodes usando l'operatore make-graph per creare una struttura grafico.
  • Usa quindi l'operatore graph-match per trovare la corrispondenza con il modello grafico in cui SourceNode e NodeLabel corrispondono microsoft.compute/virtualmachines.
  • L'operatore project viene utilizzato per mantenere solo l'oggetto OutgoingNodeLabels. Elenca i risultati in base a 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

Individuare le macchine virtuali esposte a Internet con una vulnerabilità RCE

La query seguente consente di individuare le macchine virtuali esposte a Internet e a una vulnerabilità RCE (Remote Code Execution) negli ambienti cloud.

  • Usa la tabella schema ExposureGraphNodes.
  • Quando entrambi NodePropertiesexposedToInternet e vulnerableToRCE sono true, verifica che la categoria (Categories) sia macchine virtuali (virtual_machine).
  • Con l'integrazione di Defender per cloud nel portale di Defender, sono ora incluse macchine virtuali di ambienti Azure, AWS e GCP.
ExposureGraphNodes
| where isnotnull(NodeProperties.rawData.exposedToInternet)
| where isnotnull(NodeProperties.rawData.vulnerableToRCE)
| where Categories has "virtual_machine" and set_has_element(Categories, "virtual_machine")

Esempio: Trovare percorsi di attacco ibridi tra gli asset cloud e locali

La query seguente illustra come identificare potenziali percorsi di attacco ibridi con l'integrazione di Defender per il cloud nel portale di Defender:

let CloudAssets = ExposureGraphNodes
| where Categories has "virtual_machine" and (NodeLabel contains "microsoft.compute" or NodeLabel contains "aws." or NodeLabel contains "gcp.");
let OnPremAssets = ExposureGraphNodes
| where Categories has "device" and not(NodeLabel contains "microsoft.compute" or NodeLabel contains "aws." or NodeLabel contains "gcp.");
ExposureGraphEdges
| make-graph SourceNodeId --> TargetNodeId with ExposureGraphNodes on NodeId
| graph-match (CloudVM)-[edge1]->(Identity)-[edge2]->(OnPremDevice)
       where set_has_element(CloudVM.Categories, "virtual_machine") and 
             (CloudVM.NodeLabel contains "microsoft.compute" or CloudVM.NodeLabel contains "aws." or CloudVM.NodeLabel contains "gcp.") and
             set_has_element(Identity.Categories, "identity") and
             set_has_element(OnPremDevice.Categories, "device") and
             not(OnPremDevice.NodeLabel contains "microsoft.compute" or OnPremDevice.NodeLabel contains "aws." or OnPremDevice.NodeLabel contains "gcp.")
       project CloudVMName=CloudVM.NodeName, IdentityName=Identity.NodeName, OnPremDeviceName=OnPremDevice.NodeName

Individua i dispositivi esposti su Internet con una vulnerabilità di elevazione dei privilegi

La query seguente cerca i dispositivi con connessione Internet esposti a una vulnerabilità di escalation dei privilegi, che potrebbe consentire l'accesso a privilegi di livello superiore all'interno del sistema.

  • Usa la tabella schema ExposureGraphNodes.
  • Quando NodeProperties è con connessione a Internet (IsInternetFacing) e VulnerableToPrivilegeEscalation, la query verifica che gli elementi in Categories siano effettivamente dispositivi (device).
ExposureGraphNodes
| where isnotnull(NodeProperties.rawData.IsInternetFacing)
| where isnotnull(NodeProperties.rawData.VulnerableToPrivilegeEscalation)
| where set_has_element(Categories, "device")

Visualizzare tutti gli utenti connessi a più di un dispositivo critico

Questa query restituisce un elenco di utenti connessi a più di un dispositivo critico, insieme al numero di dispositivi a cui sono connessi.

  • Crea una tabella IdentitiesAndCriticalDevices utilizzando i dati ExposureGraphNodes filtrati in base ai dispositivi con un livello di criticità superiore a 4 oppure per identity.
  • Crea quindi una struttura a grafo con l'operatore make-graph , dove EdgeLabel è Can Authenticate As.
  • Usa l'operatore graph-match per trovare le istanze in cui un device corrisponde a un identity.
  • Quindi usa l'operatore project per conservare gli ID di identità e gli ID di dispositivo.
  • L'operatore mv-apply filtra gli ID dei dispositivi e gli ID di identità in base al tipo. Vengono riepilogati e visualizzati i risultati in una tabella con le intestazioni , 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

Visualizzare i dispositivi client con una vulnerabilità critica/gli utenti che hanno accesso a server di valore elevato

La query seguente restituisce un elenco di dispositivi con vulnerabilità RCE e relativi ID dispositivo e dispositivi con vulnerabilità critiche elevate e i relativi ID dispositivo.

  • Viene creata una IdentitiesAndCriticalDevices tabella che include i dispositivi (device) con vulnerabilità RCE con criticità inferiore a quattro e le identità (identity) che, tramite il filtro e la corrispondenza dei criteri, mostrano i dispositivi con vulnerabilità critiche.
  • L'elenco viene filtrato in modo da visualizzare solo le connessioni con etichette perimetrali Can Authenticate As 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

Specificare tutti i percorsi dall'ID nodo specifico a un nodo con un'etichetta specifica

Questa query visualizza il percorso da uno specifico nodo IP, passando attraverso un massimo di tre asset, che porta a una connessione con il nodo etichettato come macchina virtuale.

  • Usa le tabelle dello schema ExposureGraphNodes e ExposureGraphEdges e gli operatori make-graph e graph-match per creare una struttura a grafo.
  • Con l'operatore project visualizza un elenco di ID IP, proprietà IP, ID macchina virtuale e proprietà della macchina virtuale.
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

Passaggi successivi

Esplora con la mappa della superficie di attacco.