Die REST-API verwenden

Im Rahmen von MDR ermöglicht die REST-API das Abrufen, Erstellen und Aktualisieren von Assets, Vorfällen, Reaktionen und Benutzern.

OPEN THE REST API REFERENCE

Die REST-API-Methoden erfordern einen Wert für die client_id. Sie können den Wert Ihrer client_id im Block Token-Info eines beliebigen Aktualisierungstokens in der MDR Web Console abrufen.

Im Folgenden sind Beispiele für Python- und Shell-Skripte aufgeführt, welche die Kernfunktionen der REST-API veranschaulichen:

Beispiel (Python):

###################################################

# Allgemeiner Teil

###################################################

 

import time

import datetime

import requests

import jwt

 

# Das Zertifikat wird für die Authentifizierung einer externen Ressource benötigt

# Sie können das Zertifikat von https://mdr.kaspersky.com herunterladen,

# es auf Ihrer Festplatte speichern und seinen Pfad der Variablen hinzufügen:

VERIFY_CERT_PATH = "C:\\tools\\DigiCert Global Root G2.crt"

 

# MDR REST API URL:

API_URL = "https://mdr.kaspersky.com/api/v1"

 

# ID Ihres Kunden und Ihres Tokens.

# Für Einzelheiten zum Abrufen Ihrer ID und der Token-ID siehe Hilfe https://support.kaspersky.com/MDR/de-DE/258285.htm

CLIENT_ID = "9ed43ed54sAmpleIdf349323951f" # (Fügen Sie Ihren Wert ein)

REFRESH_TOKEN = "ReFrEsHToKeN" # (Fügen Sie Ihren Wert ein)

ACCESS_TOKEN = "AcCeSsToKeN" # (Fügen Sie Ihren Wert ein)

 

 

###################################################

# Zugriffstoken und Aktualisierungstoken (refresh token) für das nächste Update des Zugriffstokens anfordern

###################################################

 

if REFRESH_TOKEN:

refresh_token_exp = jwt.decode(REFRESH_TOKEN, options={"verify_signature": False}).get("exp")

print(f"REFRESH_TOKEN: Ablaufdatum und -uhrzeit: {datetime.datetime.fromtimestamp(refresh_token_exp)}")

if refresh_token_exp > time.time():

print("REFRESH_TOKEN ist aktuell")

else:

print(

"Der REFRESH_TOKEN muss aktualisiert werden. Entnehmen Sie Ihn aus der MDR Console (https://support.kaspersky.com/MDR/de-DE/258285.htm)."

)

exit()

else:

print(

"Für den REFRESH_TOKEN muss ein Wert angegeben werden. Entnehmen Sie Ihn aus der MDR Console (https://support.kaspersky.com/MDR/de-DE/258285.htm)."

)

exit()

 

# Prüfung, ob ein Zugriffstoken (access token) vorhanden und gültig ist

need_update_access_token = False

if ACCESS_TOKEN:

access_token_exp = jwt.decode(ACCESS_TOKEN, options={"verify_signature": False}).get("exp")

print(f"ACCESS_TOKEN: Ablaufdatum und -uhrzeit: {datetime.datetime.fromtimestamp(access_token_exp)}")

if access_token_exp > time.time():

print("ACCESS_TOKEN ist aktuell")

else:

need_update_access_token = True

else:

need_update_access_token = True

 

# Bei Bedarf Zugriffs- und Refresh-Tokens für das nächste Update des Zugriffstokens aktualisieren

access_token = ACCESS_TOKEN

if need_update_access_token:

request_body = {"refresh_token": REFRESH_TOKEN}

result = requests.post(url=f"{API_URL}/{CLIENT_ID}/session/confirm", json=request_body, verify=VERIFY_CERT_PATH)

result_json = result.json()

 

if "error" in result_json:

print(result_json)

exit()

 

# Aktualisierungstoken muss gespeichert werden, um nach Ablauf des aktuellen Zugriffstokens den nächsten Zugriffstoken zu erhalten

refresh_token = result_json["refresh_token"]

print(

f'!!! Ihr neuer REFRESH_TOKEN für die nächste Anfrage ACCESS_TOKEN (ersetzen Sie den Wert für REFRESH_TOKEN durch diesen Wert): "{refresh_token}"'

)

 

# Neuer Zugriffstoken zum Datenabruf erforderlich

access_token = result_json["access_token"]

print(f'!!! Ihr neuer ACCESS_TOKEN (ersetzen Sie den Wert für ACCESS_TOKEN durch diesen Wert): "{access_token}"')

 

# Zugriffstoken zum Request-Header hinzufügen

headers = {"Authorization": f"Bearer {access_token}"}

 

 

###################################################

# Anzahl der Assets abrufen

###################################################

 

# Datum und Uhrzeit in Millisekunden seit 1970-01-01T00:00:00Z

request_body = {

"max_last_seen": int(time.time())

* 1000, # Maximale Zeit für das letzte Erscheinen des Assets auf die aktuelle Zeit beschränken

"min_last_seen": 1639311132000, # Minimale Zeit für das letzte Erscheinen des Assets mit einer Konstanten beschränken - Sonntag, 12. Dezember 2021 12:12:12 (GMT)

}

result = requests.post(

url=f"{API_URL}/{CLIENT_ID}/assets/count", json=request_body, headers=headers, verify=VERIFY_CERT_PATH

)

print(result.json())

 

 

###################################################

# Liste der Assets abrufen

###################################################

 

request_body = {

# Suchparameter:

"max_last_seen": int(time.time())

* 1000, # Maximale Zeit für das letzte Erscheinen des Assets auf die aktuelle Zeit beschränken

"min_last_seen": 1639311132000, # Minimale Zeit für das letzte Erscheinen des Assets mit einer Konstanten beschränken - Sonntag, 12. Dezember 2021 12:12:12 (GMT)

"domain": "",

"host_names": ["MA-MDR-KES-S", "SIN-MDR-KSC"], # (Fügen Sie Ihre Werte ein) Liste mit Hostnamen

"is_isolated": False,

"network_interface": "10.70.104.1",

"os_version": "Windows", # Betriebssystem-Name des Assets muss die angegebene enthalten

"product": "",

"search_phrase": "mdr", # Phrase zur Suche nach Feldwerten: "host_name", "domain", "installed_product_info", "network_interfaces", "os_version"

"statuses": ["OK", "ABSENT"], # Suche nach Assets mit hier angegebenen Statuswerten

# Optionen zur Anzeige von Suchergebnissen:

"sort": "first_seen:asc", # Ergebnisse nach Zeitpunkt des ersten Auftretens sortieren Beim seitenweisen Abrufen von Ergebnissen muss für die Sortierung ein Feld angegeben werden, das sich von Abfrage zu Abfrage nicht ändert, z. B. "first_seen" (Geben Sie keine Felder an, deren Werte sich permanent ändern, z. B. das Feld "last_seen" , da dies zu falschen Ergebnissen führen kann) .

"page_size": 100, # Assets pro Seite - 100

"page": 1, # Erste Seite der Suchergebnisse anzeigen

"version": 2, # Version der Lösung

}

result = requests.post(

url=f"{API_URL}/{CLIENT_ID}/assets/list", json=request_body, headers=headers, verify=VERIFY_CERT_PATH

)

print(result.json())

 

 

###################################################

# Asset-Details abrufen

###################################################

 

request_body = {

"asset_id": "0xFA6A68CC9A9415963DE841048A3BE929", # (Fügen Sie Ihren Wert ein) Asset-ID

"version": 2, # Version der Lösung

}

result = requests.post(

url=f"{API_URL}/{CLIENT_ID}/assets/details", json=request_body, headers=headers, verify=VERIFY_CERT_PATH

).json()

print(result)

 

 

###################################################

# Anzahl der Vorfälle abrufen

###################################################

 

request_body = {

"max_update_time": int(time.time())

* 1000, # Maximale Zeit des letzten Vorfall-Updates auf die aktuelle Zeit beschränken

"min_update_time": 1639311132000, # Minimale Zeit für das letzte Vorfall-Update mit einer Konstanten beschränken - Sonntag, 12. Dezember 2021 12:12:12 (GMT)

"affected_hosts": [

"MA-MDR-KES-S:0xFA6A68CC9A94145456E841048A3BE929"

], # (Fügen Sie Ihren Wert ein) Hostliste im "host_name:asset_id"-Format

}

result = requests.post(

url=f"{API_URL}/{CLIENT_ID}/incidents/count", json=request_body, headers=headers, verify=VERIFY_CERT_PATH

)

print(result.json())

 

 

###################################################

# Liste der Vorfälle abrufen

###################################################

 

request_body = {

# Suchparameter:

"max_creation_time": int(time.time())

* 1000, # Maximale Zeit für die Erstellung von Vorfällen auf die aktuelle Zeit beschränken

"min_update_time": 1639311132000, # Minimale Zeit für die Erstellung von Vorfällen mit einer Konstanten beschränken - Sonntag, 12. Dezember 2021 12:12:12 (GMT)

"asset_ids": [

"0xFA6A68CC9A9415963DE841048A3BE929"

], # (Fügen Sie Ihren Wert ein) Liste mit Assets, deren Vorfälle abgerufen werden sollen

"priorities": ["HIGH"],

"resolutions": ["True positive"],

"response_statuses": ["Confirmed"],

"response_types": ["hash"],

"statuses": ["Closed"],

# Parameter für die Aufbereitung der Ergebnisse

"markdown_to_html": True, # Ergebnisse im HTML-Format. Wenn der Wert "False" angegeben ist, wird Markdown-Format angewendet.

"sort": "creation_time:asc", # Sortiert die Ergebnisse nach Datum und Uhrzeit der Erstellung des Vorfalls. Beim seitenweisen Abrufen von Ergebnissen muss für die Sortierung ein Feld angegeben werden, das sich von Abfrage zu Abfrage nicht ändert, z. B. "creation_time" (Geben Sie keine Felder an, deren Werte sich permanent ändern, z. B. das Feld "update_time" , da dies zu falschen Ergebnissen führen kann) .

"page_size": 100, # Vorfälle pro Seite - 100

"page": 1, # Erste Seite der Suchergebnisse anzeigen

}

result = requests.post(

url=f"{API_URL}/{CLIENT_ID}/incidents/list", json=request_body, headers=headers, verify=VERIFY_CERT_PATH

)

print(result.json())

 

 

###################################################

# Details zu einem Vorfall abrufen

###################################################

 

request_body = {

"incident_id": "60gWG4UBMUGN-LWUuv1m", # (Fügen Sie Ihren Wert ein) Vorfalls-ID

"markdown_to_html": True, # Ergebnisse im HTML-Format. Wenn der Wert "False" angegeben ist, wird Markdown-Format angewendet.

}

result = requests.post(

url=f"{API_URL}/{CLIENT_ID}/incidents/details", json=request_body, headers=headers, verify=VERIFY_CERT_PATH

)

print(result.json())

 

 

###################################################

# Reaktions-Liste für einen Vorfall abrufen

###################################################

 

request_body = {

"incident_id": "60gWG4UBMUGN-LWUuv1m", # (Fügen Sie Ihren Wert ein) Vorfalls-ID

"page_size": 10, # Reaktionen pro Seite - 10

"page": 1, # Erste Seite der Suchergebnisse anzeigen

}

result = requests.post(

url=f"{API_URL}/{CLIENT_ID}/responses/list", json=request_body, headers=headers, verify=VERIFY_CERT_PATH

)

print(result.json())

 

 

###################################################

# Eine Reaktion bestätigen

###################################################

 

request_body = {

"response_id": "CEgYG4UBMUGN-LWULP7W", # (Fügen Sie Ihren Wert ein) Reaktions-ID

"comment": "comment_text", # Kommentar, der zur Reaktion hinzugefügt werden soll

"status": "Confirmed", # Neuer Status der Reaktion - "Confirmed"

}

result = requests.post(

url=f"{API_URL}/{CLIENT_ID}/response/update", json=request_body, headers=headers, verify=VERIFY_CERT_PATH

)

print(result.json())

 

 

###################################################

# Eine Antwort ablehnen

###################################################

 

request_body = {

"response_id": "CEgYG4UBMUGN-LWULP7W", # (Fügen Sie Ihren Wert ein) Reaktions-ID

"comment": "comment_text", # Kommentar, der zur Reaktion hinzugefügt werden soll

"status": "Declined", # Neuer Status der Reaktion - "Declined"

}

result = requests.post(

url=f"{API_URL}/{CLIENT_ID}/response/update", json=request_body, headers=headers, verify=VERIFY_CERT_PATH

)

print(result.json())

 

 

###################################################

# Liste mit Reaktionen aktualisieren

###################################################

 

request_body = {

"responses_ids": [

"CEgYG4UBMUGN-LWULP7W",

"2ESl6IgB4cAOUyXBb5IB",

], # (Fügen Sie Ihre Werte ein) Reaktions-IDs

"comment": "comment_text", # Kommentar, der zu den Reaktionen hinzugefügt werden soll

"status": "Confirmed", # Neue Statuswerte der Reaktionen - "Confirmed"

}

result = requests.post(

url=f"{API_URL}/{CLIENT_ID}/responses/update", json=request_body, headers=headers, verify=VERIFY_CERT_PATH

)

print(result.json())

Beispiel (Shell):

#Zugriffstoken und neuen Aktualisierungstoken abrufen

curl -X POST https://mdr.kaspersky.com/api/v1/{client_id}/session/confirm -H "Content-Type: application/json" -d '{"refresh_token": "{refresh_token}"}'

#Beispiel einer Antwort. Verwenden Sie Nächstes "access_token", um die Daten abzurufen, und "refresh_token", um den neuen Zugriffstoken und den Aktualisierungstoken abzurufen.

{

"access_token": "SamPLET346yoKEnSamPLEToK25EnSamPLEToK35EnS",

"refresh_token": "tOKenSaMPlet259OKenS123aMPle926tOKenSaMPle"

}

 

# Anzahl der Assets abrufen

curl -X POST https://mdr.kaspersky.com/api/v1/{client_id}/assets/count -H "Content-Type: application/json" -H "Authorization: Bearer {access_token}" -d '{"max_last_seen": 1704103200000, "min_last_seen": 1704762000000}'

 

# Liste der Assets abrufen

curl -X POST https://mdr.kaspersky.com/api/v1/{client_id}/assets/list -H "Content-Type: application/json" -H "Authorization: Bearer {access_token}" -d '{"max_last_seen": 1704103200000, "min_last_seen": 1704762000000, "domain": "", "host_names": ["MA-MDR-KES-S","SIN-MDR-KSC"], "is_isolated": false, "network_interface": "10.70.104.1", "os_version": "Windows", "product": "", "search_phrase": "mdr", "statuses": ["OK","ABSENT"], "sort": "first_seen:asc", "page_size": 100, "page": 1, "version": 2}'

 

# Asset-Details abrufen

curl -X POST https://mdr.kaspersky.com/api/v1/{client_id}/assets/details -H "Content-Type: application/json" -H "Authorization: Bearer {access_token}" -d '{"asset_id": "0xFA6A68CC9A9415963DE841048A3BE929", "version": 2}'

 

# Anzahl der Vorfälle abrufen

curl -X POST https://mdr.kaspersky.com/api/v1/{client_id}/incidents/count -H "Content-Type: application/json" -H "Authorization: Bearer {access_token}" -d '{"max_update_time": 1704103200000, "min_update_time": 1704762000000, "affected_hosts": ["MA-MDR-KES-S:0xFA6A68CC9A9415963DE841048A3BE929"]}'

 

# Liste der Vorfälle abrufen

curl -X POST https://mdr.kaspersky.com/api/v1/{client_id}/incidents/list -H "Content-Type: application/json" -H "Authorization: Bearer {access_token}" -d '{"max_creation_time": 1704103200000, "min_creation_time": 1704762000000, "asset_ids": ["0xFA6A68CC9A9415963DE841048A3BE929"], "priorities": ["HIGH"], "resolutions": ["True positive"], "response_statuses": ["Confirmed"], "response_types": ["hash"], "statuses": ["Closed"], "markdown_to_html": true, "sort": "creation_time:asc", "page_size": 100, "page": 1}'

 

# Details zu einem Vorfall abrufen

curl -X POST https://mdr.kaspersky.com/api/v1/{client_id}/incidents/details -H "Content-Type: application/json" -H "Authorization: Bearer {access_token}" -d '{"incident_id": "60gWG4UBMUGN-LWUuv1m", "markdown_to_html": true}'

 

# Reaktions-Liste für einen Vorfall abrufen

curl -X POST https://mdr.kaspersky.com/api/v1/{client_id}/responses/list -H "Content-Type: application/json" -H "Authorization: Bearer {access_token}" -d '{"incident_id": "60gWG4UBMUGN-LWUuv1m", "page_size": 10, "page": 1}'

 

# Eine Reaktion aktualisieren

curl -X POST https://mdr.kaspersky.com/api/v1/{client_id}/response/update -H "Content-Type: application/json" -H "Authorization: Bearer {access_token}" -d '{"response_id": "CEgYG4UBMUGN-LWULP7W", "comment": "comment_text", "status": "Confirmed"}'

 

# Liste mit Reaktionen aktualisieren

curl -X POST https://mdr.kaspersky.com/api/v1/{client_id}/responses/update -H "Content-Type: application/json" -H "Authorization: Bearer {access_token}" -d '{"responses_ids": ["CEgYG4UBMUGN-LWULP7W", "2ESl6IgB4cAOUyXBb5IB"], "comment": "comment_text", "status": "Confirmed"}'

Beispiel einer REST-API-Antwort mit Zugriffstoken und neuem Aktualisierungstoken:

{

"access_token": "SamPLET346yoKEnSamPLEToK25EnSamPLEToK35EnS",

"refresh_token": "tOKenSaMPlet259OKenS123aMPle926tOKenSaMPle"

}

Beispiel einer REST-API-Antwort mit Struktur und Werten von Kommentaren:

[{

"comment_id": "bfu6TiNghqp",

"author_name": "Mandy Musterfrau",

"text": "<p>Der erste Kommentar.</p>",

"creation_time": 1601295428640

}, {

"comment_id": "bfu6TiNghqt",

"author_name": "Max Mustermann",

"text": "<p>Der zweite Kommentar.</p>",

"creation_time": 1601295433441

}]

Beispiel einer REST-API-Antwort, wenn die REST-API einen neuen Kommentar erstellt und eine Antwort mit Kommentardetails liefert:

{

"comment_id": "AXTej0Qi4bfu6TiNgmvT",

"author_name": "Tokenname",

"text": "Dieser neue Kommentar wurde mit der REST API erstellt.",

"creation_time": 1601461748122

}

Siehe auch:

Szenario: Tokenbasierte Autorisierung durchführen

Nach oben