Supply Chain Security: от кода до запущенного пода¶
В главе «DevSecOps и SRE» мы говорили про общие принципы безопасности. Но один аспект заслуживает отдельной главы: supply chain security — защита цепочки поставки кода от репозитория до запущенного контейнера в проде. Это стало критически важным после инцидентов вроде SolarWinds и Log4Shell, и в 2026 году это baseline, а не опция.
Что такое supply chain атака¶
Цепочка поставки ПО включает: - Код, который пишут ваши разработчики - Зависимости (npm, PyPI, Maven, Cargo) - Базовые образы (Docker Hub, ghcr.io) - CI/CD система (GitLab CI, GitHub Actions) - Реестр артефактов (Docker Registry, Harbor) - Инструменты сборки (Make, Bazel, Packer) - Сама инфраструктура (k8s, cloud)
Атака может произойти на любом этапе. Цель злоумышленника — подменить компонент так, чтобы вредоносный код попал в ваш production.
Реальные примеры¶
- SolarWinds (2020) — взломан build-сервер, вредонос вшит в обновление Orion, заразил 18000 организаций включая правительство США
- Log4Shell (2021) — уязвимость в Log4j 2.x, библиотеке из миллионов Java-приложений. CVSS 10.0
- 3CX (2023) — supply chain атака через заражённый X_TRADER-бинарник в pipeline
- XZ Utils backdoor (2024) — backdoor в ssh-бинарнике через цепочку сложных изменений в open-source проекте
Уровни SLSA¶
SLSA (Supply-chain Levels for Software Artifacts) — это фреймворк от Google и OpenSSF для оценки зрелости защиты цепочки поставки. Четыре уровня:
SLSA Level 1: базовая защита¶
Требования: - Автоматизированная сборка - Provenance генерируется (метаданные о том, как собран артефакт) - Provenance подписан
Что это даёт: возможность отследить, откуда пришёл артефакт. Защита от базовых атак.
Реализация: GitHub Actions + Sigstore, GitLab CI + cosign.
SLSA Level 2: защита от tampering¶
Требования: - Hosted build platform (CI в изолированной среде) - Signed provenance - Подлинность источника проверяется
Что это даёт: защита от подмены артефакта после сборки.
Реализация: Tekton Chains, GitHub Actions с OIDC, GitLab CI с SLSA-генератором.
SLSA Level 3: высокая устойчивость¶
Требования: - Изолированная build-среда (нет доступа к секретам после сборки) - Two-party review для изменений в build pipeline - Hardened build platform
Что это даёт: защита от атак на саму CI-инфраструктуру.
Реализация: Tekton + sigstore, Hardened Jenkins, GitHub Actions с hardened runners.
SLSA Level 4: максимальная защита¶
Требования: - Reproducible builds (артефакт собирается одинаково из одинаковых исходников) - Двухфакторное подтверждение для всех изменений - Аудит безопасности build-платформы
Что это даёт: даже при компрометации одного компонента атака не проходит.
Реализация: Reproducible-builds.org, Bazel remote cache с проверкой.
Подпись артефактов: Sigstore и cosign¶
Sigstore — это набор инструментов для криптографической подписи и верификации артефактов. Главная идея: подпись привязана к identity через OIDC (например, через GitHub Actions), не нужны ручные ключи.
Cosign для контейнеров¶
# Подписать образ
cosign sign --keyless ghcr.io/myorg/myapp:v1.0.0
# Проверить подпись
cosign verify --keyless ghcr.io/myorg/myapp:v1.0.0
# В Kubernetes — Kyverno или Connaisseur
# блокируют запуск непроверенных образов
SLSA provenance attestation¶
# Генерация provenance при сборке
slsa-github-generator \
--repo myorg/myapp \
--workflow build.yml \
--output-type slsa
# Проверка provenance
slsa-verifier verify-image ghcr.io/myorg/myapp:v1.0.0 \
--provenance-path ./provenance.intoto.jsonl
SBOM: Software Bill of Materials¶
SBOM — это список всех компонентов в вашем приложении: библиотеки, версии, источники. Как список ингредиентов на упаковке еды.
Зачем нужен SBOM¶
- Реагирование на CVE. Узнали про уязвимость в
log4j 2.14.1— быстро ищем, в каких наших сервисах она есть - Compliance. Регуляторы требуют SBOM для критичного ПО (Executive Order 14028 в США, NIS2 в ЕС)
- Лицензии. Автоматически проверять лицензии всех зависимостей
Форматы SBOM¶
- SPDX (Linux Foundation) — стандарт ISO/IEC 5962:2024
- CycloneDX (OWASP) — заточен под безопасность
- Syft (Anchore) — генератор, поддерживает оба формата
Генерация SBOM¶
# Syft для контейнера
syft ghcr.io/myorg/myapp:v1.0.0 -o spdx-json > sbom.spdx.json
# Для Python-проекта
syft . -o cyclonedx-json > sbom.cdx.json
# В CI/CD пайплайне
- name: Generate SBOM
run: |
syft $IMAGE -o spdx-json > sbom.json
cosign attach sbom --sbom sbom.json $IMAGE
Сканеры зависимостей¶
SCA (Software Composition Analysis)¶
Ищут уязвимости в сторонних библиотеках:
- Snyk — коммерческий, отличная база CVE
- Dependabot (GitHub) — бесплатный, PR-ы с обновлениями
- Renovate — open source, гибкие правила
- Trivy — open source, сканирует не только зависимости, но и misconfigurations
- Grype (Anchore) — open source, быстрый
Container scanning¶
Сканируют Docker-образы на CVE:
- Trivy — лидер, бесплатный
- Snyk Container — коммерческий, хорошая интеграция
- Clair (Quay) — старая гвардия
- Grype — для Syft SBOM
Admission controllers в Kubernetes¶
Блокируют запуск непроверенных или уязвимых подов:
- Kyverno — policy engine для K8s, может требовать подписи образов, SBOM, конкретные метки
- OPA/Gatekeeper — Rego-политики
- Connaisseur — специально для проверки подписей
# Kyverno policy: требовать подписанные образы
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: require-image-signature
spec:
validationFailureAction: Enforce
rules:
- name: verify-signature
match:
resources:
kinds:
- Pod
verifyImages:
- imageReferences:
- "ghcr.io/myorg/*"
attestors:
- entries:
- keys:
publicKeys: |-
-----BEGIN PUBLIC KEY-----
...
Защита CI/CD pipeline¶
Основные угрозы¶
- Утечка секретов через логи или форки
- Tampering build-скриптов через PR от злоумышленника
- Зависимости в pipeline — actions, образы, скрипты
- Self-hosted runners скомпрометированы
Best practices¶
1. Изолированные build-среды. Каждая сборка в чистом контейнере или ephemeral VM. Никакого persistent state.
2. Защита секретов. Секреты только через secret manager (HashiCorp Vault, AWS Secrets Manager), никогда в env-переменных в скриптах.
3. Pinning зависимостей. GitHub Actions — коммитить по SHA, не по тегу. То же для Docker-образов в pipeline.
# Плохо: может быть подменён tag
- uses: actions/checkout@v4
# Хорошо: pin по SHA
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
4. Минимальные права у токенов CI. Read-only когда возможно, короткий TTL, явный scope.
5. Аудит pipeline-конфигов. Все изменения в .github/workflows/ или .gitlab-ci.yml проходят через code review с security-чеклистом.
6. Separate builds. Сборка артефакта отдельно от его деплоя. Артефакт подписан и хранится в immutable registry.
Runtime security¶
После запуска контейнера в проде:
- Tetragon/Falco (см. главу «eBPF») — runtime-детект аномалий
- Container sandboxing — gVisor, Kata Containers для изоляции от хоста
- Read-only root filesystem — нельзя записать бинарник в работающий контейнер
- Distroless образы — только runtime, без shell, без package manager
SLSA в Kubernetes через k8s-native инструменты¶
- Sigstore Policy Controller — admission controller на базе Sigstore
- Kyverno с поддержкой SLSA provenance
- Connaisseur — verification с подписями
- Tekton Chains — генерация SLSA provenance в Tekton pipeline
SBOM в Kubernetes¶
Хранение SBOM рядом с образом:
# Прикрепить SBOM к образу как attestation
cosign attach sbom --sbom sbom.json ghcr.io/myorg/myapp:v1.0.0
# В Kyverno требовать наличие SBOM
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: require-sbom
spec:
rules:
- name: check-sbom
match:
resources:
kinds:
- Pod
verifyImages:
- imageReferences: ["ghcr.io/myorg/*"]
attestors:
- entries:
- type: sbom
Compliance и регуляторика¶
- Executive Order 14028 (США, 2021) — обязательный SBOM для федерального ПО
- NIS2 (ЕС, 2024) — supply chain security как часть директивы
- ФСТЭК России — требования к защите цепочки поставки для КИИ
- ISO/IEC 27001:2022 — A.5.21 Managing information security in the ICT supply chain
Когда НЕ нужно всё сразу¶
- Пет-проект или MVP — достаточно SCA сканера и Dependabot
- Стартап без compliance-требований — SLSA Level 1 + подпись + SBOM хватит
- Корпоративное ПО с регуляторикой — SLSA Level 3-4 + admission controller + runtime security
Резюме¶
Supply chain security — это защита всего пути от кода до запущенного контейнера: - SLSA как фреймворк зрелости - Sigstore/cosign для подписи артефактов - SBOM для прозрачности зависимостей - SCA-сканеры (Trivy, Snyk) для поиска уязвимостей - Admission controllers (Kyverno, Connaisseur) для блокировки непроверенного - Runtime security (Falco, Tetragon) для защиты работающего
Начните с малого: 1. SCA-сканер в CI — Trivy или Snyk на каждый PR 2. SBOM для каждого релиза — Syft + публикация 3. Подпись контейнеров — cosign keyless 4. Admission controller — Kyverno для блокировки непроверенных
Дальше по мере зрелости: SLSA Level 2-3, runtime security, supply chain risk management.
См. также: «DevSecOps и SRE», «Инфраструктура как код», «Chaos Engineering», «Kubernetes-native reliability», «eBPF».