Supply Chain Security

Главная тема DevSecOps после 2021. SolarWinds, Log4Shell, xz-utils backdoor — все эти инциденты — атаки на supply chain. Защита цепочки поставки ПО стала обязательной.

Что такое supply chain в ПО

Любое современное приложение состоит из тысяч компонентов: open source библиотеки, базовые контейнеры, инструменты сборки, CI/CD, registries. Каждое звено — потенциальная атака.

developer → код → CI build → dependencies → image → registry → deploy → runtime ↑ ↑ ↑ ↑ ↑ ↑ ↑ signed hermetic verified SBOM signed verified runtime commits build deps image signature detection

Главные угрозы

  1. Скомпрометированный maintainer (как в xz-utils 2024)
  2. Уязвимости в зависимостях (Log4Shell 2021)
  3. Typosquatting — пакет с похожим именем (request vs requests)
  4. Dependency confusion — public пакет перебивает internal
  5. Compromised CI/CD (SolarWinds 2020)
  6. Container image poisoning
  7. Compromised package registry

Решения: 4 столпа

1. SBOM — Software Bill of Materials

Полный список всех компонентов в твоём приложении. «Что внутри коробки».

Форматы

Генерация

# 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
Зачем SBOM

В 2021 при Log4Shell компании за часы перебирали тысячи приложений: «У нас log4j? Какая версия?». С SBOM — это запрос «grep log4j *.sbom» = минуты.

Регуляторы (US Executive Order 14028, EU Cyber Resilience Act) требуют SBOM для критичных продуктов.

2. Sigstore — подпись artifacts

Бесплатная экосистема Linux Foundation для подписи open source.

Компоненты

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 2Hosted build platform (не локально на машине разраба). Provenance подписан.
SLSA 3Source/build платформа trusted. Provenance authenticated и unforgeable. Цель для большинства.
SLSA 4Two-person review. Hermetic builds. Reproducible builds. Очень сложно.

GitHub Actions + Cosign + provenance attestation = быстро доходишь до SLSA 3.

4. Dependency management

Сканирование

Pinning

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                                │
└─────────────────────────────────────────────┘

Ресурсы