Appearance
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_IDLogic
- Первый
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-XXXXXBackground 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-фейле.
Как это работает
- GitLab Scheduled Pipeline (ежедневно 09:00, ветка
develop) security:audit— Trivy сканируетpackage-lock.json- При находках (exit code 1) →
security:notifyотправляет алерты - Все остальные develop-джобы (validate, build, deploy, cleanup) исключены из schedule
Setup
- GitLab → CI/CD → Schedules → New Schedule
- Description: Daily security scan
- Interval:
0 9 * * * - 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_failureScript 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_ID | ID рабочего чата | No |
YOUTRACK_URL | https://youtrack.partizap.ru | No |
YOUTRACK_TOKEN | Permanent token | Yes |
YOUTRACK_PROJECT_ID | ID проекта в YouTrack | No |
Дедупликация YouTrack: скрипт проверяет наличие открытого issue с таким же CVE ID и package name. Если issue уже существует (State: Unresolved) — пропускает создание, добавляет ссылку в Telegram-сообщение.
Implementation Order
Phase 1 — CI-gate (1 hour)
- Добавить джобу
security:audit(Trivy) в.gitlab-ci.yml - Создать
.trivyignore(пустой) - Пуш в develop → убедиться что джоба работает
- Повторить для
partizap-backend
Phase 2 — Notifications (1 hour)
- Создать Telegram-бота через @BotFather, получить токен
- Добавить
scripts/notify-vulnerabilities.sh - Прописать CI Variables (TG_BOT_TOKEN, TG_CHAT_ID, YOUTRACK_URL, YOUTRACK_TOKEN, YOUTRACK_PROJECT_ID)
- Добавить джобу
security:notify - Тест: временно понизить порог до MEDIUM, убедиться что Telegram и YouTrack получают алерты
Phase 3 — Background monitoring (15 min)
- Добавить schedule rules к
security:audit+security:notify - Исключить остальные develop-джобы из scheduled pipeline
- Создать Scheduled Pipeline в GitLab (ежедневно 09:00, ветка develop)
- Добавить дедупликацию 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).