Skip to content

Free Vulnerability Monitoring for npm Dependencies

Summary

Бесплатный мониторинг уязвимостей npm-зависимостей для partizap-frontend и partizap-backend (2 приватных репо, self-hosted GitLab). CI-гейт блокирует пайплайн, фоновый мониторинг алертит о новых CVE.

Decisions

ВопросРешение
CI-гейтTrivy (30+ источников уязвимостей)
Фоновый мониторингTrivy scheduled pipeline (ежедневно 09:00)
Автообновление зависимостейОтложено (Renovate, отдельная задача)
Порог серьёзностиCritical + High (CVSS 7.0+) блокируют пайплайн
НотификацииTelegram + YouTrack
ИнфраструктураПолностью на VPS, zero external SaaS dependencies

Architecture

Components

КомпонентИнструментРоль
CI-гейтTrivyБлокирует пайплайн при critical/high уязвимостях в package-lock.json
Фоновый мониторингTrivy (scheduled)Ежедневно сканирует зависимости, алертит при новых CVE через Telegram + YouTrack
НотификацииСкриптTelegram-бот + YouTrack issue при фейле CI (с дедупликацией)

CI-Gate: Trivy

Стейдж: validate (рядом с lint, typecheck, test).

Job

yaml
security:audit:
  stage: validate
  image: aquasec/trivy:latest
  script:
    - trivy fs
        --scanners vuln
        --severity HIGH,CRITICAL
        --exit-code 1
        --format json
        --output trivy-report.json
        .
    - trivy fs
        --scanners vuln
        --severity HIGH,CRITICAL
        --exit-code 1
        .
  artifacts:
    when: on_failure
    paths:
      - trivy-report.json
    expire_in: 30 days
  rules:
    - if: $CI_COMMIT_BRANCH == "develop"
    - if: $CI_MERGE_REQUEST_ID

Logic

  • Первый trivy fs — JSON-отчёт для артефактов и скрипта нотификаций
  • Второй — табличный вывод в лог пайплайна + exit-code 1 при находках
  • Артефакт сохраняется только при фейле (when: on_failure)
  • Запускается на пуше в develop и в merge request пайплайнах

Allowlisting

Файл .trivyignore в корне репо для временного игнорирования неисправимых уязвимостей:

# .trivyignore
# Review by 2026-04-15: no fix available for transitive dep
CVE-2026-XXXXX

Background Monitoring: Trivy Scheduled Pipeline

Решение изменено (2026-03-23): Snyk free tier блокирует snyk monitor с datacenter IP (VPS). Заменено на Trivy scheduled pipeline — zero external dependencies, тот же уровень покрытия.

Scheduled pipeline запускает security:audit (Trivy) + security:notify (Telegram + YouTrack) ежедневно. При обнаружении уязвимостей — те же нотификации, что и при обычном CI-фейле.

Как это работает

  1. GitLab Scheduled Pipeline (ежедневно 09:00, ветка develop)
  2. security:audit — Trivy сканирует package-lock.json
  3. При находках (exit code 1) → security:notify отправляет алерты
  4. Все остальные develop-джобы (validate, build, deploy, cleanup) исключены из schedule

Setup

  1. GitLab → CI/CD → Schedules → New Schedule
  2. Description: Daily security scan
  3. Interval: 0 9 * * *
  4. Branch: develop

Snyk — причина отказа

Snyk free tier: snyk monitor возвращает 403 с datacenter IP (VPS). OAuth-токен работает только локально (short-lived, требует browser auth). API-токен (UUID) не поддерживает monitor endpoint. Решение: полностью заменить Snyk на Trivy scheduled.

Notifications: Telegram + YouTrack

Скрипт scripts/notify-vulnerabilities.sh вызывается в CI после Trivy при фейле.

Job

yaml
security:notify:
  stage: validate
  image: alpine:latest
  needs:
    - job: security:audit
      artifacts: true
  before_script:
    - apk add --no-cache curl jq
  script:
    - sh scripts/notify-vulnerabilities.sh trivy-report.json
  rules:
    - if: $CI_PIPELINE_SOURCE == "schedule"
      when: on_failure
    - if: $CI_COMMIT_BRANCH == "develop"
      when: on_failure

Script Features

  • Отдельный YouTrack issue на каждую уязвимость (CVE ID + package name в заголовке)
  • Ссылки на CVE в описании issue
  • YouTrack ссылки в Telegram-сообщении
  • Дедупликация: перед созданием issue — поиск по summary в YouTrack (State: Unresolved). Если issue уже есть — пропускается

CI Variables

VariableЗначениеMasked
TG_BOT_TOKENТокен Telegram-ботаYes
TG_CHAT_IDID рабочего чатаNo
YOUTRACK_URLhttps://youtrack.partizap.ruNo
YOUTRACK_TOKENPermanent tokenYes
YOUTRACK_PROJECT_IDID проекта в YouTrackNo

Дедупликация YouTrack: скрипт проверяет наличие открытого issue с таким же CVE ID и package name. Если issue уже существует (State: Unresolved) — пропускает создание, добавляет ссылку в Telegram-сообщение.

Implementation Order

Phase 1 — CI-gate (1 hour)

  1. Добавить джобу security:audit (Trivy) в .gitlab-ci.yml
  2. Создать .trivyignore (пустой)
  3. Пуш в develop → убедиться что джоба работает
  4. Повторить для partizap-backend

Phase 2 — Notifications (1 hour)

  1. Создать Telegram-бота через @BotFather, получить токен
  2. Добавить scripts/notify-vulnerabilities.sh
  3. Прописать CI Variables (TG_BOT_TOKEN, TG_CHAT_ID, YOUTRACK_URL, YOUTRACK_TOKEN, YOUTRACK_PROJECT_ID)
  4. Добавить джобу security:notify
  5. Тест: временно понизить порог до MEDIUM, убедиться что Telegram и YouTrack получают алерты

Phase 3 — Background monitoring (15 min)

  1. Добавить schedule rules к security:audit + security:notify
  2. Исключить остальные develop-джобы из scheduled pipeline
  3. Создать Scheduled Pipeline в GitLab (ежедневно 09:00, ветка develop)
  4. Добавить дедупликацию YouTrack issues в notify-скрипт

Snyk отклонён: free tier блокирует monitor с datacenter IP.

Total: ~2.5 hours

Each phase is independent and works on its own.

Future: Renovate

Автоматическое обновление зависимостей через Renovate (self-hosted bot) — отдельная задача. Требует проработки интеграции с YouTrack (привязка MR к issue).