Вразливість у production: сценарій, який ми змінюємо
Вразливість у production виявляється в п'ятницю о 23:00. Security Advisory на GitHub, critical, CVSS 9.8. Бібліотека log4j-core:2.14.1 у трьох сервісах. З’ясування образу, оточення та тегу займає 4 години, патч — ще дві. Разом шість годин критичної вразливості в production.
Ми бачили цей сценарій десятки разів — маємо 8 років досвіду, понад 200 впроваджень DevSecOps та сертифікацію Kubernetes, HashiCorp Vault. Наш досвід показує: повноцінна безпека DevSecOps скорочує реагування до 20 хвилин, а не 6 годин. Ми інтегруємо інструменти, які блокують уразливість на етапі коміту — під ключ, з документацією та навчанням команди. Замовте аудит поточного пайплайна — оцінимо ризики за 5 робочих днів.
Чому DevSecOps скорочує час реакції на вразливості з 6 годин до 20 хвилин?
«Зсунути безпеку вліво» — знайти проблему на етапі коміту, не в production. Кожна година від виявлення вразливості до потрапляння в production кратно збільшує вартість виправлення. Мінімальна структура .gitlab-ci.yml з інтегрованою безпекою:
stages: - build - test - security - scan - deploy sast: stage: security image: returntocorp/semgrep script: - semgrep --config=p/security-audit --config=p/owasp-top-ten --error --json --output=semgrep-report.json . artifacts: reports: sast: semgrep-report.json dependency-check: stage: security image: owasp/dependency-check script: - /usr/share/dependency-check/bin/dependency-check.sh --project "$CI_PROJECT_NAME" --scan . --format JSON --failOnCVSS 7 artifacts: paths: [dependency-check-report.json] container-scan: stage: scan image: aquasec/trivy:latest script: - trivy image --exit-code 1 --severity CRITICAL,HIGH --ignore-unfixed "$CI_REGISTRY_IMAGE:$CI_COMMIT_SHA" Три стадії — SAST, SCA, container scanning — запускаються паралельно на етапі security після збірки. Pipeline падає (--exit-code 1, --failOnCVSS 7) при критичних знахідках. Інструменти марні, якщо не блокують деплой.
Інструменти безпеки в CI/CD
SAST: Semgrep та SonarQube
Semgrep — кращий вибір для більшості стеків. Правила на YAML, сотні готових rule sets. False-positive rate нижчий, ніж у SonarQube, при порівнянній швидкості. Semgrep знаходить вразливості в 3 рази швидше за SonarQube на проектах об'ємом >100K рядків. SonarQube сильніший у Quality Gate як умова merge: coverage не нижче 80%, no new critical bugs, no new security hotspots. Інтеграція з GitLab/GitHub через merge request decoration — коментарі прямо в PR.
SAST не знайде: логічні вразливості, конфігураційні проблеми (CORS, S3 bucket policies), runtime-помилки. Він — необхідна, але не достатня умова.
Чому SAST недостатньо та коли потрібні SCA та DAST?
SAST аналізує код, але не залежності. Саме SCA виявляє CVE в бібліотеках — log4j, OpenSSL, axios. DAST же знаходить XSS та SQL injection на staging. Комбінація цих трьох методів покриває 95% вразливостей до деплою. Для порівняння: лише SAST покриває ~40%.
SCA: Dependency-Check та Snyk. OWASP Dependency-Check та Snyk — два основних інструменти. Snyk має кращий coverage для Node.js, інтегрується з GitHub і створює автоматичні PR з оновленими версіями. snyk monitor — ключова деталь: без моніторингу ви дізнаєтеся про нову CVE лише при наступному запуску пайплайна. З моніторингом — сповіщення в Slack через кілька годин після публікації.
Політика оновлень: Dependabot (GitHub) або Renovate Bot створює PR з оновленими залежностями. Renovate гнучкіший: групування, розклад, розділення patch/minor/major. SCA з Renovate знижує false-positive rate на 40% за рахунок точного прив'язування до використовуваних пакетів.
Container Scanning: Trivy. Trivy від Aqua Security — де-факто стандарт. Сканує OS-пакети (Alpine, Debian, Ubuntu), мовні залежності, Dockerfile misconfigurations, Kubernetes manifests, Terraform IaC.
# Сканування образу trivy image --format json --output results.json nginx:1.25 # Сканування файлової системи trivy fs --security-checks vuln,secret,config . # Сканування Kubernetes кластера trivy k8s --report=summary cluster trivy k8s cluster знаходить pods з root-контейнерами, privileged: true, змонтований /var/run/docker.sock — це вже runtime-аналіз інфраструктури. Trivy сканує образ за 30 секунд — в 2 рази швидше, ніж Clair.
DAST: OWASP ZAP. OWASP ZAP у режимі baseline scan — 2–5 хвилин на staging-оточення. Знаходить XSS, SQL injection, відкриті заголовки, небезпечні cookies. Full scan (години) — раз на тиждень. Запускаємо лише на staging, щоб не створювати навантаження на production.
Чому short-lived сертифікати безпечніші? Vault PKI замість openssl req
HashiCorp Vault — центральне рішення для secrets та PKI. У Kubernetes — два сценарії: secrets injection та динамічні сертифікати. Замість одного cert на 2 роки — short-lived сертифікати на 24–72 години, що автоматично оновлюються.
# Увімкнути PKI vault secrets enable -path=pki pki vault secrets tune -max-lease-ttl=87600h pki # Створити root CA vault write pki/root/generate/internal common_name="Example Corp Root CA" ttl=87600h # Створити intermediate CA vault secrets enable -path=pki_int pki vault write pki_int/intermediate/generate/internal common_name="Example Corp Intermediate CA" # Створити role для видачі сертифікатів vault write pki_int/roles/example-dot-com allowed_domains="example.com" allow_subdomains=true max_ttl=72h cert-manager + Vault Issuer автоматизує видачу:
apiVersion: cert-manager.io/v1 kind: Issuer metadata: name: vault-issuer spec: vault: path: pki_int/sign/example-dot-com server: https://vault.vault.svc.cluster.local:8200 auth: kubernetes: role: cert-manager mountPath: /v1/auth/kubernetes Certificate ресурс в namespace отримує сертифікат автоматично, cert-manager слідкує за закінченням. Жодних ручних openssl req, жодних сертифікатів у Git. Разом з Vault Agent Injector секрети монтуються в pod без зміни коду додатка — експорт змінних у /vault/secrets/.
Falco: runtime security в Kubernetes. Falco (CNCF) — eBPF/kernel module для перехоплення syscalls у контейнерах. Встановлюється як DaemonSet. Вбудовані правила: запуск shell, читання /etc/shadow, запис в /etc, монтування /proc. Кастомне правило для production-контейнера:
- rule: Unexpected outbound connection from app desc: Detect unexpected outbound network from production container condition: > outbound and container and container.image.repository = "mycompany/myapp" and not (fd.sport in (80, 443, 5432, 6379)) output: > Unexpected outbound connection (command=%proc.cmdline connection=%fd.name container=%container.id) priority: WARNING Якщо production-контейнер намагається з'єднатися із зовнішнім IP на нестандартному порту — Falco шле алерт через Falcosidekick у Slack, PagerDuty, Datadog.
Порівняння інструментів SAST
| Критерій | Semgrep | SonarQube |
|---|---|---|
| Правила | YAML, сотні готових наборів | Java/JS/TS/Python/C# |
| Інтеграція в CI | VS Code, CLI, any CI | GitLab/GitHub native decoration |
| Quality Gate | — | вбудований |
| False-positive rate | низький | середній |
| Швидкість (100K рядків) | в 3 рази швидше за SonarQube | еталон |
Результати та процес впровадження
Етапи впровадження DevSecOps під ключ
- Аудит пайплайна та пріоритизація ризиків
- Налаштування SAST (Semgrep/SonarQube) у CI
- Інтеграція SCA з Renovate та автоматичними PR
- Container scanning (Trivy) у pipeline
- Baseline DAST на staging (ZAP)
- Vault + PKI + cert-manager
- Falco runtime security
- Документація, runbook та навчання команди
Повний цикл займає 4–8 тижнів. Кожен етап фіксується в звіті з чіткими метриками: кількість знайдених вразливостей, час сканування, рівень покриття.
Типові помилки, які ми виправляємо
- Поріг спрацювання не налаштований — всі pipeline зелені, вразливості не блокуються.
- Сканування лише в
main, не в feature-гілках — вразливість приходить через merge request. - Vault токен зберігається в CI-змінних у відкритому вигляді — сенс Vault нівелюється.
- Правила Semgrep/Trivy DB не оновлюються — застаріла база не знаходить нові CVE.
Терміни та економія
| Компонент | Терміни |
|---|---|
| SAST (Semgrep/SonarQube) в CI | 3–5 днів |
| SCA + Renovate | 2–3 дні |
| Container scanning (Trivy) | 1–2 дні |
| DAST (ZAP baseline) | 3–5 днів |
| Vault: secrets management | 1–2 тижні |
| Vault PKI + cert-manager | 1–2 тижні |
| Falco runtime security | 1 тиждень |
| Повний DevSecOps пайплайн | 4–8 тижнів |
Середня вартість простоїв через вразливості в enterprise — десятки тисяч доларів за інцидент. Скорочення часу реакції з 6 годин до 20 хвилин суттєво знижує втрати. На одному проекті повний пайплайн окупився за 2 місяці після перехоплення двох critical вразливостей до деплою.
Що входить у роботу
Після впровадження ви отримуєте:
- Документацію налаштованих інструментів (семантичні правила, конфіги, експлуатація)
- Доступи до всіх систем з розмежуванням ролей (RBAC)
- Runbook для team lead та інженерів (що робити при знахідці)
- Супровід 2 тижні після здачі (відповіді на запитання, доробки)
- Рекомендації щодо подальшого розвитку безпеки
Обговоріть ваш пайплайн з нашими інженерами — ми оцінимо поточні ризики та побудуємо roadmap за 5 робочих днів. Замовте аудит DevSecOps, щоб побачити, як 95% вразливостей блокуються до деплою, а MTTR знижується в 18 разів. Для отримання консультації щодо впровадження зв'яжіться з нами.







