Forespørg i virksomhedseksponeringsgrafen
Brug grafen over eksponering i virksomheder i Microsoft Security Exposure Management til proaktivt at jagte trusler mod virksomhedseksponering i avanceret jagt på Microsoft Defender portalen.
Denne artikel indeholder nogle eksempler, tip og tip til oprettelse af forespørgsler i virksomhedseksponeringsgrafen.
Forudsætninger
- Læs om administration af angrebsoverfladen.
- Gennemse de påkrævede tilladelser til at arbejde med grafen.
Byg avancerede jagtforespørgsler
- Gennemse bedste praksis for oprettelse af avancerede jagtforespørgsler
- Kom i gang med Kusto Query Language (KQL)
Brug make-graph-operatoren
Kustos make-graph
operator indlæser node- og kantdata i hukommelsen.
- Da Kusto kun indlæser de kolonner, der er i brug, er det ikke nødvendigt at markere kolonner eksplicit.
- Kolonnen indeholder dog
NodeProperties
alle nodeoplysninger og er derfor stor. - I de fleste scenarier er det nyttigt kun at udtrække de oplysninger, der kræves, før den overføres til operatoren
make-graph
.
Eksempel
let FilteredNodes = ExposureGraphNodes
| extend ContainsSensetiveData = NodeProperties has "containsSensitiveData"
| project Id, ContainsSensetiveData, Label, EntityIds, Categories;
Edges
| make-graph SourceNodeId --> TargetNodeId with FilteredNodes on Id
..
Brug dynamiske kolonner og smart-indeksering
NodeProperties
og Categories
er dynamiske kolonner.
- Kusto ved, at disse kolonner indeholder json-lignende indhold og anvender smart indeksering.
- Det er dog ikke alle Kusto-operatorer, der bruger indekset. Brug f.eks. ikke indekset,
set_has_element
isempty
isnotnull
når de anvendes på en dynamisk kolonne, ogisnotnull(Properties["containsSensitiveData"]
de bruger ikke indekset. - Brug i stedet operatoren
has()
, som altid bruger indekset.
Eksempel
I følgende forespørgsel søger operatoren has
efter strengen data
og set_has_element
kontrollerer elementet data
.
Det er vigtigt at bruge begge operatorer, da operatoren has()
returnerer true, selv for en kategori prefix_data
.
Categories has('data') and set_has_element(Categories, 'data')
Få mere at vide om strengbegreber.
Eksempel på eksponeringsforespørgsler
Følgende eksempler kan hjælpe dig med at skrive forespørgsler for at forstå sikkerhedseksponeringsdata i din lejer.
Vis alle nodenavne i din lejer
Følgende forespørgsel grupperer dataene i tabellen ExposureGraphNodes
og bruger Kustos summarize
operator til at vise dem efter NodeLabel
.
ExposureGraphNodes
| summarize by NodeLabel
Vis alle kantmærkater i din lejer
Følgende forespørgsel grupperer dataene i tabellen ExposureGraphEdges
og bruger Kustos summarize
operator til at vise dem efter kantmærkater (EdgeLabel
).
ExposureGraphEdges
| summarize by EdgeLabel
Vis alle forbindelser fra en angivet nodeetiket
I følgende forespørgsel grupperes dataene i tabellen ExposureGraphEdges
, og hvor kildenodenavnet er microsoft.compute/virtualmachines
, opsummeres den virtuelle maskines efter EdgeLabel
. Den opsummerer de kanter, der forbinder aktiver til virtuelle maskiner i diagrammet over sikkerhedseksponering.
ExposureGraphEdges
| where SourceNodeLabel == "microsoft.compute/virtualmachines"
| summarize by EdgeLabel
Vis alle forbindelser til et bestemt nodenavn
I følgende forespørgsel opsummeres kanter, der forbinder virtuelle maskiner med andre grafaktiver for sikkerhedseksponering. Den grupperer dataene i ExposureGraphEdges
tabellen, og hvor destinationsnodens mærkat er microsoft.compute/virtualmachines
, bruger den Kusto-operatoren summarize
til at angive destinationsnodens mærkat efter EdgeLabel
.
ExposureGraphEdges
| where TargetNodeLabel == "microsoft.compute/virtualmachines"
| summarize by EdgeLabel
Listeegenskaber for et bestemt nodenavn
I følgende forespørgsel vises egenskaber for nodenavnet for den virtuelle maskine. Den grupperer dataene i ExposureGraphNodes
tabellen, filtreret for kun at vise nodenavnet "microsoft.compute/virtualmachines" resultater. Med operatoren project-keep
bevarer forespørgslen kolonnen NodeProperties
. De returnerede data er begrænset til én række.
ExposureGraphNodes
| where NodeLabel == "microsoft.compute/virtualmachines"
| project-keep NodeProperties
| take 1
Forespørg på eksponeringsgrafen
Sådan forespørger du på eksponeringsgrafen:
I Microsoft Defender portalen skal du vælge jagt -> avanceret jagt.
Skriv din forespørgsel i området Forespørgsel. Brug grafskema-, funktions- og operatortabeller eller følgende eksempler til at hjælpe dig med at oprette din forespørgsel.
Vælg Kør forespørgsel.
Graforienterede forespørgselseksempler
Brug disse graforienterede forespørgselseksempler til at hjælpe dig med at skrive bedre forespørgsler om sikkerhedseksponering. Eksemplerne søger efter mønstre for at vise relationer mellem objekter, der kan afdække risici. De viser dig, hvordan du korrelerer kontekst med hændelses-/advarselssignaler.
Vis alle nodenavne med en kant til et bestemt nodenavn
Følgende forespørgsel resulterer i en liste over alle indgående nodenavne med en forbindelse til nodenavnet på den virtuelle maskine. Den opretter en grafstruktur ved at knytte SourceNodeId
kolonnedataene i tabellen ExposureGraphEdges
til TargetNodeId
kolonnen i ExposureGraphNodes
tabellen med operatoren make-graph
for at oprette en grafstruktur.
Derefter bruges operatoren graph-match
til at oprette et grafmønster, hvor destinationsnoden TargetNode
og NodeLabel
matcher microsoft.compute/virtualmachines
. Operatoren project
bruges kun IncomingNodeLabels
til at bevare . Den viser resultaterne efter 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
Vis alle nodenavne, der kan vises på en bestemt nodeetiket
Følgende forespørgsel resulterer i en liste over alle udgående nodenavne med en forbindelse til nodenavnet på den virtuelle maskine.
- Den opretter en grafstruktur ved at knytte kolonnen
SourceNodeId
bruger dataene iExposureGraphEdges
tabellen tilTargetNodeId
kolonnen iExposureGraphNodes
tabellen ved hjælp af operatorenmake-graph
til at oprette en grafstruktur. - Derefter bruges operatoren
graph-match
til at matche det grafmønster, hvorSourceNode
ogNodeLabel
matchermicrosoft.compute/virtualmachines
. - Operatoren
project
bruges kunOutgoingNodeLabels
til at bevare . Den viser resultaterne efterOutgoingNodeLabels
.
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
Find VM'er, der er eksponeret til internettet, med en RCE-sårbarhed
Følgende forespørgsel giver dig mulighed for at finde virtuelle maskiner, der er eksponeret for internettet, og en RCE-sikkerhedsrisiko (Remote Code Execution).
- Skematabellen bruges
ExposureGraphNodes
. - Når både
NodeProperties
exposedToInternet
ogvulnerableToRCE
er sande, kontrollerer den, at kategorien (Categories
) er virtuelle maskiner (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")
Find enheder over for internettet med en sårbarhed over for rettighedseskalering
Følgende forespørgsel søger efter enheder på internettet, der er udsat for en rettighedseskaleringssårbarhed, hvilket kan give adgang til rettigheder på et højere niveau i systemet.
- Skematabellen bruges
ExposureGraphNodes
. - Når
NodeProperties
både er mod internettet (IsInternetFacing
) ogVulnerableToPrivilegeEscalation
, kontrollerer forespørgslen, at elementerne iCategories
faktisk er enheder (device
).
ExposureGraphNodes
| where isnotnull(NodeProperties.rawData.IsInternetFacing)
| where isnotnull(NodeProperties.rawData.VulnerableToPrivilegeEscalation)
| where set_has_element(Categories, "device")
Vis alle brugere, der er logget på mere end én kritisk enhed
Denne forespørgsel resulterer i en liste over brugere, der er logget på mere end én kritisk enhed, sammen med antallet af enheder, de er logget på.
- Der oprettes en
IdentitiesAndCriticalDevices
tabel ved hjælp afExposureGraphNodes
data, der enten er filtreret efter enheder med et kritisk niveau over 4 eller efteridentity
. - Derefter oprettes der en grafstruktur med operatoren
make-graph
, hvorEdgeLabel
erCan Authenticate As
. - Den bruger operatoren
graph-match
til at matche forekomster, hvor endevice
svarer til enidentity
. - Derefter bruges operatoren
project
til at beholde identitets-id'er og enheds-id'er. - Operatoren
mv-apply
filtrerer enheds-id'er og identitets-id'er efter type. Den opsummerer dem og viser resultaterne i en tabel med overskrifterne ,Number Of devices user is logged-in to
ogUser 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
Vis klientenheder med en kritisk sårbarhed/brugere, der har adgang til servere med høj værdi
Følgende forespørgsel resulterer i en liste over enheder med RCE-sikkerhedsrisici og deres enheds-id'er og enheder med høj kritiske sikkerhedsrisici og deres enheds-id'er.
- Den opretter en
IdentitiesAndCriticalDevices
tabel, der indeholder enheder (device
) med RCE-sikkerhedsrisici med en kritisk værdi, der er lavere end fire, og identiteter (identity
), der med gennem filtrering og mønstermatchning viser enheder med kritiske sikkerhedsrisici. - Listen er filtreret, så der kun vises de forbindelser, der har kantnavne
Can Authenticate As
ogCanRemoteInteractiveLogonTo
.
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
Angiv alle stier fra et bestemt node-id til en node med en bestemt etiket
Denne forespørgsel viser stien fra en bestemt IP-node, der går gennem op til tre aktiver, der resulterer i en forbindelse til nodenavnet for den virtuelle maskine.
- Den bruger skematabellerne
ExposureGraphNodes
ogExposureGraphEdges
ogmake-graph
graph-match
til at oprette en grafstruktur. - Med operatoren
project
vises en liste over IP-id'er, IP-egenskaber, id'er for virtuelle maskiner og egenskaber for virtuelle maskiner.
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