AntonioDiaz - stock.adobe.com

Kusto Query Language: Was Admins wissen müssen

Admins, die Microsoft Cloud-Dienste wie Microsoft Sentinel und Microsoft 365 nutzen, rufen mit KQL-Abfragen Informationen aus diesen Produkten ab. Wir erklären, wie das geht.

Es kann schwierig sein, Daten aus Microsoft-Cloud-Diensten zu durchsuchen. Die Kusto Query Language (KQL) erleichtert Ihnen das Aufspüren der gewünschten Informationen; dazu müssen Sie aber erst einmal lernen, diese zu verwenden.

KQL erlaubt schreibgeschützte Abfragen zum Verarbeiten und Zurückgeben von Daten aus einer Datenbank. Kusto Query Language erstellt komplexe analytische Abfragen und bietet eine hervorragende Leistung bei der Datenabfrage. Kusto Query Language wurde für die Cloud entwickelt, insbesondere für große Datensätze. Als IT- oder Sicherheitsadministrator ist es wichtig, dass Sie eine Abfragesprache für das Untersuchen von Protokollen, Problemen und Sicherheitsbedrohungen verstehen und verwenden.

Warum sollten Administratoren die Kusto Abfragesprache lernen?

Im Vergleich zu anderen Abfragesprachen für das Sicherheitsinformations- und Ereignismanagement kann Kusto Query Language die gleichen Ergebnisse liefern, aber viel schneller. Mit der Kusto Query Language fragen Sie die verschiedenen Daten und Tabellen in der Azure Cloud ab, um sie zu analysieren oder fortgeschrittenere Arbeiten durchzuführen, wie zum Beispiel das Einrichten von Automatisierungsroutinen, um Warnungen auf der Grundlage bestimmter KQL-Abfrageergebnisse zu senden.

KQL ist somit insbesondere für Azure-Administratoren wichtig, die mit Diensten wie Azure Logic Apps, Microsoft Sentinel, Azure Log Analytics, Microsoft Defender, Azure AD Identity Protection und Microsoft 365 arbeiten.

Wie unterscheidet sich Kusto Query Language von PowerShell?

PowerShell ist eine vollwertige, plattformübergreifende Programmier- und Skriptsprache, während Kusto Query Language eine Abfragesprache für große Datensätze ist. PowerShell kann zwar ebenfalls Daten abfragen, ist aber im Allgemeinen an die Art der Daten oder der Hosting-Anwendung gebunden und erfordert oft zusätzliche Module, um mit bestimmten Datentypen zu arbeiten.

Kusto Query Language lässt sich in bestimmte Anwendungen einbinden, was ihre Verwendung auf diese Produkte beschränkt. Im Gegensatz dazu führt PowerShell häufig Abfragen in jeder Anwendung mit den zugehörigen Modulen oder Endpunkten durch.

Es gibt zwei Möglichkeiten, KQL-Abfragen innerhalb von PowerShell auszuführen: mit den Azure Data Explorer.NET-Client-Bibliotheken direkt in PowerShell oder mit standardmäßigen Azure-PowerShell-Befehlen durch Ausführen der erforderlichen Abfrage innerhalb von PowerShell.

Was sind einige KQL-Abfrage-Tools?

Es gibt mehrere Tools, die KQL-Abfragen unterstützen. Jedes von ihnen unterscheidet sich leicht in der Art und Weise, wie es eine Verbindung zu den unterstützten Daten herstellt, wobei einige importierte oder vom Benutzer erstellte Datenbanken unterstützen und andere speziell auf Protokoll- und Sicherheitsinformationen ausgerichtet sind.

Die gängigsten Tools sind die folgenden:

Tools wie Azure Data Explorer und Azure-Ressourcendiagramm-Explorer arbeiten innerhalb von Azure-Service-Informationsprotokollen oder Datenbanken in einem Azure Data Explorer-Cluster.

Um große Datensätze abzufragen, die in einem Datencluster gespeichert sind, verwenden Sie Azure Data Explorer, Azure.CLI und Kusto.Explorer.

Für Abfragen in Azure-Ressourcen, Azure- oder Microsoft-365-Sicherheitsinformationen verwenden Sie den Azure-Ressourcendiagramm-Explorer oder das in die Anwendung integrierte Kusto Query Language Tooling.

Was sind die Grundlagen der Kusto Query Language?

Eine KQL-Abfrage besteht aus einer Folge von begrenzten Anweisungen. Es gibt drei Arten von Abfrageanweisungen:

  • Anweisungen mit tabellarischen Ausdrücken
  • let-Anweisungen
  • set-Anweisungen

KQL-Abfrageanweisungen funktionieren wie ein Trichter: Sie beginnen mit einem großen Datensatz und lassen ihn durch mehrere Operatoren laufen, bis er gefiltert, zusammengefasst oder nach Bedarf neu angeordnet ist. Alle Abfragetypen müssen ein Semikolon als Trennzeichen zwischen den Anweisungen und eine Pipe für den Datenfluss zur folgenden Anweisung verwenden. Die häufigste Anweisung ist der tabellarische Ausdruck, bei dem sowohl die Eingabe als auch die Ausgabe Tabellen oder ein tabellarischer Datensatz sind.

Der einfachste Weg, KQL-Abfragen zu verstehen, ist, eine SQL-Anweisung umzuwandeln. Ein KQL-Beispiel folgt auf ein einfaches Beispiel für eine SQL-Anweisung:

# SQL Statement
SELECT * FROM Sales WHERE Manager = 'James Brown'
# KQL Statement
Sales
| where Manager == 'James Brown'

Eine KQL-Abfrage enthält die Datenbanktabelle, Pipe-Befehle zur Trennung von Filtern und Ergebnissen. Eine Abfrage verwendet meist mehrere Filter, um frühere Ergebnisse weiter abzufragen, bis Sie herausfinden, was Sie brauchen. KQL unterstützt verschiedene Arten von Filtern, von der grundlegenden WHERE-Klausel bis zu UNION, SEARCH, RANGE, PRINT und vielen anderen.

Die WHERE-Klausel ist die gebräuchlichste Art, Daten zu filtern. Um diese Filter zu erstellen, können Sie jedoch den Befehl SEARCH verwenden.

Für diesen Artikel nutzen wir die von Microsoft bereitgestellten Beispieldaten zu Sturmereignissen, die unter diesem Link verfügbar sind.

Um nach bestimmten Bundesstaaten zu filtern, führen Sie einen SEARCH-Befehl aus, um zu prüfen, ob sie existieren:

search "alaska"
search "michigan"
search "california"

Sie können mehrere Werte mit den Operatoren AND und OR kombinieren:

search "alaska" and ("michigan" or "california")

Der Befehl SEARCH arbeitet mit bestimmten Spalten, um die Daten zu filtern:

search State: "alaska" and EventType: "winter storm"
search State: "alaska" or EventType: "winter storm"

Die obigen Abfragen liefern unterschiedliche Ergebnisse: Die erste gibt einen einzigen Wert zurück, die zweite liefert 3.270 Ergebnisse. Jede Anweisung kann auch den Pipe-Operator verwenden, um die vorherigen Ergebnisse direkt zu übergeben. Die Ergebnisse ändern sich für diese Abfrage und geben ein einziges Ergebnis zurück. Die Pipe-Befehle funktionieren wie OR-Operatoren:

StormEvents
| search State:"alaska"
| search EventType: "winter storm"

Daneben funktionieren auch alle Anweisungen mit Standardfunktionen, die es in vielen Programmier- und Skriptsprachen gibt. Wenn Sie zum Beispiel mit String-Werten arbeiten, können Sie Folgendes verwenden:

  • ==
  • has
  • contains
  • startswith
  • endswith
  • matches regex

Bei der Arbeit mit Zahlen und Daten verwenden Sie alle gängigen Vergleichsoperatoren:

  • ==
  • !=
  • <
  • >
  • <=
  • >=

Außerdem funktionieren leere Prädikate, wie isempty(), notempty(), isnull() und notnull() in KQL.

Andere Funktionen helfen bei der Zusammenfassung von Spaltendaten, zum Beispiel beim Zählen von Werten, Suchen innerhalb von Werten, Kombinieren von Werten und Erstellen von Diagrammen:

StormEvents
| where State in ("TEXAS", "NEBRASKA", "HAWAII")
| where Source in ("Newspaper", "Emergency Manager", "Amateur Radio", "Storm Chaser")
| summarize count() by Source, State

Schließlich verknüpft KQL auch bestimmte Werte, um einen eindeutigen Datensatz auf der Grundlage bestimmter Spaltenwerte zu erstellen:

StormEvents
| where EventType == "Heavy Snow"
| join (
    StormEvents
    | where EventType == "Hail"
) on State
| distinct State

Der RENDER-Operator bestimmt, wie die Daten zurückgegeben werden sollen.

Abbildung 1: Der Operator KQL RENDER bestimmt die Art der gewünschten Visualisierung, zum Beispiel ein Zeitdiagramm (timechart).
Abbildung 1: Der Operator KQL RENDER bestimmt die Art der gewünschten Visualisierung, zum Beispiel ein Zeitdiagramm (timechart).

Wie verwenden Sie die KQL-Tools für das Arbeiten mit Daten?

Nachdem die Daten gefiltert und abgefragt wurden, exportieren Sie sie je nach Anwendung oder Skriptsprache in das gewünschte Format. Azure Data Explorer bietet eine einfache Option zum Exportieren in CSV innerhalb der Benutzeroberfläche.

Die Anwendung Kusto.Explorer enthält auch eine Reihe von Exportoptionen, wie CSV, JSON, Text und Excel.

Kusto.CLI exportiert Ergebnisse mit dem clientseitigen Befehl #save zu einem definierten Format und Speicherort:

Kusto.Cli.exe "https://help.kusto.windows.net/Samples;Fed=true" -execute:"#save C:\Exports\StormEvents.log" -execute:"StormEvents | search EventType: 'winter storm'"

Azure Ressourcendiagramm-Explorer stellt eine direkte Verbindung zu Ihrem Azure-Tenant und -Abonnement her. Er bietet auch Exportfunktionen für Abfragen.

Was sind einige Beispiele für KQL-Abfragen?

Wenn Sie viel Zeit damit verbringen, direkt in Azure oder Microsoft 365 zu arbeiten, werden Sie feststellen, dass fast alle Abfragemechanismen mittlerweile die Kusto Query Language verwenden. Sicherheitsprodukte wie Microsoft Sentinel, Azure Log Analytics und die Microsoft 365 Defender-Suiten setzen allesamt auf KQL.

Der Arbeitsablauf mit Kusto Query Language sieht folgendermaßen aus: Wählen Sie die Datenquelle, erstellen Sie einen Filter und exportieren Sie die Ergebnisse.

Wenn Sie beispielsweise alle Benutzeranmeldungen für einen bestimmten Zeitraum abfragen möchten, stellt Azure Log Analytics eine Verbindung zu Azure AD her, aus der Sie mit KQL die Tabelle SigninLogs auswählen. Als Nächstes definieren Sie Ihre Filter über Datum und Uhrzeit und legen dann die Ausgabe in eine Tabelle fest. Die endgültige Abfrage würde folgendermaßen aussehen:

SigninLogs
| where TimeGenerated between (datetime(2022-08-18) .. datetime(2022-09-12))
| summarize Logins=count() by UserPrincipalName
| order by UserPrincipalName asc

Um den Filter für dieselbe Anwendung zu verfeinern, ändern Sie die Abfrage wie folgt:

SigninLogs
| where TimeGenerated between (datetime(2022-08-18) .. datetime(2022-09-12))
| where LocationDetails contains "Virginia"
| where AuthenticationRequirement =~ 'singleFactorAuthentication'
| where UserDisplayName =~ "Liam Cleary"
| where AppDisplayName =~ "Azure Portal"
| project UserId, UserPrincipalName, UserType, Location

Jede Ebene filtert die Ergebnisse weiter, bis Sie den oder die gewünschten Datensätze erhalten.

Sie greifen auf demselben Weg auf dieselben Daten zu, die in anderen Diensten gespeichert sind. Die Abfragestruktur ist die gleiche, wenn Sie mit Sicherheitsinformationen aus Microsoft Sentinel arbeiten. Die folgende Abfrage überprüft zum Beispiel alle erfolgreichen Benutzeranmeldungen der letzten drei Stunden aus Virginia:

SecurityEvent
| where TimeGenerated > ago (3h)
| where LocationInformation has ("Virginia")
| where EventID == 4624
| summarize count() by Account
| order by Account asc

Um tiefer zu gehen und die laufenden Prozesse der letzten 10 Tage zu untersuchen, verbinden Sie mehrere Befehle mit dem Operator LET. Damit definieren Sie Variablen und erstellen ein Diagramm aus verschiedenen Abfragen:

let Processes = SecurityEvent

| where TimeGenerated > ago(10d)

| where EventID == "4688";

let TopProcesses = Processes

| summarize count() by Process

| top 10 by count_;

Processes

| where Process in (TopProcesses)

| summarize count() by bin (TimeGenerated, 3h), Process

| render timechart

Abbildung 2: Eine exportierte KQL-Abfrage zeigt die Ergebnisse innerhalb zehn festgelegter Tage an.
Abbildung 2: Eine exportierte KQL-Abfrage zeigt die Ergebnisse innerhalb zehn festgelegter Tage an.

Warum Sie Kusto Query Language lernen sollten

Die Kusto Query Language entwickelt sich schnell zum De-facto-Standard für die Abfrage von Protokollen und Analysen sowohl in Azure als auch in Microsoft 365. Die Abfragen sehen anfangs komplex aus, sind aber recht einfach zu erstellen und lassen sich flexibel einstellen.

Erfahren Sie mehr über Cloud Computing