Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Verwenden Sie das Enterprise-Expositionsdiagramm in Microsoft Security Exposure Management, um proaktiv nach Bedrohungen für Unternehmen bei der erweiterten Suche im Microsoft Defender-Portal zu suchen.
Dieser Artikel enthält einige Beispiele, Tipps und Hinweise zum Erstellen von Abfragen im Enterprise Exposure Graph.
Voraussetzungen
- Erfahren Sie mehr über die Verwaltung der Angriffsfläche.
- Überprüfen Sie die erforderlichen Berechtigungen für die Arbeit mit dem Graphen.
Erstellen erweiterter Suchabfragen
- Überprüfen bewährter Methoden zum Erstellen erweiterter Huntingabfragen
- Erste Schritte mit Kusto-Abfragesprache (KQL)
Verwenden des Make-Graph-Operators
Der Operator von make-graph Kusto lädt Knoten und Edgedaten in den Arbeitsspeicher.
- Da Kusto nur die spalten lädt, die verwendet werden, ist es nicht erforderlich, Spalten explizit auszuwählen.
- Die
NodePropertiesSpalte enthält jedoch alle Knoteninformationen und ist daher groß. - In den meisten Szenarien ist es hilfreich, nur die erforderlichen Informationen zu extrahieren, bevor sie in den
make-graphOperator eingespeist werden.
Beispiel
let FilteredNodes = ExposureGraphNodes
| extend ContainsSensetiveData = NodeProperties has "containsSensitiveData"
| project Id, ContainsSensetiveData, Label, EntityIds, Categories;
Edges
| make-graph SourceNodeId --> TargetNodeId with FilteredNodes on Id
..
Verwenden dynamischer Spalten und intelligenter Indizierung
NodeProperties und Categories sind dynamische Spalten.
- Kusto weiß, dass diese Spalten JSON-ähnliche Inhalte enthalten, und wendet eine intelligente Indizierung an.
- Allerdings verwenden nicht alle Kusto-Operatoren den Index. Verwenden Sie z. B
set_has_elementisemptyisnotnull. , nicht den Index, wenn sie auf eine dynamische Spalte angewendet werden, undisnotnull(Properties["containsSensitiveData"]verwenden Sie nicht den Index. - Verwenden Sie stattdessen den
has()-Operator, der immer den Index verwendet.
Beispiel
In der folgenden Abfrage sucht der has Operator nach der data Zeichenfolge und set_has_element nach dem data -Element.
Die Verwendung beider Operatoren ist wichtig, da der has() Operator auch für eine Kategorie prefix_datatrue zurückgibt.
Categories has('data') and set_has_element(Categories, 'data')
Erfahren Sie mehr über das Verständnis von Zeichenfolgenbegriffen.
Beispielabfragen für die Belichtung
Die folgenden Beispiele können Ihnen helfen, Abfragen zu schreiben, um die Sicherheitsrisikodaten in Ihrem Mandanten zu verstehen.
Auflisten aller Knotenbezeichnungen in Ihrem Mandanten
Die folgende Abfrage gruppiert die Daten in der ExposureGraphNodes Tabelle und verwendet den Kusto-Operator summarize , um sie nach NodeLabelaufzulisten.
ExposureGraphNodes
| summarize by NodeLabel
Auflisten aller Edgebezeichnungen in Ihrem Mandanten
Die folgende Abfrage gruppiert die Daten in der ExposureGraphEdges Tabelle und verwendet den Kusto-Operator summarize , um sie nach Edgebeschriftungen (EdgeLabel) aufzulisten.
ExposureGraphEdges
| summarize by EdgeLabel
Auflisten aller Verbindungen von einer angegebenen Knotenbezeichnung
Die folgende Abfrage gruppiert die Daten in der ExposureGraphEdges Tabelle, wobei die Quellknotenbezeichnung ist microsoft.compute/virtualmachines, und fasst die des virtuellen Computers nach EdgeLabelzusammen. Es fasst die Kanten zusammen, die Ressourcen mit virtuellen Computern in Ihrem Sicherheitsrisikodiagramm verbinden.
ExposureGraphEdges
| where SourceNodeLabel == "microsoft.compute/virtualmachines"
| summarize by EdgeLabel
Auflisten aller Verbindungen mit einer bestimmten Knotenbezeichnung
Die folgende Abfrage fasst Edges zusammen, die virtuelle Computer mit anderen Sicherheitsrisiko-Graphressourcen verbinden. Sie gruppiert die Daten in der ExposureGraphEdges Tabelle, und wenn die Zielknotenbezeichnung ist microsoft.compute/virtualmachines, wird der Kusto-Operator summarize verwendet, um die Zielknotenbezeichnung nach EdgeLabelaufzulisten.
ExposureGraphEdges
| where TargetNodeLabel == "microsoft.compute/virtualmachines"
| summarize by EdgeLabel
Auflisten der Eigenschaften einer bestimmten Knotenbezeichnung
Die folgende Abfrage listet die Eigenschaften der Knotenbezeichnung des virtuellen Computers auf. Es gruppiert die Daten in der ExposureGraphNodes Tabelle, gefiltert, um nur die Ergebnisse der Knotenbezeichnung "microsoft.compute/virtualmachines" anzuzeigen. Mit dem project-keep -Operator behält die Abfrage die NodeProperties Spalte bei. Die zurückgegebenen Daten sind auf eine Zeile beschränkt.
ExposureGraphNodes
| where NodeLabel == "microsoft.compute/virtualmachines"
| project-keep NodeProperties
| take 1
Abfragen des Belichtungsdiagramms
So fragen Sie das Belichtungsdiagramm ab:
Wählen Sie im Microsoft Defender-PortalHunting –> Erweiterte Suche aus.
Geben Sie im Bereich Abfrage Ihre Abfrage ein. Verwenden Sie die Diagrammschema-, Funktions- und Operatortabellen oder die folgenden Beispiele, um Ihre Abfrage zu erstellen.
Wählen Sie Abfrage ausführen aus.
Beispiele für graphorientierte Abfragen
Verwenden Sie diese graphorientierten Abfragebeispiele, um Abfragen mit höherer Sicherheitsrisiko zu schreiben. Die Beispiele suchen nach Mustern, um Beziehungen zwischen Entitäten verfügbar zu machen, die Risiken aufdecken können. Sie zeigen Ihnen, wie Sie den Kontext mit Incident-/Warnungssignalen korrelieren.
Auflisten aller Knotenbezeichnungen mit einer Kante zu einer bestimmten Knotenbezeichnung
Die folgende Abfrage führt zu einer Liste aller eingehenden Knotenbezeichnungen mit einem Connector für die Knotenbezeichnung des virtuellen Computers. Es erstellt eine Graphstruktur, indem die SourceNodeId Spaltendaten in der ExposureGraphEdges Tabelle der Spalte in der TargetNodeIdExposureGraphNodes Tabelle mit dem make-graph Operator zugeordnet werden, um eine Graphstruktur zu erstellen.
Anschließend wird der graph-match -Operator verwendet, um ein Diagrammmuster zu erstellen, bei dem der Zielknoten TargetNode und NodeLabel übereinstimmen microsoft.compute/virtualmachines. Der project -Operator wird verwendet, um nur die IncomingNodeLabelsbeizubehalten. Die Ergebnisse werden nach aufgelistet 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
Auflisten aller Knotenbezeichnungen, die eine bestimmte Knotenbezeichnung edieren
Die folgende Abfrage führt zu einer Liste aller ausgehenden Knotenbezeichnungen mit einem Connector für die Knotenbezeichnung des virtuellen Computers.
- Es erstellt eine Graphstruktur, indem die Spalte, die
SourceNodeIddie Daten in derExposureGraphEdgesTabelle verwendet, derTargetNodeIdSpalte in derExposureGraphNodesTabelle zugeordnet wird, wobei dermake-graph-Operator verwendet wird, um eine Graphstruktur zu erstellen. - Anschließend wird der
graph-match-Operator verwendet, um das Diagrammmuster abzugleichen, in demSourceNodeundNodeLabelübereinstimmenmicrosoft.compute/virtualmachines. - Der
project-Operator wird verwendet, um nur dieOutgoingNodeLabelsbeizubehalten. Die Ergebnisse werden nach aufgelistetOutgoingNodeLabels.
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
Ermitteln von VMs, die im Internet mit einem RCE-Sicherheitsrisiko verfügbar gemacht werden
Mit der folgenden Abfrage können Sie virtuelle Computer ermitteln, die für das Internet und eine RcE-Sicherheitslücke (Remote Code Execution, Remotecodeausführung) verfügbar sind.
- Sie verwendet die
ExposureGraphNodesSchematabelle. - Wenn sowohl als
vulnerableToRCEauchNodePropertiesexposedToInternettrue sind, wird überprüft, ob die Kategorie (Categories) virtuelle Computer (virtual_machine) ist.
ExposureGraphNodes
| where isnotnull(NodeProperties.rawData.exposedToInternet)
| where isnotnull(NodeProperties.rawData.vulnerableToRCE)
| where Categories has "virtual_machine" and set_has_element(Categories, "virtual_machine")
Ermitteln von Geräten mit Internetzugriff mit einem Sicherheitsrisiko bei der Rechteausweitung
Die folgende Abfrage sucht nach Geräten mit Internetzugriff, die einem Sicherheitsrisiko aufgrund einer Berechtigungsausweitung ausgesetzt sind, die den Zugriff auf Berechtigungen auf höherer Ebene innerhalb des Systems ermöglichen könnte.
- Sie verwendet die
ExposureGraphNodesSchematabelle. - Wenn
NodePropertiessowohl mit dem Internet (IsInternetFacing)VulnerableToPrivilegeEscalationals auch ist, überprüft die Abfrage, ob die Elemente inCategoriestatsächlich Geräte (device) sind.
ExposureGraphNodes
| where isnotnull(NodeProperties.rawData.IsInternetFacing)
| where isnotnull(NodeProperties.rawData.VulnerableToPrivilegeEscalation)
| where set_has_element(Categories, "device")
Anzeigen aller Benutzer, die bei mehr als einem kritischen Gerät angemeldet sind
Diese Abfrage führt zu einer Liste von Benutzern, die bei mehr als einem kritischen Gerät angemeldet sind, zusammen mit der Anzahl der Geräte, bei denen sie angemeldet sind.
- Es erstellt eine
IdentitiesAndCriticalDevicesTabelle mithilfe vonExposureGraphNodesDaten, die entweder nach Geräten mit einer Wichtigkeitsstufe über 4 oder nach gefiltert werdenidentity. - Anschließend wird eine Graphstruktur mit dem
make-graph-Operator erstellt, wobei istEdgeLabelCan Authenticate As. - Es verwendet den
graph-match-Operator, um Instanzen abzugleichen, bei denen eindevicemit übereinstimmtidentity. - Anschließend wird der
projectOperator verwendet, um Identitäts-IDs und Geräte-IDs beizubehalten. - Der
mv-applyOperator filtert Geräte-IDs und Identitäts-IDs nach Typ. Sie fasst sie zusammen und zeigt die Ergebnisse in einer Tabelle mit den Überschriften ,Number Of devices user is logged-in toundUser Idan.
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
Anzeigen von Clientgeräten mit einer kritischen Sicherheitslücke/Benutzern, die Zugriff auf server mit hohem Wert haben
Die folgende Abfrage führt zu einer Liste von Geräten mit RCE-Sicherheitsrisiken und deren Geräte-IDs sowie Geräten mit hohen kritischen Sicherheitsrisiken und deren Geräte-IDs.
- Es wird eine
IdentitiesAndCriticalDevicesTabelle erstellt, die Geräte (device) mit RCE-Sicherheitsrisiken mit einer Wichtigkeit von weniger als vier und Identitäten (identity) enthält, die geräte mit kritischen Sicherheitsrisiken durch Filterung und Musterabgleich anzeigen. - Die Liste wird so gefiltert, dass nur die Verbindungen angezeigt werden, die Edgebeschriftungen
Can Authenticate Asund aufweisenCanRemoteInteractiveLogonTo.
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
Bereitstellen aller Pfade von einer bestimmten Knoten-ID zu einem Knoten mit einer bestimmten Bezeichnung
Diese Abfrage zeigt den Pfad von einem bestimmten IP-Knoten an und durchläuft bis zu drei Ressourcen, die zu einer Verbindung mit der Vm-Knotenbezeichnung führen.
- Es verwendet die
ExposureGraphNodesSchematabellen undExposureGraphEdgesdiemake-graphOperatoren undgraph-match, um eine Graphstruktur zu erstellen. - Mit dem
projectOperator wird eine Liste der IP-IDs, IP-Eigenschaften, VM-IDs und VM-Eigenschaften angezeigt.
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