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())
|