Перейти к содержанию

Security scan в CI

Подключение

Для проектов, которые используют universal-pipeline.yaml, security scan уже входит в общий темплейт. Ничего отдельно подключать не нужно.

Если проект подключает common-ci вручную, добавьте в .gitlab-ci.yml:

include:
  - project: generic/common-ci
    ref: apps-business
    file:
      - /base.yaml
      - /secscans.yaml
      - /manual-scan.yaml

Если проект не подключает /base.yaml, в stages должны быть как минимум указаны:

stages:
  - prebuild-secscan
  - build
  - postbuild-secscan
  - sec-report
  - manual-scan

Обязательные переменные для работы сканера:

variables:
  ENABLE_BUILD_IMAGE: "true"
  RELEASE_NAME: my-service
  STAND: prod

В universal-pipeline.yaml build джоба формирует имя образа так:

IMAGE_NAME: ${CR}/${RELEASE_NAME}:${STAND}_${CI_COMMIT_SHORT_SHA}

Если ENABLE_BUILD_IMAGE=false, не задан RELEASE_NAME, или проект не передает IMAGE_NAME/SEC_IMAGE_NAME, postbuild image scanners не смогут понять, какой образ сканировать. В этом случае Trivy image, Syft, Grype и Clair будут пропущены.

Пример включения сборки образа для сканирования на MR в CI/CD проекта:

workflow:
  rules:
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
      variables:
        ENABLE_BUILD_IMAGE: "true"
        RELEASE_NAME: "appname"
        STAND: "mr"

Когда запускается обычный security scan

Обычный security scan запускается только для merge request в master.

Что сканируется

До build запускается скан репозитория:

  • Trivy fs;
  • Semgrep;
  • Bandit для Python;
  • pip-audit;
  • npm audit;
  • govulncheck;
  • gosec для Go;
  • OWASP Dependency-Check.

После build запускается скан образа, если доступен IMAGE_NAME или SEC_IMAGE_NAME:

  • Trivy image;
  • Syft SBOM;
  • Grype;
  • Clair.

Финальный job sec_report_to_mr собирает Markdown/PDF отчеты и пишет или обновляет комментарий в MR.

Джобы на сканирование -- allow_failure: true, поэтому они не блокируют сборку. Результаты и ошибки сканеров нужно смотреть в итоговом отчете.

Ручной scan образов

Manual scan независим от обычного security scan.

Он запускается только вручную через Build -> Pipelines -> New Pipeline и только если задана переменная:

  • MANUAL_SCAN_IMAGES
  • или SEC_SCAN_IMAGES

Пример значения:

cr.yandex/crp3ccidau046kdj8g9q/backend:prod_f8b09644 cr.yandex/crp3ccidau046kdj8g9q/redis:latest

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

Manual scan генерирует Markdown/PDF отчеты по каждому образу и сохраняет их в artifacts.