Пример (Python):
###################################################
# Общая часть
###################################################
import time
import datetime
import requests
import jwt
# Сертификат необходим для аутентификации внешнего ресурса.
# Вы можете скачать сертификат с https://mdr.kaspersky.com.
# Сохраните сертификат на свой диск и добавьте путь к сертификату в переменной:
VERIFY_CERT_PATH = "C:\\tools\\DigiCert Global Root G2.crt"
# веб-адрес MDR REST API:
API_URL = "https://mdr.kaspersky.com/api/v1"
# Ваш идентификатор клиента и ваши токены.
# Подробнее о получении идентификатора и токенов см. в справке https://support.kaspersky.com/MDR/ru-RU/258285.htm.
CLIENT_ID = "9ed43ed54sAmpleIdf349323951f" # ( Вставьте ваше значение )
REFRESH_TOKEN = "ReFrEsHToKeN" # ( Вставьте ваше значение )
ACCESS_TOKEN = "AcCeSsToKeN" # ( Вставьте ваше значение )
###################################################
# Получение токена доступа и токена обновления для следующего обновления токена доступа
###################################################
if REFRESH_TOKEN:
refresh_token_exp = jwt.decode(REFRESH_TOKEN, options={"verify_signature": False}).get("exp")
print(f"REFRESH_TOKEN дата и время истечения срока действия: {datetime.datetime.fromtimestamp(refresh_token_exp)}")
if refresh_token_exp > time.time():
print("REFRESH_TOKEN действительный ")
else:
print(
" Вам нужно обновить REFRESH_TOKEN . Возьмите его из Консоли MDR (https://support.kaspersky.com/MDR/ru-RU/258285.htm). "
)
exit()
else:
print(
" Вам нужно заполнить значение REFRESH_TOKEN value. Возьмите его из Консоли MDR (https://support.kaspersky.com/MDR/ru-RU/258285.htm). "
)
exit()
# Проверьте наличие и срок действия токена доступа.
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 дата и время истечения срока действия: {datetime.datetime.fromtimestamp(access_token_exp)}")
if access_token_exp > time.time():
print("ACCESS_TOKEN действительный ")
else:
need_update_access_token = True
else:
need_update_access_token = True
# При необходимости обновите токен доступа и токен обновления для следующего обновления токена доступа.
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()
# Необходимо сохранить токен обновления, чтобы получить следующий токен доступа после истечения срока действия текущего токена доступа
refresh_token = result_json["refresh_token"]
print(
f'!!! Ваш новый REFRESH_TOKEN для следующего запроса ACCESS_TOKEN (замените значение REFRESH_TOKEN значением) : "{refresh_token}"'
)
# Требуется новый токен доступа для получения данных
access_token = result_json["access_token"]
print(f'!!! Ваш новый ACCESS_TOKEN (замените значение ACCESS_TOKEN значением): "{access_token}"')
# Токен доступа добавлен в заголовок запроса.
headers = {"Authorization": f"Bearer {access_token}"}
###################################################
# Получить количество активов
###################################################
# Дата и время в миллисекундах с 1970-01-01T00:00:00Z
request_body = {
"max_last_seen": int(time.time())
* 1000, # Ограничение максимального времени последнего появления актива от текущего временем
"min_last_seen": 1639311132000, # Ограничение минимального времени последнего появления актива с константой – воскресенье, 12 декабря 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())
###################################################
# Получить список активов
###################################################
request_body = {
# Параметры поиска:
"max_last_seen": int(time.time())
* 1000, # Ограничение максимального времени последнего появления актива от текущего временем
"min_last_seen": 1639311132000, # Ограничение минимального времени последнего появления актива с константой – воскресенье, 12 декабря 2021 г, 12:12:12 (GMT)
"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", # Фраза для поиска по содержимому поля: "host_name", "domain", "installed_product_info", "network_interfaces", "os_version"
"statuses": ["OK", "ABSENT"], # Поиск объектов с текущими перечисленными статусами
# Варианты отображения результатов поиска:
"sort": "first_seen:asc", # Сортировка результатов по времени первого появления. В случае постраничного получения результатов необходимо указать поле для сортировки, которое не будет меняться от запроса к запросу, например "first_seen" (не указывайте поля, значения которых постоянно меняются, например поле "last_seen" ; это может привести к неверным результатам) .
"page_size": 100, # Активов на странице – 100
"page": 1, # Получить первую страницу результатов поиска
"version": 2, # Версия решения
}
result = requests.post(
url=f"{API_URL}/{CLIENT_ID}/assets/list", json=request_body, headers=headers, verify=VERIFY_CERT_PATH
)
print(result.json())
###################################################
# Получить информацию об активе
###################################################
request_body = {
"asset_id": "0xFA6A68CC9A9415963DE841048A3BE929", # (Вставьте ваше значение) Идентификатор актива
"version": 2, # Версия решения
}
result = requests.post(
url=f"{API_URL}/{CLIENT_ID}/assets/details", json=request_body, headers=headers, verify=VERIFY_CERT_PATH
).json()
print(result)
###################################################
# Получить количество инцидентов
###################################################
request_body = {
"max_update_time": int(time.time())
* 1000, # Ограничить максимальное время последнего обновления инцидента текущим временем
"min_update_time": 1639311132000, # Ограничение минимального времени для последнего обновления инцидента константой – воскресенье, 12 декабря 2021 г, 12:12:12 PM (GMT)
"affected_hosts": [
"MA-MDR-KES-S:0xFA6A68CC9A94145456E841048A3BE929"
], # (Вставьте ваше значение) Список устройств в формате "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())
###################################################
# Получить список инцидентов
###################################################
request_body = {
# Параметры поиска:
"max_creation_time": int(time.time())
* 1000, # Ограничить максимальное время создания инцидента текущим временем
"min_creation_time": 1639311132000, # Ограничение минимального времени создания инцидента константой – воскресенье, 12 декабря 2021 г, 12:12:12 PM (GMT)
"asset_ids": [
"0xFA6A68CC9A9415963DE841048A3BE929"
], # (Вставьте ваше значение) Список активов, для которых получаем инциденты
"priorities": ["HIGH"],
"resolutions": ["True positive"],
"response_statuses": ["Confirmed"],
"response_types": ["hash"],
"statuses": ["Closed"],
# Параметры для предоставления результатов
"markdown_to_html": True, # Результаты в формате HTML. Если значение равно "False" , результаты имеют формат Markdown.
"sort": "creation_time:asc", # Сортировать результаты по дате и времени создания инцидента. В случае постраничного получения результатов необходимо указать поле для сортировки, которое не будет меняться от запроса к запросу, например creation_time (не указывайте поля, значения которых постоянно меняются, например поле "update_time"; это может привести к неверным результатам).
"page_size": 100, # Инцидентов на странице – 100
"page": 1, # Получить первую страницу результатов поиска
}
result = requests.post(
url=f"{API_URL}/{CLIENT_ID}/incidents/list", json=request_body, headers=headers, verify=VERIFY_CERT_PATH
)
print(result.json())
###################################################
# Получить детали инцидента
###################################################
request_body = {
"incident_id": "60gWG4UBMUGN-LWUuv1m", # Вставьте ваше значение) Идентификатор инцидента
"markdown_to_html": True, # Результаты в формате HTML. Если значение равно "False", результаты имеют формат Markdown.
}
result = requests.post(
url=f"{API_URL}/{CLIENT_ID}/incidents/details", json=request_body, headers=headers, verify=VERIFY_CERT_PATH
)
print(result.json())
###################################################
# Получить список действий по реагированию на инцидент
###################################################
request_body = {
"incident_id": "60gWG4UBMUGN-LWUuv1m", # Вставьте ваше значение) Идентификатор инцидента
"page_size": 10, # Действий по реагированию на странице – 10
"page": 1, # Получить первую страницу результатов поиска
}
result = requests.post(
url=f"{API_URL}/{CLIENT_ID}/responses/list", json=request_body, headers=headers, verify=VERIFY_CERT_PATH
)
print(result.json())
###################################################
# Подтвердите действие по реагированию
###################################################
request_body = {
"response_id": "CEgYG4UBMUGN-LWULP7W", # (Вставьте ваше значение) Идентификатор действия по реагированию
"comment": "comment_text", # Комментарий, который нужно добавить к действию по реагированию
"status": "Confirmed", # Новый статус действия по реагированию – "Confirmed"
}
result = requests.post(
url=f"{API_URL}/{CLIENT_ID}/response/update", json=request_body, headers=headers, verify=VERIFY_CERT_PATH
)
print(result.json())
###################################################
# Отклонить действие по реагированию
###################################################
request_body = {
"response_id": "CEgYG4UBMUGN-LWULP7W", # (Вставьте ваше значение) Идентификатор действия по реагированию
"comment": "comment_text", # Комментарий, который нужно добавить к действию по реагированию
"status": "Declined", # Новый статус действия по реагированию – "Declined"
}
result = requests.post(
url=f"{API_URL}/{CLIENT_ID}/response/update", json=request_body, headers=headers, verify=VERIFY_CERT_PATH
)
print(result.json())
###################################################
# Обновить список действий по реагированию
###################################################
request_body = {
"responses_ids": [
"CEgYG4UBMUGN-LWULP7W",
"2ESl6IgB4cAOUyXBb5IB",
], # (Вставьте ваше значение) Идентификаторы действий по реагированию
"comment": "comment_text", # Комментарий, который нужно добавить к реагированию
"status": "Confirmed", # Новый статус действий по реагированию – "Confirmed"
}
result = requests.post(
url=f"{API_URL}/{CLIENT_ID}/responses/update", json=request_body, headers=headers, verify=VERIFY_CERT_PATH
)
print(result.json())
|