Delen via


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

Geavanceerde opsporingsquery's bouwen

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, isemptyisnotnull de index niet wanneer deze worden toegepast op een dynamische kolom en isnotnull(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/virtualmachinesde 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:

  1. Selecteer opsporing -> geavanceerde opsporing in de Microsoft Defender-portal.

  2. Typ uw query in het gebied Query. Gebruik het grafiekschema, functies en operatortabellen of de volgende voorbeelden om uw query te bouwen.

  3. 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 IncomingNodeLabelste 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 de ExposureGraphEdges tabel worden gebruikt voor de TargetNodeId kolom in de ExposureGraphNodes tabel met behulp van de make-graph operator om een grafiekstructuur te maken.
  • Vervolgens wordt de graph-match operator gebruikt om het grafiekpatroon te vinden waar SourceNode en NodeLabel overeenkomt met microsoft.compute/virtualmachines.
  • De project operator wordt gebruikt om alleen de OutgoingNodeLabelste behouden. De resultaten worden weergegeven op 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

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 NodePropertiesexposedToInternet en vulnerableToRCE 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) als VulnerableToPrivilegeEscalation, controleert de query of de items in Categories 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 van ExposureGraphNodes gegevens die zijn gefilterd op apparaten met een kritiek niveau hoger dan 4 of op identity.
  • Vervolgens wordt er een grafiekstructuur gemaakt met de make-graph operator, waarbij de EdgeLabel is Can Authenticate As.
  • De operator wordt gebruikt graph-match om exemplaren te vinden waarbij een device overeenkomt met een identity.
  • 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 kopteksten Number Of devices user is logged-in to, en 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

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 en 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

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 en ExposureGraphEdges de make-graph operators en graph-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

Volgende stappen

Verkennen met de surface-kaart voor aanvallen.