Ejemplo (Python):
###################################################
# Parte general
###################################################
import time
import datetime
import requests
import jwt
# El certificado es necesario para la autenticación de un recurso externo
# Puede descargar el certificado desde https://mdr.kaspersky.com,
# guárdelo en su disco y agregue la ruta en la variable:
VERIFY_CERT_PATH = "C:\\tools\\DigiCert Global Root G2.crt"
# URL de la API de REST de MDR:
API_URL = "https://mdr.kaspersky.com/api/v1"
# El id. de su cliente y sus tókenes de usted
# Para obtener más información sobre cómo obtener su ID y los tokens, consulte la ayuda https://support.kaspersky.com/MDR/en-US/258285.htm
CLIENT_ID = "9ed43ed54sAmpleIdf349323951f" # ( Pegue su valor )
REFRESH_TOKEN = "ReFrEsHToKeN" # ( Pegue su valor )
ACCESS_TOKEN = "AcCeSsToKeN" # ( Pegue su valor )
###################################################
# Obtenga un token de acceso y un token de actualización para la próxima actualización del token de acceso
###################################################
if REFRESH_TOKEN:
refresh_token_exp = jwt.decode(REFRESH_TOKEN, options={"verify_signature": False}).get("exp")
print(f"REFRESH_TOKEN fecha y hora de caducidad: {datetime.datetime.fromtimestamp(refresh_token_exp)}")
if refresh_token_exp > time.time():
print("REFRESH_TOKEN es válido ")
else:
print(
" Debe actualizar REFRESH_TOKEN; tómelo de la consola MDR (https://support.kaspersky.com/MDR/es-ES/258285.htm) "
)
exit()
else:
print(
" Debe rellenar el valor REFRESH_TOKEN ; tómelo de la Consola MDR (https://support.kaspersky.com/MDR/es-ES/258285.htm) "
)
exit()
# Verificar la presencia y validez del token de acceso
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 fecha y hora de caducidad: {datetime.datetime.fromtimestamp(access_token_exp)}")
if access_token_exp > time.time():
print("ACCESS_TOKEN es válido ")
else:
need_update_access_token = True
else:
need_update_access_token = True
# Si es necesario, actualice el token de acceso y actualice el token para la próxima actualización del token de acceso
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()
# Es necesario guardar el token de actualización para obtener el siguiente token de acceso cuando caduque el token de acceso actual
refresh_token = result_json["refresh_token"]
print(
f' Su nuevo REFRESH_TOKEN para la próxima vez que solicite ACCESS_TOKEN (reemplace el valor de REFRESH_TOKEN con este valor): : "{refresh_token}"'
)
# Se requiere un nuevo token de acceso para recuperar los datos
access_token = result_json["access_token"]
print(f' Su nuevo ACCESS_TOKEN (reemplace el valor de ACCESS_TOKEN con este valor): "{access_token}"')
# El token de acceso se añade al encabezado de la solicitud
headers = {"Authorization": f"Bearer {access_token}"}
###################################################
# Obtener el número de activos
###################################################
# La fecha y la hora están en milisegundos a partir de 1970-01-01T00:00:00Z
request_body = {
"max_last_seen": int(time.time())
* 1000, # Limitar el tiempo máximo de la última aparición del activo a la hora actual
"min_last_seen": 1639311132000, # Limitar el tiempo mínimo de la última aparición del activo a la constante: Domingo 12 de diciembre, 2021 12:12:12 PM (GMT)
}
result = requests.post(
url=f"{API_URL}/{CLIENT_ID}/assets/count", json=request_body, headers=headers, verify=VERIFY_CERT_PATH
)
print(result.json())
###################################################
# Obtener la lista de activos
###################################################
request_body = {
# Parámetros de búsqueda:
"max_last_seen": int(time.time())
* 1000, # Limitar el tiempo máximo de la última aparición del activo a la hora actual
"min_last_seen": 1639311132000, # Limitar el tiempo mínimo de la última aparición del activo a la constante: Domingo 12 de diciembre, 2021 12:12:12 PM (GMT)
"domain": "",
"host_names": ["MA-MDR-KES-S", "SIN-MDR-KSC"], # (Pegue su valor) Lista de hosts
"is_isolated": False,
"network_interface": "10.70.104.1",
"os_version": "Windows", # El activo debe contener la línea especificada en el nombre del SO
"product": "",
"search_phrase": "mdr", # Frase para buscar en el contenido de los campos: "host_name", "domain", "installed_product_info", "network_interfaces", "os_version"
"statuses": ["OK", "ABSENT"], # Buscar activos que tengan los estados actuales enumerados aquí
# Opciones para mostrar los resultados de la búsqueda:
"sort": "first_seen:asc", # Ordenar los resultados por la hora de la primera aparición; en el caso de la recuperación de resultados página por página, es necesario especificar un campo de ordenación que no cambie de una consulta a otra, por ejemplo, "first_seen" (no especifique campos cuyos valores cambian constantemente, por ejemplo, el campo "last_seen" ; esto puede llevar a resultados incorrectos)
"page_size": 100, # Activos por página: 100
"page": 1, # Obtener la primera página de resultados de búsqueda
"version": 2, # Versión de la solución
}
result = requests.post(
url=f"{API_URL}/{CLIENT_ID}/assets/list", json=request_body, headers=headers, verify=VERIFY_CERT_PATH
)
print(result.json())
###################################################
# Obtener detalles de los activos
###################################################
request_body = {
"asset_id": "0xFA6A68CC9A9415963DE841048A3BE929", # (Pegue su valor) Id. del activo
"version": 2, # Versión de la solución
}
result = requests.post(
url=f"{API_URL}/{CLIENT_ID}/assets/details", json=request_body, headers=headers, verify=VERIFY_CERT_PATH
).json()
print(result)
###################################################
# Obtener el número de incidentes
###################################################
request_body = {
"max_update_time": int(time.time())
* 1000, # Limitar el tiempo máximo de la última actualización del incidente a la hora actual
"min_update_time": 1639311132000, # Limitar el tiempo mínimo de la última actualización del incidente a la constante: Domingo 12 de diciembre, 2021 12:12:12 PM (GMT)
"affected_hosts": [
"MA-MDR-KES-S:0xFA6A68CC9A94145456E841048A3BE929"
], # (Pegue su valor) Lista de hots en formato "host_name:asset_id"
}
result = requests.post(
url=f"{API_URL}/{CLIENT_ID}/incidents/count", json=request_body, headers=headers, verify=VERIFY_CERT_PATH
)
print(result.json())
###################################################
# Obtener la lista de incidentes
###################################################
request_body = {
# Parámetros de búsqueda:
"max_creation_time": int(time.time())
* 1000, # Limitar el tiempo máximo de creación del incidente a la hora actual
"min_creation_time": 1639311132000, # Limitar el tiempo mínimo de la creación del incidente a la constante: Domingo, 12 de diciembre de 2021 12:12:12 PM (GMT)
"asset_ids": [
"0xFA6A68CC9A9415963DE841048A3BE929"
], # (Pegue su valor) Lista de activos cuyos incidentes recopilamos
"priorities": ["HIGH"],
"resolutions": ["True positive"],
"response_statuses": ["Confirmed"],
"response_types": ["hash"],
"statuses": ["Closed"],
# Parámetros para entregar los resultados
"markdown_to_html": True, # Resultados en formato HTML; si el valor es "False" , los resultados tendrán el formato Markdown
"sort": "creation_time:asc", # Ordena los resultados por la fecha y hora en que se creó el incidente. Si recupera los resultados página por página, asegúrese de especificar un campo de ordenación que se mantenga constante entre consultas, como por ejemplo," creation_time " (no use campos cuyos valores cambien constantemente, por ejemplo, el campo " update_time ", ya que esto puede dar lugar a resultados incorrectos)
"page_size": 100, # Incidentes por página: 100
"page": 1, # Obtener la primera página de resultados de búsqueda
}
result = requests.post(
url=f"{API_URL}/{CLIENT_ID}/incidents/list", json=request_body, headers=headers, verify=VERIFY_CERT_PATH
)
print(result.json())
###################################################
# Obtener detalles del incidente
###################################################
request_body = {
"incident_id": "60gWG4UBMUGN-LWUuv1m", # (Pegue su valor) Id. del incidente
"markdown_to_html": True, # Resultados en formato HTML; si el valor es "Falso", los resultados tendrá el formato Markdown
}
result = requests.post(
url=f"{API_URL}/{CLIENT_ID}/incidents/details", json=request_body, headers=headers, verify=VERIFY_CERT_PATH
)
print(result.json())
###################################################
# Obtener una lista de respuestas al incidente
###################################################
request_body = {
"incident_id": "60gWG4UBMUGN-LWUuv1m", # (Pegue su valor) Id. del incidente
"page_size": 10, # respuestas por página: 10
"page": 1, # Obtener la primera página de resultados de búsqueda
}
result = requests.post(
url=f"{API_URL}/{CLIENT_ID}/responses/list", json=request_body, headers=headers, verify=VERIFY_CERT_PATH
)
print(result.json())
###################################################
# Confirmar la respuesta
###################################################
request_body = {
"response_id": "CEgYG4UBMUGN-LWULP7W", # (Pegue su valor) Response ID
"comment": "comment_text", # Comentario que se añadirá a la respuesta
"status": "Confirmed", # Nuevo estado de respuesta: "Confirmed"
}
result = requests.post(
url=f"{API_URL}/{CLIENT_ID}/response/update", json=request_body, headers=headers, verify=VERIFY_CERT_PATH
)
print(result.json())
###################################################
# Rechazar la respuesta
###################################################
request_body = {
"response_id": "CEgYG4UBMUGN-LWULP7W", # (Pegue su valor) Response ID
"comment": "comment_text", # Comentario que se añadirá a la respuesta
"status": "Declined", # Nuevo estado de respuesta: "Declined"
}
result = requests.post(
url=f"{API_URL}/{CLIENT_ID}/response/update", json=request_body, headers=headers, verify=VERIFY_CERT_PATH
)
print(result.json())
###################################################
# Actualizar la lista de respuestas
###################################################
request_body = {
"responses_ids": [
"CEgYG4UBMUGN-LWULP7W",
"2ESl6IgB4cAOUyXBb5IB",
], # (Pegue sus valores) Id. de respuestas
"comment": "comment_text", # Comentario que se añadirá a las respuestas
"status": "Confirmed", # Estado de las nuevas respuestas: "Confirmed"
}
result = requests.post(
url=f"{API_URL}/{CLIENT_ID}/responses/update", json=request_body, headers=headers, verify=VERIFY_CERT_PATH
)
print(result.json())
|