Een query uitvoeren op de grafiek van de ondernemingsblootstelling
Gebruik de ondernemingsblootstellingsgrafiek in Microsoft Security Exposure Management om proactief te zoeken naar bedreigingen voor bedrijfsblootstelling tijdens geavanceerde opsporing in de Microsoft Defender-portal.
Dit artikel bevat enkele voorbeelden, tips en hints voor het maken van query's in de blootstellingsgrafiek van de onderneming.
Security Exposure Management is momenteel in openbare preview.
Belangrijk
Sommige informatie in dit artikel heeft betrekking op een vooraf uitgebracht product dat aanzienlijk kan worden gewijzigd voordat het commercieel wordt uitgebracht. Microsoft geeft geen garanties, expliciet of impliciet, met betrekking tot de informatie die hier wordt verstrekt.
Voorwaarden
- Lees meer over kwetsbaarheidsbeheer voor aanvallen.
- Controleer de vereiste machtigingen voor het werken met de grafiek.
Geavanceerde opsporingsquery's bouwen
- Best practices voor het maken van geavanceerde opsporingsquery's bekijken
- Aan de slag met Kusto Query Language (KQL)
De operator grafiek maken gebruiken
De operator van make-graph
Kusto laadt knooppunten en randen in het geheugen.
- Omdat Kusto alleen de kolommen laadt die in gebruik zijn, hoeft u geen kolommen expliciet te selecteren.
- De kolom bevat echter
NodeProperties
alle knooppuntgegevens en is dus groot. - In de meeste scenario's is het handig om alleen de benodigde informatie te extraheren voordat u deze in de
make-graph
operator invoert.
Voorbeeld
let FilteredNodes = ExposureGraphNodes
| extend ContainsSensetiveData = NodeProperties has "containsSensitiveData"
| project Id, ContainsSensetiveData, Label, EntityIds, Categories;
Edges
| make-graph SourceNodeId --> TargetNodeId with FilteredNodes on Id
..
Dynamische kolommen en slimme indexering gebruiken
NodeProperties
en Categories
dynamische kolommen zijn.
- Kusto weet dat deze kolommen json-achtige inhoud bevatten en past slimme indexering toe.
- Niet alle Kusto-operators gebruiken de index echter. Gebruik bijvoorbeeld
set_has_element
,isempty
isnotnull
de index niet wanneer deze worden toegepast op een dynamische kolom enisnotnull(Properties["containsSensitiveData"]
de index niet gebruikt. - Gebruik in plaats daarvan de
has()
operator, die altijd de index gebruikt.
Voorbeeld
In de volgende query controleert de has
operator op de data
tekenreeks en set_has_element
op het data
element.
Het gebruik van beide operatoren is belangrijk omdat de has()
operator zelfs waar retourneert voor een categorie prefix_data
.
Categories has('data') and set_has_element(Categories, 'data')
Meer informatie over het begrijpen van tekenreekstermen.
Voorbeeld van blootstellingsquery's
De volgende voorbeelden kunnen u helpen bij het schrijven van query's om inzicht te hebben in de beveiligingsblootstellingsgegevens in uw tenant.
Alle knooppuntlabels in uw tenant weergeven
Met de volgende query worden de gegevens in de ExposureGraphNodes
tabel gegroepeerd en wordt de operator van summarize
Kusto gebruikt om deze weer te geven op NodeLabel
.
ExposureGraphNodes
| summarize by NodeLabel
Alle randlabels in uw tenant weergeven
Met de volgende query worden de gegevens in de ExposureGraphEdges
tabel gegroepeerd en wordt de operator kusto summarize
gebruikt om deze weer te geven op randlabels (EdgeLabel
).
ExposureGraphEdges
| summarize by EdgeLabel
Alle verbindingen van een opgegeven knooppuntlabel weergeven
De volgende query groepeert de gegevens in de ExposureGraphEdges
tabel en waar het bronknooppuntlabel is, wordt microsoft.compute/virtualmachines
de virtuele machine samengevat op EdgeLabel
. Het geeft een overzicht van de randen die assets verbinden met virtuele machines in uw beveiligingsgrafiek.
ExposureGraphEdges
| where SourceNodeLabel == "microsoft.compute/virtualmachines"
| summarize by EdgeLabel
Alle verbindingen met een specifiek knooppuntlabel weergeven
De volgende query bevat een overzicht van randen die virtuele machines verbinden met andere grafiekassets voor beveiligingsblootstelling. De gegevens in de ExposureGraphEdges
tabel worden gegroepeerd en waar het doelknooppuntlabel is microsoft.compute/virtualmachines
, wordt de operator van summarize
Kusto gebruikt om het doelknooppuntlabel weer te geven op EdgeLabel
.
ExposureGraphEdges
| where TargetNodeLabel == "microsoft.compute/virtualmachines"
| summarize by EdgeLabel
Eigenschappen van een specifiek knooppuntlabel weergeven
De volgende query bevat de eigenschappen van het knooppuntlabel van de virtuele machine. De gegevens in de ExposureGraphNodes
tabel worden gegroepeerd en gefilterd om alleen de resultaten van het knooppuntlabel 'microsoft.compute/virtualmachines' weer te geven. Met de project-keep
operator behoudt de query de NodeProperties
kolom. De geretourneerde gegevens zijn beperkt tot één rij.
ExposureGraphNodes
| where NodeLabel == "microsoft.compute/virtualmachines"
| project-keep NodeProperties
| take 1
Query uitvoeren op de blootstellingsgrafiek
Ga als volgende te werk om een query uit te voeren op de blootstellingsgrafiek:
Selecteer opsporing -> geavanceerde opsporing in de Microsoft Defender-portal.
Typ uw query in het gebied Query. Gebruik het grafiekschema, functies en operatortabellen of de volgende voorbeelden om uw query te bouwen.
Selecteer Query uitvoeren.
Voorbeelden van graafgeoriënteerde query's
Gebruik deze grafiekgerichte queryvoorbeelden om u te helpen betere beveiligingsblootstellingsquery's te schrijven. De voorbeelden zoeken naar patronen om relaties tussen entiteiten beschikbaar te maken die risico's kunnen blootleggen. Ze laten zien hoe u context kunt correleren met incident-/waarschuwingssignalen.
Alle knooppuntlabels met een rand naar een specifiek knooppuntlabel weergeven
De volgende query resulteert in een lijst met alle binnenkomende knooppuntlabels met een connector naar het knooppuntlabel van de virtuele machine. Er wordt een grafiekstructuur gemaakt door de SourceNodeId
kolomgegevens in de ExposureGraphEdges
tabel toe te koppelen aan de TargetNodeId
kolom in de ExposureGraphNodes
tabel met de make-graph
operator om een grafiekstructuur te maken.
Vervolgens wordt de graph-match
operator gebruikt om een grafiekpatroon te maken waarin het doelknooppunt TargetNode
en NodeLabel
overeenkomen microsoft.compute/virtualmachines
. De project
operator wordt gebruikt om alleen de IncomingNodeLabels
te behouden. De resultaten worden weergegeven op 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
Alle knooppuntlabels weergeven met een specifiek knooppuntlabel
De volgende query resulteert in een lijst met alle uitgaande knooppuntlabels met een connector naar het knooppuntlabel van de virtuele machine.
- Er wordt een grafiekstructuur gemaakt door de
SourceNodeId
kolom toe te koppelen, waarbij de gegevens in deExposureGraphEdges
tabel worden gebruikt voor deTargetNodeId
kolom in deExposureGraphNodes
tabel met behulp van demake-graph
operator om een grafiekstructuur te maken. - Vervolgens wordt de
graph-match
operator gebruikt om het grafiekpatroon te vinden waarSourceNode
enNodeLabel
overeenkomt metmicrosoft.compute/virtualmachines
. - De
project
operator wordt gebruikt om alleen deOutgoingNodeLabels
te behouden. De resultaten worden weergegeven opOutgoingNodeLabels
.
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
Virtuele machines detecteren die zijn blootgesteld aan internet met een RCE-beveiligingsprobleem
Met de volgende query kunt u virtuele machines detecteren die worden blootgesteld aan internet en aan een beveiligingsprobleem met remote code execution (RCE).
- Hierbij wordt de
ExposureGraphNodes
schematabel gebruikt. - Wanneer beide
NodeProperties
exposedToInternet
envulnerableToRCE
waar zijn, wordt gecontroleerd of de categorie (Categories
) virtuele machines () is.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")
Internetgerichte apparaten met een kwetsbaarheid voor escalatie van bevoegdheden detecteren
Met de volgende query wordt gezocht naar internetgerichte apparaten die worden blootgesteld aan een beveiligingsprobleem met escalatie van bevoegdheden, waardoor toegang tot bevoegdheden op een hoger niveau binnen het systeem kan worden toegestaan.
- Hierbij wordt de
ExposureGraphNodes
schematabel gebruikt. - Wanneer
NodeProperties
zowel internetgericht (IsInternetFacing
) alsVulnerableToPrivilegeEscalation
, controleert de query of de items inCategories
daadwerkelijk apparaten () zijn.device
ExposureGraphNodes
| where isnotnull(NodeProperties.rawData.IsInternetFacing)
| where isnotnull(NodeProperties.rawData.VulnerableToPrivilegeEscalation)
| where set_has_element(Categories, "device")
Alle gebruikers weergeven die zijn aangemeld bij meer dan één kritiek apparaat
Deze query resulteert in een lijst met gebruikers die zijn aangemeld bij meer dan één kritiek apparaat, samen met het aantal apparaten waarop ze zijn aangemeld.
- Er wordt een
IdentitiesAndCriticalDevices
tabel gemaakt met behulp vanExposureGraphNodes
gegevens die zijn gefilterd op apparaten met een kritiek niveau hoger dan 4 of opidentity
. - Vervolgens wordt er een grafiekstructuur gemaakt met de
make-graph
operator, waarbij deEdgeLabel
isCan Authenticate As
. - De operator wordt gebruikt
graph-match
om exemplaren te vinden waarbij eendevice
overeenkomt met eenidentity
. - Vervolgens wordt de
project
operator gebruikt om identiteits-id's en apparaat-id's te bewaren. - De
mv-apply
operator filtert apparaat-id's en id's op type. Deze worden samengevat en de resultaten worden weergegeven in een tabel met de koptekstenNumber Of devices user is logged-in to
, enUser 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
Clientapparaten weergeven met een kritieke kwetsbaarheid/gebruikers die toegang hebben tot hoogwaardige servers
De volgende query resulteert in een lijst met apparaten met RCE-beveiligingsproblemen en hun apparaat-id's, en apparaten met zeer kritieke beveiligingsproblemen en hun apparaat-id's.
- Er wordt een
IdentitiesAndCriticalDevices
tabel gemaakt met apparaten (device
) met RCE-beveiligingsproblemen met een kritieke waarde van minder dan vier en identiteiten (identity
) die door middel van filteren en patroonkoppeling apparaten met kritieke beveiligingsproblemen weergeven. - De lijst wordt gefilterd om alleen de verbindingen weer te geven die randlabels
Can Authenticate As
hebben enCanRemoteInteractiveLogonTo
.
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
Geef alle paden op van een specifieke knooppunt-id naar een knooppunt met een specifiek label
Met deze query wordt het pad van een specifiek IP-knooppunt weergegeven, waarbij maximaal drie assets worden doorgegeven die leiden tot een verbinding met het knooppuntlabel van de virtuele machine.
- Hierbij worden de
ExposureGraphNodes
schematabellen enExposureGraphEdges
demake-graph
operators engraph-match
gebruikt om een grafiekstructuur te maken. - Met de
project
operator wordt een lijst met IP-id's, IP-eigenschappen, virtuele-machine-id's en eigenschappen van virtuele machines weergegeven.
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