Abfragen des Enterprise-Expositionsdiagramms
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
NodeProperties
Spalte 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-graph
Operator 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_element
isempty
isnotnull
. , 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_data
true 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 NodeLabel
aufzulisten.
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 EdgeLabel
zusammen. 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 EdgeLabel
aufzulisten.
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 TargetNodeId
ExposureGraphNodes
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 IncomingNodeLabels
beizubehalten. 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
SourceNodeId
die Daten in derExposureGraphEdges
Tabelle verwendet, derTargetNodeId
Spalte in derExposureGraphNodes
Tabelle 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 demSourceNode
undNodeLabel
übereinstimmenmicrosoft.compute/virtualmachines
. - Der
project
-Operator wird verwendet, um nur dieOutgoingNodeLabels
beizubehalten. 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
ExposureGraphNodes
Schematabelle. - Wenn sowohl als
vulnerableToRCE
auchNodeProperties
exposedToInternet
true 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
ExposureGraphNodes
Schematabelle. - Wenn
NodeProperties
sowohl mit dem Internet (IsInternetFacing
)VulnerableToPrivilegeEscalation
als auch ist, überprüft die Abfrage, ob die Elemente inCategories
tatsä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
IdentitiesAndCriticalDevices
Tabelle mithilfe vonExposureGraphNodes
Daten, 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 istEdgeLabel
Can Authenticate As
. - Es verwendet den
graph-match
-Operator, um Instanzen abzugleichen, bei denen eindevice
mit übereinstimmtidentity
. - Anschließend wird der
project
Operator verwendet, um Identitäts-IDs und Geräte-IDs beizubehalten. - Der
mv-apply
Operator 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 to
undUser Id
an.
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
IdentitiesAndCriticalDevices
Tabelle 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 As
und 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
ExposureGraphNodes
Schematabellen undExposureGraphEdges
diemake-graph
Operatoren undgraph-match
, um eine Graphstruktur zu erstellen. - Mit dem
project
Operator 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