graph_exposure_perimeter_fl()
Gilt für: ✅Microsoft Fabric✅Azure Data Explorer✅Azure Monitor✅Microsoft Sentinel
Berechnen Des Belichtungsperimeters (Liste und Bewertung) von Zielknoten über Pfad- oder Edgedaten.
Die Funktion graph_exposure_perimeter_fl()
ist eine UDF (benutzerdefinierte Funktion), mit der der Belichtungsperimeter der einzelnen Zielknoten basierend auf Pfad- oder Kantendaten berechnet werden kann. Jede Zeile mit Eingabedaten enthält einen Quellknoten und einen Zielknoten, der direkte Verbindungen (Kanten) zwischen Knoten und Zielen oder längere Multi-Hop-Pfade zwischen ihnen darstellen kann. Wenn die Pfade nicht verfügbar sind, können sie zuerst mithilfe graph-match() Operator oder graph_path_discovery_fl()-Funktion ermittelt werden. Anschließend kann graph_exposure_perimeter_fl()
über der Ausgabe der Pfadermittlung ausgeführt werden.
Der Belichtungsperimeter stellt die Barrierefreiheit eines bestimmten Ziels von relevanten Quellknoten dar. Je mehr Quellen auf das Ziel zugreifen können, desto mehr wird es potenziellen Kompromittierung durch den Angreifer zugänglich gemacht – daher der Name. Knoten mit hohem Expositionsperimeter sind aufgrund der Wahrscheinlichkeit wichtig, dass sie aufgrund der Wahrscheinlichkeit, dass sie ungesetzlich erreicht werden und von Angreifern sehr geschätzt werden. Daher sollten Knoten mit hohem Expositionsperimeter entsprechend geschützt werden - hinsichtlich der Härtung und Überwachung ihres Perimeters.
Die Funktion gibt eine Liste der verbundenen Quellen aus, die jedes Ziel erreichen können, und eine Bewertung, die die Anzahl der Quellen darstellt. Falls für jede Quelle ein aussagekräftiges "Gewicht" vorhanden ist (z. B. Sicherheitsanfälligkeit oder Exponentität), wird eine gewichtete Bewertung als Summe der Quellgewichte berechnet. Darüber hinaus werden die Grenzwerte für die maximale Gesamtanzahl der angezeigten Ziele und die maximale Anzahl von Quellen in jeder Liste als optionale Parameter für eine bessere Kontrolle verfügbar gemacht.
Syntax
graph_exposure_perimeter_fl(
sourceIdColumnName, targetIdColumnName, [sourceWeightColumnName], [resultCountLimit], [listedIdsLimit])
Erfahren Sie mehr über Syntaxkonventionen.
Parameter
Name | Art | Erforderlich | Beschreibung |
---|---|---|---|
sourceIdColumnName- | string |
✔️ | Der Name der Spalte mit den Quellknoten-IDs (entweder für Ränder oder Pfade). |
targetIdColumnName- | string |
✔️ | Der Name der Spalte, die die Zielknoten-IDs (entweder für Kanten oder Pfade) enthält. |
sourceWeightColumnName- | string |
Der Name der Spalte, die die Gewichtungen der Quellknoten (z. B. Sicherheitsanfälligkeit) enthält. Wenn keine relevanten Gewichtungen vorhanden sind, ist die gewichtete Bewertung gleich 0. Der Standardspaltenname lautet "noWeightsColumn". | |
resultCountLimit- | long |
Die maximale Anzahl zurückgegebener Zeilen (sortiert nach absteigender Bewertung). Der Standardwert ist 100000. | |
listedIdsLimit- | long |
Die maximale Anzahl von Zielen, die für jede Quelle aufgeführt sind. Der Standardwert ist 50. |
Funktionsdefinition
Sie können die Funktion definieren, indem Sie den Code entweder als abfragedefinierte Funktion einbetten oder wie folgt als gespeicherte Funktion in Ihrer Datenbank erstellen:
Definieren Sie die Funktion mithilfe der folgenden let-Anweisung. Es sind keine Berechtigungen erforderlich.
Wichtig
Eine anweisung zulassen, nicht eigenständig ausgeführt werden kann. Darauf muss eine tabellarische Ausdrucksanweisungfolgen. Informationen zum Ausführen eines funktionierenden Beispiels für graph_exposure_perimeter_fl()
finden Sie unter Beispiel.
let exposure_perimeter_fl = (T:(*), sourceIdColumnName:string, targetIdColumnName:string, sourceWeightColumnName:string= 'noWeightsColumn'
, resultCountLimit:long = 100000, listedIdsLimit:long = 50)
{
let paths = (
T
| extend sourceId = column_ifexists(sourceIdColumnName, '')
| extend targetId = column_ifexists(targetIdColumnName, '')
| extend sourceWeight = tolong(column_ifexists(sourceWeightColumnName, 0))
);
let aggregatedPaths = (
paths
| sort by targetId, sourceWeight desc
| summarize exposurePerimeterList = array_slice(make_set_if(sourceId, isnotempty(sourceId)), 0, (listedIdsLimit - 1))
, exposurePerimeterScore = dcountif(sourceId, isnotempty(sourceId))
, exposurePerimeterScoreWeighted = sum(sourceWeight)
by targetId
| extend isExposurePerimeterCapped = (exposurePerimeterScore > listedIdsLimit)
);
aggregatedPaths
| top resultCountLimit by exposurePerimeterScore desc
};
// Write your query to use the function here.
Beispiel
Im folgenden Beispiel wird der Aufrufoperator verwendet, um die Funktion auszuführen.
Um eine abfragedefinierte Funktion zu verwenden, rufen Sie sie nach der definition der eingebetteten Funktion auf.
let connections = datatable (SourceNodeName:string, TargetNodeName:string, SourceNodeVulnerability:int)[
'vm-work-1', 'webapp-prd', 0,
'vm-custom', 'webapp-prd', 4,
'webapp-prd', 'vm-custom', 1,
'webapp-prd', 'test-machine', 1,
'vm-custom', 'server-0126', 4,
'vm-custom', 'hub_router', 4,
'webapp-prd', 'hub_router', 2,
'test-machine', 'vm-custom', 5,
'test-machine', 'hub_router', 5,
'hub_router', 'remote_DT', 0,
'vm-work-1', 'storage_main_backup', 0,
'hub_router', 'vm-work-2', 0,
'vm-work-2', 'backup_prc', 1,
'remote_DT', 'backup_prc', 2,
'backup_prc', 'storage_main_backup', 0,
'backup_prc', 'storage_DevBox', 0,
'device_A1', 'sevice_B2', 1,
'sevice_B2', 'device_A1', 2
];
let exposure_perimeter_fl = (T:(*), sourceIdColumnName:string, targetIdColumnName:string, sourceWeightColumnName:string = 'noWeightsColumn'
, resultCountLimit:long = 100000, listedIdsLimit:long = 50)
{
let paths = (
T
| extend sourceId = column_ifexists(sourceIdColumnName, '')
| extend targetId = column_ifexists(targetIdColumnName, '')
| extend sourceWeight = tolong(column_ifexists(sourceWeightColumnName, 0))
);
let aggregatedPaths = (
paths
| sort by targetId, sourceWeight desc
| summarize exposurePerimeterList = array_slice(make_set_if(sourceId, isnotempty(sourceId)), 0, (listedIdsLimit - 1))
, exposurePerimeterScore = dcountif(sourceId, isnotempty(sourceId))
, exposurePerimeterScoreWeighted = sum(sourceWeight)
by targetId
| extend isExposurePerimeterCapped = (exposurePerimeterScore > listedIdsLimit)
);
aggregatedPaths
| top resultCountLimit by exposurePerimeterScore desc
};
connections
| invoke exposure_perimeter_fl(sourceIdColumnName = 'SourceNodeName'
, targetIdColumnName = 'TargetNodeName'
, sourceWeightColumnName = 'SourceNodeVulnerability'
)
Ausgabe-
targetId | exposurePerimeterList | exposurePerimeterScore | exposurePerimeterScoreWeighted | isExposurePerimeterCapped |
---|---|---|---|---|
hub_router | ["vm-custom","webapp-prd","test-machine"] | 3 | 11 | FALSCH |
storage_main_backup | ["vm-work-1";"backup_prc"] | 2 | 0 | FALSCH |
vm-custom | ["webapp-prd";"test-machine"] | 2 | 6 | FALSCH |
backup_prc | ["vm-work-2";"remote_DT"] | 2 | 3 | FALSCH |
webapp-prd | ["vm-work-1";"vm-custom"] | 2 | 4 | FALSCH |
Testcomputer | ["webapp-prd"] | 1 | 1 | FALSCH |
server-0126 | ["vm-custom"] | 1 | 4 | FALSCH |
remote_DT | ["hub_router"] | 1 | 0 | FALSCH |
vm-work-2 | ["hub_router"] | 1 | 0 | FALSCH |
storage_DevBox | ["backup_prc"] | 1 | 0 | FALSCH |
device_A1 | ["sevice_B2"] | 1 | 2 | FALSCH |
sevice_B2 | ["device_A1"] | 1 | 1 | FALSCH |
Das Ausführen der Funktion übernimmt die Verbindungen zwischen Quellen und Zielen und aggregiert die Quellen nach Ziel. Für jedes Ziel stellt der Belichtungsperimeter die Quellen dar, die eine Verbindung mit ihr als Bewertung (normal und gewichtet) und Liste herstellen können.
Jede Zeile in der Ausgabe enthält die folgenden Felder:
-
targetId
: ID des Zielknotens aus der relevanten Spalte. -
exposurePerimeterList
: eine Liste der Quellknoten-IDs (aus der relevanten Spalte), die eine Verbindung mit dem Zielknoten herstellen können. Die Liste ist auf die maximale Längenbeschränkung des parameters listedIdsLimit begrenzt. -
exposurePerimeterScore
: Die Bewertung ist die Anzahl der Quellknoten, die eine Verbindung mit dem Ziel herstellen können. Die High Exposure Perimeter Score gibt an, dass der Zielknoten potenziell aus vielen Quellen aufgerufen werden kann und entsprechend behandelt werden sollte. -
exposurePerimeterScoreWeighted
: Die gewichtete Bewertung ist die Summe der Gewichtungsspalte der optionalen Quellknoten, die ihren Wert darstellt , z. B. Sicherheitsanfälligkeit oder Exponentität. Wenn eine solche Gewichtung vorhanden ist, kann die Gewichtungsperimeterbewertung eine genauere Metrik des Zielknotenwerts sein, da potenzieller Zugriff von stark anfälligen oder verfügbar gemachten Quellen möglich ist. -
isExposurePerimeterCapped
: boolesche Kennzeichnung, ob die Liste der Quellen durch den parameter listedIdsLimit begrenzt wurde. Wenn dies der Fall ist, können andere Quellen zusätzlich zu den aufgelisteten auf das Ziel zugreifen (bis zur Anzahl der ExposurePerimeterScore).
Im obigen Beispiel führen wir die graph_exposure_perimeter_fl()
-Funktion über Verbindungen zwischen Quellen und Zielen aus. In der ersten Zeile der Ausgabe können wir sehen, dass der Zielknoten "hub_router" aus drei Quellen verbunden werden kann ('vm-custom', 'webapp-prd', 'test-machine'). Wir verwenden die Spalte "SourceNodeVulnerability" als Quellgewichtung und erhalten eine kumulierte Gewichtung von 11. Da die Anzahl der Quellen 3 ist und der Standardlistengrenzwert 50 ist, werden alle Quellen angezeigt , sodass der Wert der Spalte "isExposurePerimeterCapped" FALSCH ist.
Falls die Multi-Hop-Pfade nicht verfügbar sind, können wir Multi-Hop-Pfade zwischen Quellen und Zielen erstellen (z. B. indem sie "graph_path_discovery_fl()" ausführen und "graph_exposure_perimeter_fl()" über den Ergebnissen ausführen.
Die Ausgabe sieht ähnlich aus, spiegelt jedoch den Belichtungsperimeter wider, der über Multi-Hop-Pfade berechnet wird und somit ein besserer Indikator für zielknoten echte Barrierefreiheit aus relevanten Quellen ist. Um die vollständigen Pfade zwischen Quell- und Zielszenarien (z. B. für Unterbrechungen) zu finden, können graph_path_discovery_fl() Funktion mit Filtern auf relevanten Quell- und Zielknoten verwendet werden.
Die Funktion graph_exposure_perimeter_fl()
kann verwendet werden, um den Belichtungsperimeter von Zielknoten zu berechnen, entweder über direkte Kanten oder längere Pfade. In der Cybersicherheitsdomäne kann sie für mehrere Erkenntnisse verwendet werden. Die Bewertungen des Expositionsperimeters (normal und gewichtet) stellen die Wichtigkeit des Zielknotens sowohl aus Verteidiger- als auch aus Angreiferperspektiven dar. Knoten mit hohem Expositionsperimeter (besonders kritisch) sollten entsprechend geschützt werden (z. B. hinsichtlich der Zugriffsüberwachung und -härtung); Sicherheitssignale (z. B. Warnungen) für Quellen, die auf diese Knoten zugreifen können, sollten priorisiert werden. Die Liste der Belichtungsperimeter sollte auf unerwünschte Verbindungen zwischen Quellen und Zielen überwacht und in Unterbrechungsszenarien verwendet werden (z. B. wenn eine aktive Kompromittierung einer der Quellen aufgetreten ist, sollten Verbindungen zwischen diesem und dem wichtigen Ziel unterbrochen werden).