Перейти к основному контенту
Tech Path Finder
КурсыИнтервьюКод-ревьюБлог
Tech Path Finder

Персонализированный путеводитель в IT. Квизы, мок-интервью, код ревью и аналитика прогресса.

@potapov_me

Платформа

  • Курсы
  • Прогресс
  • Мок-интервью
  • Код ревью
  • Живое ревью с ИИ
  • Тренажёр переговоров
  • Закладки

Контент

  • Блог
  • Главная
  • Обратная связь

Компания

  • О проекте
  • Тарифы
  • Условия использования
  • Конфиденциальность
  • Согласие на обработку данных
  • Cookie
  • Реквизиты

Аккаунт

  • Войти
  • Зарегистрироваться
  • Профиль

© 2026 Tech Path Finder. Все права защищены.

·ИП Потапов К.С.·Политика конфиденциальности·
Сделано с ❤️ в России
  1. Supply chain security
supply_chain

Supply chain security

Безопасность цепочки поставок, подписывание образов, SLSA.

Supply Chain Security

Безопасность цепочки поставок ПО критична в эпоху зависимостей и сторонних компонентов. Изучите подписывание образов, SLSA и защиту от атак.

#Что такое Supply Chain Security?

Supply Chain Security — защита программного обеспечения на всех этапах цепочки поставок: от разработки до развёртывания.

Угрозы supply chain:

  • Компрометация зависимостей (dependency confusion, typosquatting)
  • Malicious обновления базовых образов
  • Подмена артефактов в реестре
  • Компрометация CI/CD пайплайна
  • Insider threats в командах разработчиков

Известные атаки:

  • SolarWinds (2020) — компрометация обновления ПО
  • Codecov (2021) — утечка secrets через CI/CD
  • Log4j (2021) — уязвимость в популярной зависимости

#SLSA: Supply-chain Levels for Software Artifacts

#Уровни SLSA

SLSA — фреймворк от Google для обеспечения целостности цепочки поставок.

┌─────────────────────────────────────────────────┐
│              SLSA Levels                        │
├─────────────────────────────────────────────────┤
│  Level 1: Documented процесс сборки            │
│  Level 2: Версионированный исходный код        │
│  Level 3: Изолированная среда сборки           │
│  Level 4: Двухфакторная проверка изменений     │
└─────────────────────────────────────────────────┘

#SLSA Level 1: Documented Build

Требования:

  • Процесс сборки задокументирован
  • Артефакты могут быть воспроизведены

Пример:

# .github/workflows/build.yml name: Build on: push: branches: [main] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Build run: | npm ci npm run build - name: Upload artifact uses: actions/upload-artifact@v4 with: name: dist path: dist/

#SLSA Level 2: Versioned Source

Требования:

  • Исходный код в системе версионирования
  • Артефакты связаны с конкретным коммитом

Пример:

jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: fetch-depth: 0 # Полная история - name: Record source version run: | echo "COMMIT_SHA=${{ github.sha }}" >> $GITHUB_ENV echo "BRANCH=${{ github.ref_name }}" >> $GITHUB_ENV - name: Build with version info run: | npm run build -- --version $COMMIT_SHA

#SLSA Level 3: Isolated Build Environment

Требования:

  • Сборка в изолированной среде
  • Защита от влияния других сборок
  • Непрерывность сборки (no human intervention)

Пример с изоляцией:

jobs: build: runs-on: ubuntu-latest container: image: node:20-alpine options: --user 1001 --cap-drop=ALL steps: - uses: actions/checkout@v4 - name: Install dependencies run: npm ci --ignore-scripts - name: Build run: npm run build - name: Generate SLSA provenance uses: slsa-framework/slsa-github-generator/.github/workflows/generator_generic_slsa3.yml@v2.0.0 with: base64-subjects: "${{ hashFiles('dist/**') }}" upload-assets: true

#SLSA Level 4: Two-person Review

Требования:

  • Двухфакторная аутентификация
  • Review изменений перед мержем
  • Protected branches

Настройка в GitHub:

  1. Settings → Branches → Add branch protection rule
  2. Branch name pattern: main
  3. Require pull request reviews before merging: ✅
  4. Require approvals: 2
  5. Require status checks to pass before merging: ✅
  6. Require branches to be up to date before merging: ✅
  7. Require conversation resolution before merging: ✅

#Sigstore и Cosign: Подписывание артефактов

#Что такое Sigstore?

Sigstore — проект Linux Foundation для подписывания и верификации артефактов.

Компоненты:

  • Cosign — подписывание контейнеров и артефактов
  • Fulcio — CA для выдачи сертификатов
  • Rekor — прозрачный лог для аудита
  • Keyless signing — без управления ключами

#Установка Cosign

# macOS brew install cosign # Linux wget https://github.com/sigstore/cosign/releases/latest/download/cosign-linux-amd64 sudo mv cosign-linux-amd64 /usr/local/bin/cosign chmod +x /usr/local/bin/cosign # GitHub Actions uses: sigstore/cosign-installer@v3

#Keyless Signing с Cosign

Преимущества keyless:

  • Не нужно управлять ключами
  • Короткоживущие сертификаты (10 минут)
  • Автоматическая верификация через OIDC

Подписывание образа:

jobs: build-and-sign: runs-on: ubuntu-latest permissions: id-token: write # Для keyless signing contents: read steps: - uses: actions/checkout@v4 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Login to GHCR uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Build and push uses: docker/build-push-action@v5 with: push: true tags: ghcr.io/my-org/my-app:${{ github.sha }} digest-file: ./digest.txt - name: Install Cosign uses: sigstore/cosign-installer@v3 - name: Sign image run: | cosign sign --yes \ ghcr.io/my-org/my-app@$(cat ./digest.txt)

#Верификация образа

Проверка подписи:

# Верификация по OIDC issuer cosign verify \ --certificate-identity-regexp="https://github.com/my-org/my-app/.github/workflows/build.yml" \ --certificate-oidc-issuer="https://token.actions.githubusercontent.com" \ ghcr.io/my-org/my-app:latest # Проверка с выводом сертификата cosign verify \ --certificate-identity-regexp=".*" \ --certificate-oidc-issuer=".*" \ --insecure-ignore-tlog \ ghcr.io/my-org/my-app:latest \ --output-cert certificate.pem

#Signing с собственными ключами

Генерация ключевой пары:

cosign generate-key-pair # Создаёт cosign.key и cosign.pub

Подписывание:

cosign sign --key cosign.key ghcr.io/my-org/my-app:latest

Верификация:

cosign verify --key cosign.pub ghcr.io/my-org/my-app:latest

Хранение ключа в KMS:

# AWS KMS cosign sign --key awskms:///arn:aws:kms:us-east-1:123456789012:key/uuid ghcr.io/my-org/my-app:latest # GCP KMS cosign sign --key gcpkms://projects/my-project/locations/global/keyRings/my-kr/cryptoKeys/my-key ghcr.io/my-org/my-app:latest # Azure Key Vault cosign sign --key azurekms://my-vault.vault.azure.net/my-key ghcr.io/my-org/my-app:latest

#SLSA Provenance

#Что такое Provenance?

Provenance — документ, описывающий как, где и когда был собран артефакт.

Формат: in-toto attestation (SLSA v1.0)

Структура:

{ "_type": "https://in-toto.io/Statement/v1", "subject": [ { "name": "my-app", "digest": { "sha256": "abc123..." } } ], "predicateType": "https://slsa.dev/provenance/v1", "predicate": { "buildDefinition": { "buildType": "https://github.com/slsa-framework/slsa-github-generator/.github/workflows/generator_generic_slsa3.yml@v2.0.0", "externalParameters": {...}, "resolvedDependencies": [...] }, "runDetails": { "builder": {...}, "metadata": {...} } } }

#Генерация Provenance в GitHub Actions

Использование slsa-github-generator:

name: Build with SLSA on: push: tags: - 'v*' jobs: build: runs-on: ubuntu-latest outputs: digest: ${{ steps.build.outputs.digest }} steps: - uses: actions/checkout@v4 - name: Build id: build run: | docker build -t my-app . docker push ghcr.io/my-org/my-app:latest echo "digest=$(docker inspect --format='{{index .RepoDigests 0}}' my-app)" >> $GITHUB_OUTPUT generate-provenance: needs: build permissions: actions: read id-token: write contents: read uses: slsa-framework/slsa-github-generator/.github/workflows/generator_container_slsa3.yml@v2.0.0 with: image: ghcr.io/my-org/my-app digest: ${{ needs.build.outputs.digest }} registry-username: ${{ github.actor }} secrets: registry-password: ${{ secrets.GITHUB_TOKEN }}

#Верификация Provenance

Утилита slsa-verifier:

# Установка wget https://github.com/slsa-framework/slsa-verifier/releases/latest/download/slsa-verifier-linux-amd64 chmod +x slsa-verifier-linux-amd64 # Верификация ./slsa-verifier-linux-amd64 verify-image \ ghcr.io/my-org/my-app:latest \ --source-uri github.com/my-org/my-app \ --source-tag v1.0.0

#Защита зависимостей

#Dependency Review в GitHub

Включение:

  1. Settings → Code security and analysis
  2. Dependency graph: ✅
  3. Dependabot alerts: ✅
  4. Dependabot security updates: ✅

Workflow для проверки:

name: Dependency Review on: pull_request: branches: [main] jobs: dependency-review: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Dependency Review uses: actions/dependency-review-action@v4 with: fail-on-severity: moderate deny-licenses: GPL-3.0, AGPL-3.0

#Сканирование уязвимостей

Trivy для контейнеров:

jobs: scan: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Build image run: docker build -t my-app . - name: Run Trivy uses: aquasecurity/trivy-action@master with: image-ref: my-app format: 'sarif' output: 'trivy-results.sarif' severity: 'CRITICAL,HIGH' - name: Upload to GitHub Security uses: github/codeql-action/upload-sarif@v3 with: sarif_file: 'trivy-results.sarif'

Snyk для зависимостей:

jobs: security: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Run Snyk uses: snyk/actions/node@master env: SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }} with: args: --severity-threshold=high

#SBOM (Software Bill of Materials)

Генерация SBOM:

jobs: sbom: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Generate SBOM uses: anchore/sbom-action@v0 with: format: spdx-json output-file: sbom.json - name: Upload SBOM uses: actions/upload-artifact@v4 with: name: sbom path: sbom.json

Верификация SBOM:

# Проверка SBOM через cosign cosign verify-blob \ --certificate-identity-regexp=".*" \ --certificate-oidc-issuer=".*" \ --signature sbom.sig \ sbom.json

#Best Practices

#1. Подписывайте все артефакты

# Всегда подписывайте образы перед публикацией - name: Sign image run: cosign sign --yes $IMAGE_DIGEST

#2. Используйте SLSA Level 3+

# Изолированная среда container: image: node:20-alpine options: --user 1001 --cap-drop=ALL # Запрет interactive shell env: DEBIAN_FRONTEND: noninteractive

#3. Верифицируйте перед деплоем

jobs: deploy: runs-on: ubuntu-latest steps: - name: Verify image signature run: | cosign verify \ --certificate-identity-regexp="https://github.com/my-org/my-app/.github/workflows/build.yml" \ --certificate-oidc-issuer="https://token.actions.githubusercontent.com" \ ghcr.io/my-org/my-app:latest || exit 1 - name: Deploy run: ./deploy.sh

#4. Мониторьте зависимости

# Еженедельный скан on: schedule: - cron: '0 0 * * 0' # Каждое воскресенье jobs: scan: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Trivy scan run: trivy fs --severity HIGH,CRITICAL .

#5. Используйте private dependencies

# Настройка .npmrc для private registry - name: Setup npm run: | echo "//npm.pkg.github.com/:_authToken=${{ secrets.GITHUB_TOKEN }}" > .npmrc echo "@my-org:registry=https://npm.pkg.github.com" >> .npmrc

#Инструменты Supply Chain Security

ИнструментНазначение
Sigstore/CosignПодписывание и верификация
SLSA GeneratorГенерация provenance
SLSA VerifierВерификация provenance
TrivyСканирование уязвимостей
SnykSecurity scanning зависимостей
Anchore/SyftГенерация SBOM
in-totoФреймворк для supply chain
GrafeasAPI для артефактов

Далее: Кэширование зависимостей