Создание СЗИ

Для создания СЗИ необходимо нажать кнопку "Добавить".

Последовательность создания СЗИ:

  1. Ввод имени. Важно: не рекомендуется использовать в качестве имени СЗИ фразу "WRONG RECORD", т.к. она зарезервирована Системой;

  2. Выбор шаблона (см. раздел Шаблоны СЗИ);

  3. В зависимости от шаблона во вкладках "Общие настройки", "Маппинг" и "Воркфлоу" появляются поля, предзаполненные значениями по умолчанию;

  4. Выполняется заполнение полей;

  5. Сохранение созданного СЗИ;

  6. Созданное СЗИ представляет собой:

    • имя СЗИ и

    • конкретное заполнение настроек шаблона, в которых отсутствует лишняя информация, но присутствует конкретное значение.

image

Имена встроенных переменных, которые всегда есть в контексте задачи на сканирование файла, приведены в таблице ниже.  При выявлении указанных переменных в тексте спецификации Система подставит вычисленные в динамике значения.

Имя встроенной переменнойКомментарий

$CHAIN_ID

ID цепочки

$FILE_NAME

имя файла, который передается на анализ

$FILE_CHECKSUM

sha256 checksum файла

$FILE_SIZE

размер файла в байтах

$FILE_MIME_TYPE

mime-type файла (если заполнено в мета-информации, полученной с файлом из источника)

$FILE_CREATED

дата создания файла (если заполнено в мета-информации, полученной с файлом из источника)

$FILE_EXTENSION

расширение файла (если заполнено в мета-информации, полученной с файлом из источника)

$FILE_MODIFIED

время изменения файла (если заполнено в мета-информации, полученной с файлом из источника)

$INSTANCE_HOSTNAME

хост или IP-адрес инстанса, с которого происходит обращение к СЗИ (запущена задача)

$IS_ARCHIVE

$IS_ARCHIVE является ли файл архивом

$PASSWORD_PROTECTED

является ли файл запароленным архивом

Важно: чтобы подставить пароль или другие чувствительные данные, необходимо в разделе "Секреты" завести новую переменную, которая будет замаскированна средствами Системы (см. раздел "Создание секрета"). Затем в спецификации необходимо указать $ИМЯ_СЕКРЕТНОЙ_ПЕРЕМЕННОЙ, куда требуется подстановка данных. 

Например: PT_SANDBOX_API_KEY добавлен в разделе "Секреты", после чегор эту переменную можно использовать в URL, заголовках и теле запроса и других местах с помощью $PT_SANDBOX_API_KEY.

Возможные типы парметров, приведены в таблице ниже.

Тип переменнойКомментарии

text

текст

number

число

host

адрес сервера

port

порт (число от 1 до 65535)

json

гибкое поле

enum:val1|val2|…​

перечисление элементов, Например:, enum:sync|async|listening

[]number

список чисел

[]text

список строк

map[<key type (text)>]<value type (text, number, etc.)>

мэппинг с типизированными ключами и значениями

time-pair

выбор числа и выбор периода

registry

переменная из спецификации распаковки тела или заголовков ответа у шага с признаком is_report_step=true

Форма настройки интеграции с конкретным СЗИ зависит от выбранного шаблона. Модель описания шаблона интеграции приведена в таблице ниже.

ПараметрШаблон и значениеКомментарии

Общие настройки. Тип: map[string]any

connection_limit

default: 5

Лимит подключений к системе анализа

host

default: 127.0.0.1

Настоящий (внешний) ip хоста, где стоит СЗИ, который необходимо указать вместо 127.0.0.

insecure_skip_verify

default: false

Маппинг Вкладка глобального маппинга заголовков (расширяет все запросы вовне) и маппингов кодов или вердиктов для отчетности. Тип: map[string]any

request_headers_mapping

default: {
     "filename": "X-File-Name"}

Глобальное расширение хэдеров для всех шагов воркфлоу Пример: "request_headers_mapping": {
     "filename": "X-File-Name"
}

verdict_mapping

блок фиксированной структуры

Маппинг вердикта на общую модель Используется при интерпретации результатов, полученных при прохождении шага в воркфлоу с признаком is_report_step = true

verdict_mapping.path

default:  data.result.verdict

Переменная, из которой берется вердикт

verdict_mapping.map

default: {
     "DANGEROUS": "danger",
     "SUSPICIOUS": "suspicious",
     "CLEAN": "clean"
}

Маппинг текстовых вердиктов на общую вердиктовую модель. Используется при интерпретации результатов, полученных при прохождении шага в воркфлоу с признаком is_report_step = true Пример: {
"false": "danger",
"true": "clean"
}

verdict_mapping.default_verdict

default: unsupported

Дефолтное значение вердикта (если Система не нашла чему сопоставить)

Воркфлоу Упорядоченный список шагов, фиксирующий правила: "если шаг упал - следующий не запускается, Система выдает ошибку". Тип:  []map[string]any

Воркфлоу: Общие параметры шага

name

default: upload file

Имя шага

is_report_step

default: false

Признак того, что на шаге будет получено в response отчетность. Важно: В каждом ворфлоу должен быть ровно 1 шаг с is_report_step = true

kind

default: sync

Тип шага В зависимости от kind в step может быть только какой-то из соответствующих блоков: * sync - шаг с ожиданием ответа сразу (одна попытка, нет условия)

* poll - шаг с периодическим опросом (несколько попыток через интервал, есть условие завершения)

* listening - шаг с включением "слушалки", на которой Система пассивно ждет поступления чего-то

Воркфлоу: блок sync шага (kind=sync)

sync.protocol

default: http

Протокол, по которому отправляется http запрос. Для разных протоколов могут появляться и исчезать некоторые поля в секции sync

sync.icap_protocol

default: icap

Протокол, по которому отправляется icap запрос Для разных протоколов могут появляться и исчезать некоторые поля в секции sync

sync.port

default: 443

sync.icap_port

default: 1344

sync.method

default: POST

sync.icap_method

default: REQMOD

sync.path

default: /analyze

Например /path/$TASK_ID

sync.icap_path

default: /reqmod

sync.headers

default: {
   "Content-Type": "application/octet-stream",
   "Content-Length": "$FILE_SIZE",
}

Заголовки, отправляемые в http запросе

sync.icap_headers

default: {
   "Content-Type": "application/octet-stream",
   "Content-Length": "$FILE_SIZE",
}

Заголовки, отправляемые в icap запросе

sync.icap_options_enabled

default: true

Запрашивать возможности сервера перед отправкой файлов. True/False

sync.icap_preview_mode

default: auto

auto/disabled/fixed

sync.icap_preview_bytes

default: 0

number >=0 (параметр доступен для изменения только при fixed в sync.icap_preview_mode

sync.body

блок параметров описания тела

sync.body.mode

default: json

sync.body.payload

default: {    "file_content": "$FILE_CONTENT" }

Важно: При mode = json, multipart Шаблон тела запроса (может быть пустым, в зависимости от режима body_mode)  Например:: "payload":  {    "api_key": "",    "scenario_id": "",    "check_service": "",    "file_content": "$FILE_CONTENT" }

При mode=multipart возможно указание кастомного имени для управляемого поля в multipart запросе Для этого необходимо добавить в описание шаблона тела запроса "field_name": "<значение по документации, пример curl -F …​>" В большинстве случаев не требует ничего указывать, т.к. будет корректно работать дефолт (file)

sync.success_codes

default: [200, 201, 204]

Коды успешности. Если код ответа не входит в этот список - шаг считается проваленным, выдается ошибка

sync.retry_count

default: 1

sync.retry_interval

default: {value: 10, period: "second"}

sync.retry_timeout

default: {value: 90, period: "minute"}

Воркфлоу: poll блок poll шага (kind=poll) Важно: для icap не поддерживается

poll.protocol

default: http

Протокол, по которому отправляется запрос Для разных протоколов могут появляться и исчезать некоторые поля в секции poll

poll.port

name: port label: Порт type: port (numeric, 1, 65535) default: 1

poll.method

default: POST

poll.path

default: /result

Допустимо использование spec-переменных

poll.headers

default: {
   "Content-Type": "application/octet-stream",
   "Content-Length": "$FILE_SIZE",
}

Заголовки, отправляемые в запросе

poll.body

блок параметров описания тела

poll.body.mode

default: json

poll.body.payload

default: {    "task_id": "$TASK_ID" }

При mode = json, multipart Шаблон тела запроса Например: "body":  {     "task_id": "$TASK_ID" } При mode=multipart возможно указание кастомного имени для управляемого поля в multipart запросе. Для этого необходимо добавить в описание шаблона тела запроса "field_name": "<значение по документации, пример curl -F …​>" В большинстве случаев не нужно ничего указывать, т.к. дефолт (file) будет работать корректно.

poll.success_codes

default: [200, 201, 204]

Коды успешности  Если код ответа не входит в этот список - шаг считается проваленным, выдается ошибка

poll.retry_count

default: 1

poll.retry_interval

default: {value: 10, period: "second"}

poll.retry_timeout

default: {value: 90, period: "minute"}

poll.poll_interval a

default: {value: 2, period: "minute"}

Важно: параметр отсутствует в sync

poll.poll_global_timeout

type: time-pair default: {value: 90, period: "minute"}

Важно: параметр отсутствует в sync

poll.poll_until_path

default: data.status

Важно: параметр отсутствует в sync

poll.poll_until_op

default: eq

Важно: параметр отсутствует в sync

poll.poll_until_value

default: READY

Важно: параметр отсутствует в sync

Воркфлоу: extraction [.underline]#Важно:#_ Блок настроек "распаковки" ответа во внутреннюю модель

extraction.extraction_header_mapping

default: {
     "X-File-Name": "$FILENAME"
}

Маппинг заголовков результата на внутреннюю модель

Примеры: "extraction_header_mapping": {
   "X-Request-Id": "$REQUEST_ID",
   "X-RateLimit-Remaining": "rate_limit_remaining"
}

extraction.extraction_body_mapping

default: "extraction_body_mapping": {
"data.task_id": "$FILE_URI"
}

Маппинг тела результата на внутреннюю модель

Примеры: "extraction_body_mapping": {
   "data.task_id": "$FILE_URI"
} "extraction_body_mapping": {
   "data.result.verdict": "verdict",
   "data.result.threat": "$THREAT",
   "data.result.duration": "duration",
   "data.scan_id": "scan_id",
   "data.file_info.sha256": "sha256",
   "data.file_info.sha1": "sha1",
   "data.file_info.mime_type": "mime_type",
   "data.file_info.size": "size",
   "data.artifacts.0.engine_results.0.result.scan_state": "scan_state",
   "data.artifacts.0.engine_results.0.detections": "detections",
   "errors": "errors"
}

extraction.extraction_code_mapping

default: "$RESPONSE_CODE"

Маппинг кода ответа в переменную registry. В первую очередь выполняется поиск инкапсулированных http кодов и при их наличии происходит размещение в переменную. Если http кодов нет, тогда выполняется поиск признаков (кодов) в других местах (icap status code, icap headers etc.), и используя внутреннюю модель маппинга сущностей (Icap status code…​) в http коды, выполняется преобразование и присваиваем переменной.

Например: (Icap_status_code=200 → http_code=403).

extraction.extraction_mode

default: headers

default - headers. В случае payload|file - так же учитыватся headers. В случае code - может учитываться всё остальное, если заполнены маппинги. Важно: Могут встречаться сочетания