Skip to content

Критерии качества (Quality gate)

SQG (Security Quality Gate) - это контроль качества, используется для проверки безопасности продукта или репозитория.

SQG по умолчанию

На текущий момент в Vampy доступны 5 видов SQG - по умолчанию, низкий, средний, высокий и критический, в соответствии с критичностью продукта/репозитория.

Серьезность Тип Порог количества дефектов
(по умолчанию)
Порог количества дефектов
(низкий)
Порог количества дефектов
(средний)
Порог количества дефектов
(высокий)
Порог количества дефектов
(критический)
Критический SAST 0 10 5 0 0
Критический DAST 0 10 5 0 0
Критический SCA 0 20 10 0 0
Высокий SAST 0 20 10 5 0
Высокий DAST 0 20 10 5 0
Высокий SCA 10 80 40 20 10
Средний SAST 5 40 20 10 5
Средний DAST 5 40 20 10 5
Средний SCA 20 160 80 40 20
Низкий SAST 10 80 40 20 10
Низкий DAST 10 80 40 20 10
Низкий SCA 25 200 100 50 25

Кастомные SQG

Помимо предустановленных, вы можете создавать собственные SQG с произвольными условиями.

Создание кастомных SQG доступно в Enterprise версии Vampy.

Для создания кастомного SQG перейдите в раздел Контроль качества в левом меню и нажмите Создать.

Каждый SQG содержит набор условий. Для каждого условия в интерфейсе задаются:

  • Тип — тип сканирования (SAST, DAST, SCA)
  • Серьезность — уровень критичности дефектов (Критический, Высокий, Средний, Низкий)
  • Порог — максимально допустимое количество дефектов для выбранных типа и серьезности
  • Статус — включено ли условие

Если хотя бы одно включённое условие не выполнено (текущее количество дефектов превышает порог), SQG получает статус FAILED.

Кастомные SQG можно редактировать, отключать и удалять. Предустановленные SQG редактировать нельзя.

После создания SQG его можно назначить на продукт или репозиторий.

Интерфейс

Когда вы открываете Продукты или Репозитории, вы можете увидеть под именем каждого элемента, прошел ли он контроль качества. Нажмите на стрелку справа, чтобы открыть боковую панель информации об элементе и проверить детали.

API

Чтобы убедиться, что продукт/репозиторий прошёл контроль качества:

  • Создайте пользователя-бота с правами Админ или Редактор и запишите сгенерированный токен (или обратитесь за этим к администратору платформы). Добавьте его в нужный репозиторий.

  • Запустите следующий запрос CURL:

curl -G "$SEC_VV_URL/ext/v1/quality_gate/" \
-H "Authentication: $SEC_VV_KEY" \
-d "product=$VAMPY_PRODUCT_SLUG" \
-d "repository=$VAMPY_REPO_SLUG" \
-d "repositoryBranch=$VAMPY_REPO_BRANCH" \
-d "slug=SQG-SLUG-HERE" \
  • SEC_VV_URL - путь до сервера Vampy, например: http://vmp-demo.corp.hexway.io/api/;
  • SEC_VV_KEY - API токен бот-пользователя;
  • VAMPY_PRODUCT_SLUG - Slug продукта, который проходит проверку качества;
  • VAMPY_REPO_SLUG - Slug продукта, который проходит проверку качества. Равносильно CI_PROJECT_PATH;
  • VAMPY_REPO_BRANCH - ветка, для которой необходимо провести проверку SQG. Эквивалентно CI_COMMIT_REF_NAME;
  • slug - slug Security Quality Gate который будет использоваться для проверки соответствия качества

⚠️ Используйте только один слаг: для продукта или для репозитория, иначе вы получите ошибку.

В результате вы должны получить статус для контроля качества, выбранный в зависимости от критичности продукта/репозитория.

Статус контроля качества будет одним из 5 вариантов:

  • IN PROGRESS - этот статус означает, что SQG рассчитывается, и вам следует проверить его позже. После обработки изменений по одному из следующих пунктов;
  • FAILED - это означает, что некоторые условия не были выполнены. Вы можете проверить ответ для получения деталей;
  • SKIPPED - этот статус применяется в основном для условий, которые вы отключили. Если все условия были отключены, контроль качества будет автоматически пропущен.
  • PASSED - процесс завершен успешно, контроль качества пройден.
  • ERROR - возникла какая-то техническая проблема.

Примеры

Запрос:

curl -G "172.16.3.198/api/ext/v1/quality_gate/" \
-H "Authentication: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImJvdF91c2VyIiwiaWF0IjoxNzI4MzExNzQ0LjAwOTM0MX0.DrZtPm_aP6XfEDw1jNaZDQknIct0WGBCrUohbLJlo7w" \
-d "product=default" \

Ответ:

  {
  "id": "fb716e80-dab3-48bb-885b-de0c136549ff",
  "status": "FAILED",
  "lastCalculated": "2024-10-07T03:00:59.178413Z",
  "relation": {
    "name": "groenendael",
    "slug": "product-7b66bed",
    "id": "c43beb36-2079-43bf-8996-c940fd3e05fc",
    "type": "PRODUCT"
  },
  "details": {
    "name": "Default Quality Gate for criticality \"HIGH\"",
    "slug": "default-quality-gate-high",
    "criticality": "HIGH",
    "conditions": [
      {
        "enabled": true,
        "scannerTypes": [
          "SAST"
        ],
        "severities": [
          "CRITICAL"
        ],
        "maxValue": 0,
        "currentValue": 0,
        "status": "PASSED"
      },
      {
        "enabled": true,
        "scannerTypes": [
          "DAST"
        ],
        "severities": [
          "CRITICAL"
        ],
        "maxValue": 0,
        "currentValue": 0,
        "status": "PASSED"
      },
      {
        "enabled": true,
        "scannerTypes": [
          "SCA"
        ],
        "severities": [
          "CRITICAL"
        ],
        "maxValue": 0,
        "currentValue": 0,
        "status": "PASSED"
      },
      {
        "enabled": true,
        "scannerTypes": [
          "SAST"
        ],
        "severities": [
          "HIGH"
        ],
        "maxValue": 5,
        "currentValue": 4,
        "status": "PASSED"
      },
      {
        "enabled": true,
        "scannerTypes": [
          "DAST"
        ],
        "severities": [
          "HIGH"
        ],
        "maxValue": 5,
        "currentValue": 0,
        "status": "PASSED"
      },
      {
        "enabled": true,
        "scannerTypes": [
          "SCA"
        ],
        "severities": [
          "HIGH"
        ],
        "maxValue": 20,
        "currentValue": 0,
        "status": "PASSED"
      },
      {
        "enabled": true,
        "scannerTypes": [
          "SAST"
        ],
        "severities": [
          "MEDIUM"
        ],
        "maxValue": 10,
        "currentValue": 80,
        "status": "FAILED"
      },
      {
        "enabled": true,
        "scannerTypes": [
          "DAST"
        ],
        "severities": [
          "MEDIUM"
        ],
        "maxValue": 10,
        "currentValue": 0,
        "status": "PASSED"
      },
      {
        "enabled": true,
        "scannerTypes": [
          "SCA"
        ],
        "severities": [
          "MEDIUM"
        ],
        "maxValue": 40,
        "currentValue": 0,
        "status": "PASSED"
      },
      {
        "enabled": true,
        "scannerTypes": [
          "SAST"
        ],
        "severities": [
          "LOW"
        ],
        "maxValue": 20,
        "currentValue": 106,
        "status": "FAILED"
      },
      {
        "enabled": true,
        "scannerTypes": [
          "DAST"
        ],
        "severities": [
          "LOW"
        ],
        "maxValue": 20,
        "currentValue": 0,
        "status": "PASSED"
      },
      {
        "enabled": true,
        "scannerTypes": [
          "SCA"
        ],
        "severities": [
          "LOW"
        ],
        "maxValue": 50,
        "currentValue": 0,
        "status": "PASSED"
      }
    ],
    "errorMessage": ""
  }
}