Заметки о Kubernetes Security и DevSecOps

DevSecOps для самых маленьких: 7\n. Как узнать, что курьер донёс именно твою посылку

9 октября 2026 г., 3 минуты

В Dota у каждого героя есть ослик-курьер, который таскает предметы с базы на линию. Перехватили курьера — предметы ушли врагу. Подсунули тебе курьера с бомбой вместо посылки — ты не сразу поймёшь, что что-то не так (да, такого не бывает, метафора). Supply chain примерно про это. Ты хочешь быть уверен, что до тебя добежал твой курьер и что в посылке лежит то, что ты заказывал.

Supply chain — цепочка поставки: всё, что происходит с образом от сборки до деплоя. Ты собрал образ в пайплайне, он лёг в registry, потом его достали и задеплоили в кластер. Это точно тот самый образ? Его не подменили по дороге, не добавили лишний слой, не вшили вредоносное? Supply chain отвечает на три вопроса: что внутри образа, откуда он взялся и не изменился ли по дороге.

Три опоры доверия
SBOM — список компонентов образа: базовый слой, библиотеки, пакеты, версии. Это опись посылки. Без неё курьер принёс коробку, а что в ней, непонятно. SBOM — бумажка, где написано: три байта, два кольца, один амулет.

Подпись образа. Ты подписываешь образ при сборке, а при деплое проверяешь подпись. Это татуировка на осле-курьере: нет твоей татуировки — не твой курьер. Важно: подпись подтверждает источник и неизменность образа, но не то, что внутри нет вредоносного кода.

Provenance — происхождение: из какого коммита, каким пайплайном, когда и на какой машине собран образ. Если что-то пошло не так, ты знаешь, где искать.

Почему дефолт — дыра
Обычный пайплайн: собрал, запушил в registry с тегом latest или номером. Ни подписи, ни SBOM, что внутри — не знаешь. Потом в базовом образе находят критическую CVE. Или кто-то получает доступ к registry и подменяет образ. Или в зависимости сидит вредоносный код, который просыпается позже. Самое неприятное, что узнаёшь об этом, когда уже поздно. Дефолт — это «собрал и запустил», а не «собрал, проверил, подписал, проверил ещё раз и только потом запустил».

Это не теория
event-stream (npm, 2018). В популярную библиотеку попала вредоносная зависимость, нацеленная на кошельки Copay.
SolarWinds (2020). Вредонос вшили в обновление ПО, и тысячи компаний, включая госструктуры, получили заражённое обновление по официальному каналу.
xz-utils (2024). Бэкдор в библиотеке сжатия, который на части дистрибутивов давал доступ по SSH. Обнаружили почти случайно.
Trivy (март 2026). Подменили теги GitHub Actions и выпустили вредоносный бинарь (подробности в части 6). Даже сканер безопасности может оказаться курьером с бомбой.
С чего начать: от SBOM к проверке подписи
Возьми один образ и пройди цепочку целиком:

1. SBOM: что внутри образа
syft registry.example.com/shop/app@sha256:<digest> -o cyclonedx-json > sbom.json

2. Известные уязвимости по SBOM
grype sbom:./sbom.json

3. Подпись образа (по digest, не по тегу)
cosign generate-key-pair                      # один раз
cosign sign --key cosign.key registry.example.com/shop/app@sha256:<digest>

4. Проверка подписи
cosign verify --key cosign.pub registry.example.com/shop/app@sha256:<digest>
В CI можно подписывать без хранения ключей: Cosign умеет keyless-подпись через OIDC.

Подпись сама ничего не блокирует. Неподписанные образы отклоняет admission-контроллер, и его нужно настроить отдельно. Например, политика Kyverno (сначала в режиме аудита и в тестовом namespace):

apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: verify-image-signature
spec:
  validationFailureAction: Audit    # после проверки переключи на Enforce
  webhookTimeoutSeconds: 30
  rules:
    - name: check-signature
      match:
        any:
          - resources:
              kinds: [Pod]
      verifyImages:
        - imageReferences:
            - registry.example.com/shop/*
          attestors:
            - entries:
                - keys:
                    publicKeys: |-
                      -----BEGIN PUBLIC KEY-----
                      <публичный ключ cosign.pub>
                      -----END PUBLIC KEY-----

Инструменты: Syft (SBOM в CycloneDX или SPDX), Cosign из Sigstore (подпись и проверка), SLSA (набор требований и уровней к сборке и provenance), Grype и Trivy, Chainguard (минимальные hardened-образы). Российские: Kaspersky Container Security формирует SBOM для образа, CodeScoring управляет open source и лицензиями, AppSec.Hub — ASPM-платформа.

Однажды я сгенерировал SBOM для образа, который считался минимальным, и нашёл внутри десятки пакетов, о которых никто в команде не знал. Половина приехала транзитивно, часть вообще не использовалась, но лежала в слоях. Тогда я понял: «мы примерно знаем, что у нас в образе» — это не знание, а догадка. SBOM превращает догадку в список. С этим списком уже можно работать: смотреть CVE, выкидывать лишнее, обновлять.

Нюансы
SBOM показывает состав, но безопасность образа не доказывает.
Подпись подтверждает «собрано нами и не изменено», а не «внутри нет вредоносного кода».
Подписывай и проверяй по digest: тег можно переклеить.
Supply chain — про доверие. Пока ты не проверяешь, что именно пришло в кластер, остальные защиты держатся на вере. Можно сканировать код, но если образ подменили в registry, сканирование не поможет. Можно харденить контейнеры, но вредоносный слой харденинг не остановит. Начни с Cosign, потом Syft, потом проверка в admission. Через месяц ты будешь знать, что внутри образов и что их не подменили.

Обсуждаем статьи в Telegram-канале. Недушный ИнфоБез.

Social Media
Telegram
Powered by BS5 Simply Blog and Bludit
Navigation