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.