Eseguire query sul grafico dell'esposizione aziendale
Usare il grafico dell'esposizione aziendale in Gestione dell'esposizione in Microsoft Security per cercare in modo proattivo le minacce all'esposizione aziendale nella ricerca avanzata nel portale di Microsoft Defender.
Questo articolo fornisce alcuni esempi, suggerimenti e suggerimenti per la costruzione di query nel grafico dell'esposizione aziendale.
Prerequisiti
- Informazioni sulla gestione della superficie di attacco.
- Esaminare le autorizzazioni necessarie per l'uso del grafico.
Compilare query di ricerca avanzate
- Esaminare le procedure consigliate per la creazione di query di ricerca avanzate
- Introduzione a Linguaggio di query Kusto (KQL)
Usare l'operatore make-graph
L'operatore kusto make-graph
carica i nodi e i bordi dei dati in memoria.
- 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 usare l'indice quando vengono applicati a una colonna dinamica eisnotnull(Properties["containsSensitiveData"]
non usano 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')
Altre informazioni sui termini stringa.
Query di esposizione di esempio
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 e usa l'operatore ExposureGraphNodes
di summarize
Kusto per elencarli in base NodeLabel
a .
ExposureGraphNodes
| summarize by NodeLabel
Elencare tutte le etichette perimetrali 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 ExposureGraphEdges
tabella e, dove l'etichetta del nodo di origine è microsoft.compute/virtualmachines
, riepiloga la macchina virtuale in base EdgeLabel
a . Riepiloga i bordi che connettono gli asset alle macchine virtuali nel grafico dell'esposizione alla sicurezza.
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 ExposureGraphEdges
tabella e, dove l'etichetta del nodo di destinazione è microsoft.compute/virtualmachines
, usa l'operatore di Kusto per elencare l'etichetta del summarize
nodo di destinazione in base EdgeLabel
a .
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.
ExposureGraphNodes
| where NodeLabel == "microsoft.compute/virtualmachines"
| project-keep NodeProperties
| take 1
Eseguire query sul grafico di esposizione
Per eseguire query sul grafico di esposizione:
Nel portale di Microsoft Defender selezionare Ricerca -> Ricerca avanzata.
Nell'area Query digitare la query. Usare lo schema del grafico, le funzioni e le tabelle degli operatori oppure gli esempi seguenti per compilare la query.
Selezionare Esegui query.
Esempi di query orientate al grafico
Usare questi esempi di query orientate al grafico per scrivere query di esposizione alla sicurezza migliori. 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 con un bordo in 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. Compila una struttura a grafo eseguendo il mapping dei SourceNodeId
dati della colonna nella ExposureGraphEdges
tabella alla TargetNodeId
colonna della ExposureGraphNodes
tabella con l'operatore make-graph
per compilare una struttura a grafo.
Usa quindi l'operatore graph-match
per creare un modello di grafico in cui il nodo TargetNode
di destinazione e NodeLabel
corrisponde microsoft.compute/virtualmachines
a . 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 che esegono un'etichetta di nodo specifica
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 a grafo eseguendo il mapping della
SourceNodeId
colonna che usa i dati dellaExposureGraphEdges
tabella allaTargetNodeId
colonna dellaExposureGraphNodes
tabella usando l'operatoremake-graph
per compilare una struttura a grafo. - Usa quindi l'operatore
graph-match
per trovare la corrispondenza con il modello grafico in cuiSourceNode
eNodeLabel
corrispondonomicrosoft.compute/virtualmachines
. - L'operatore
project
viene utilizzato per mantenere solo l'oggettoOutgoingNodeLabels
. Elenca i risultati in base aOutgoingNodeLabels
.
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).
- Usa la tabella dello
ExposureGraphNodes
schema. - Quando entrambi
NodeProperties
exposedToInternet
evulnerableToRCE
sono true, verifica che la categoria (Categories
) sia macchine virtuali (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")
Individuare i dispositivi con connessione Internet con una vulnerabilità di escalation 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 dello
ExposureGraphNodes
schema. - Quando
NodeProperties
è con connessione a Internet (IsInternetFacing
) eVulnerableToPrivilegeEscalation
, la query verifica che gli elementi inCategories
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
IdentitiesAndCriticalDevices
tabella usandoExposureGraphNodes
dati filtrati in base ai dispositivi con un livello di criticità superiore a 4 o peridentity
. - Crea quindi una struttura a grafo con l'operatore
make-graph
, doveEdgeLabel
èCan Authenticate As
. - Usa l'operatore per trovare la
graph-match
corrispondenza con le istanze in cui un oggettodevice
corrisponde a unidentity
oggetto . - Usa quindi l'operatore
project
per mantenere gli ID identità e gli ID dispositivo. - L'operatore
mv-apply
filtra gli ID dispositivo e gli ID identità in base al tipo. Vengono riepilogati e visualizzati i risultati in una tabella con le intestazioni ,Number Of devices user is logged-in to
eUser 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
eCanRemoteInteractiveLogonTo
.
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 un nodo IP specifico, passando fino a tre asset che comportano una connessione all'etichetta del nodo della macchina virtuale.
- Usa le
ExposureGraphNodes
tabelle dello schema eExposureGraphEdges
e glimake-graph
operatori egraph-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