Supply Chain Security
Главная тема DevSecOps после 2021. SolarWinds, Log4Shell, xz-utils backdoor — все эти инциденты — атаки на supply chain. Защита цепочки поставки ПО стала обязательной.
Что такое supply chain в ПО
Любое современное приложение состоит из тысяч компонентов: open source библиотеки, базовые контейнеры, инструменты сборки, CI/CD, registries. Каждое звено — потенциальная атака.
Главные угрозы
- Скомпрометированный maintainer (как в xz-utils 2024)
- Уязвимости в зависимостях (Log4Shell 2021)
- Typosquatting — пакет с похожим именем (
requestvsrequests) - Dependency confusion — public пакет перебивает internal
- Compromised CI/CD (SolarWinds 2020)
- Container image poisoning
- Compromised package registry
Решения: 4 столпа
1. SBOM — Software Bill of Materials
Полный список всех компонентов в твоём приложении. «Что внутри коробки».
Форматы
- SPDX (Linux Foundation) — стандарт ISO
- CycloneDX (OWASP) — широкое использование в инструментах
Генерация
# Syft — стандарт для SBOM
syft myapp:1.0 -o spdx-json > sbom.spdx.json
syft myapp:1.0 -o cyclonedx-json > sbom.cdx.json
# Распространение как OCI artifact
cosign attach sbom --sbom sbom.spdx.json myapp:1.0
# Сканирование SBOM на CVE
grype sbom:./sbom.spdx.json
В 2021 при Log4Shell компании за часы перебирали тысячи приложений: «У нас log4j? Какая версия?». С SBOM — это запрос «grep log4j *.sbom» = минуты.
Регуляторы (US Executive Order 14028, EU Cyber Resilience Act) требуют SBOM для критичных продуктов.
2. Sigstore — подпись artifacts
Бесплатная экосистема Linux Foundation для подписи open source.
Компоненты
- Cosign — CLI для подписи container images, blobs, SBOM
- Fulcio — Certificate Authority. Выдаёт short-lived сертификаты (10 минут) на основе OIDC identity. Никаких private keys для хранения!
- Rekor — публичный transparency log. Все подписи туда заносятся. Аналог Certificate Transparency для веба.
- Gitsign — подпись git commits через OIDC
Keyless signing в CI
# GitHub Actions подписывает образ своим OIDC token
name: build
on: push
permissions:
id-token: write # для OIDC
packages: write # для GHCR
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: docker/build-push-action@v6
with:
push: true
tags: ghcr.io/${{ github.repository }}:${{ github.sha }}
- uses: sigstore/cosign-installer@v3
- run: cosign sign --yes ghcr.io/${{ github.repository }}:${{ github.sha }}
Верификация
cosign verify \
--certificate-identity-regexp="^https://github.com/me/repo/" \
--certificate-oidc-issuer="https://token.actions.githubusercontent.com" \
ghcr.io/me/repo:abc123
Это значит: «образ был подписан в GitHub Actions репозитория me/repo».
Admission control
В K8s — Sigstore Policy Controller или Kyverno verifyImages. Кластер не запускает образ без подписи.
# Kyverno policy
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: verify-signed-images
spec:
validationFailureAction: Enforce
rules:
- name: verify-cosign
match:
any:
- resources: {kinds: [Pod]}
verifyImages:
- imageReferences: ["ghcr.io/myorg/*"]
attestors:
- entries:
- keyless:
subject: "https://github.com/myorg/*"
issuer: "https://token.actions.githubusercontent.com"
3. SLSA — уровни зрелости
Supply-chain Levels for Software Artifacts. Фреймворк от Google + OpenSSF.
| Уровень | Требования |
|---|---|
| SLSA 1 | Документированный build process. Provenance (метаданные сборки). |
| SLSA 2 | Hosted build platform (не локально на машине разраба). Provenance подписан. |
| SLSA 3 ⭐ | Source/build платформа trusted. Provenance authenticated и unforgeable. Цель для большинства. |
| SLSA 4 | Two-person review. Hermetic builds. Reproducible builds. Очень сложно. |
GitHub Actions + Cosign + provenance attestation = быстро доходишь до SLSA 3.
4. Dependency management
Сканирование
- Snyk, Trivy, Grype, OWASP Dependency-Check — на каждый PR
- Dependabot / Renovate — авто-PR с обновлениями
- Block PR при High/Critical CVE — но не зацикливайся (fix-or-suppress)
Pinning
- Pin версии в
requirements.txt,package-lock.json,Cargo.lock - Pin Docker base images по digest:
FROM python@sha256:abc123... - Pin GitHub Actions по SHA, не tag
Private registry
Не тяни напрямую из публичных npm/PyPI. Прокси через Artifactory, Sonatype Nexus, Harbor — с scanning и approval.
Vendoring
Для самых критичных — храни копию зависимостей в своём репо (Go modules vendor, npm vendor).
Полный pipeline supply chain security
┌─────────────────────────────────────────────┐
│ Source │
│ ✓ Signed commits (Gitsign) │
│ ✓ Branch protection + 2-person review │
│ ✓ CODEOWNERS │
└─────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────┐
│ Build (CI) │
│ ✓ Hermetic (без интернета для сборки) │
│ ✓ Pinned dependencies (lockfiles) │
│ ✓ SAST + SCA + secrets scan │
│ ✓ SBOM generated (Syft) │
│ ✓ Provenance generated (SLSA) │
│ ✓ Image signed (Cosign keyless) │
└─────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────┐
│ Registry │
│ ✓ Vulnerability scan on push │
│ ✓ Retention policy │
│ ✓ Access control │
└─────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────┐
│ Deploy (K8s) │
│ ✓ Admission: verify signature (Kyverno) │
│ ✓ Admission: verify SBOM │
│ ✓ Pod Security Standards │
└─────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────┐
│ Runtime │
│ ✓ Falco / Tetragon runtime detection │
│ ✓ Continuous CVE scanning │
│ ✓ Audit logs │
└─────────────────────────────────────────────┘
Ресурсы
- slsa.dev
- sigstore.dev
- CISA SBOM resources
- OpenSSF — Open Source Security Foundation
- Doc: GitHub Supply Chain blog