Работа с REST API

Работа с MDR с помощью REST API включает получение, создание и обновление активов, инцидентов, действий по реагированию и пользователей.

ОТКРЫТЬ СПРАВКУ ПО REST API

Для методов REST API требуется значение client_id. Вы можете получить значение client_id в разделе Информации о токене любого токена обновления в Консоли MDR.

Ниже приведены примеры скриптов для Python и Shell, демонстрирующие основные возможности REST API:

Пример (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. Возьмите его из Консоли 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"

}

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

Пример (Shell):

# Получение токена доступа и нового токена обновления

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

# Пример ответа. Далее вам нужно использовать access_token для получения данных и refresh_token для получения нового токена доступа и токена обновления.

{

"access_token": "SamPLET346yoKEnSamPLEToK25EnSamPLEToK35EnS",

"refresh_token": "tOKenSaMPlet259OKenS123aMPle926tOKenSaMPle"

}

 

# Получить количество активов

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}'

 

# Получить список активов

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}'

 

# Получить информацию об активе

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}'

 

# Получить количество инцидентов

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"]}'

 

# Получить список инцидентов

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}'

 

# Получить сведения об инциденте

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}'

 

# Получить список действий по реагированию на инцидент

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}'

 

# Обновить действие по реагированию

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"}'

 

# Обновить список действий по реагированию

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"}'

Пример ответа REST API с токеном доступа и новым токеном обновления:

{

"access_token": "SamPLET346yoKEnSamPLEToK25EnSamPLEToK35EnS",

"refresh_token": "tOKenSaMPlet259OKenS123aMPle926tOKenSaMPle"

}

Пример ответа REST API со структурой и значениями комментариев:

[{

"comment_id": "bfu6TiNghqp",

"author_name": "Иван Иванов",

"text": "<p>Первый комментарий.</p>",

"creation_time": 1601295428640

}, {

"comment_id": "bfu6TiNghqt",

"author_name": "Мария Иванова",

"text": "<p>Второй комментарий.</p>",

"creation_time": 1601295433441

}]

Пример ответа REST API, если REST API создает комментарий и отправляет действие по реагированию с деталями комментария:

{

"comment_id": "AXTej0Qi4bfu6TiNgmvT",

"author_name": "Название токена",

"text": "Это новый комментарий, созданный с помощью REST API.",

"creation_time": 1601461748122

}

См. также:

Сценарий: авторизация на основе токенов

В начало