Vassiliy Yegorov 5d8475f871
All checks were successful
build, sign and push / build-and-sign (push) Successful in 30s
add pic
2026-03-26 20:30:20 +07:00
2026-03-26 19:38:05 +07:00
2026-03-26 20:30:20 +07:00
2026-03-26 19:53:49 +07:00
2026-03-26 19:38:05 +07:00
2026-03-26 19:12:56 +07:00
2026-03-26 19:53:49 +07:00
2026-03-26 19:12:56 +07:00
2026-03-26 19:53:49 +07:00
2026-03-26 20:25:54 +07:00

Cosign Image Signing + Kyverno Policy

Описание

Демонстрация полного цикла безопасного деплоя контейнеров: сборка кастомного nginx-образа, криптографическая подпись через Cosign (Sigstore), деплой в Kubernetes через Helm и валидация подписи политикой Kyverno.

Workflow

Структура проекта

.
├── .gitea/workflows/
│   └── build-sign-push.yaml    # CI/CD пайплайн для Gitea Actions
├── .gitlab-ci.yml.example       # Пример CI/CD пайплайна для GitLab
├── helm/nginx/                  # Helm чарт для деплоя
│   ├── Chart.yaml
│   ├── values.yaml
│   └── templates/
│       ├── _helpers.tpl
│       ├── deployment.yaml
│       └── service.yaml
├── image/
│   ├── Dockerfile               # Кастомный nginx (non-root, порт 8080)
│   ├── nginx.conf
│   └── VERSION
├── keys/
│   ├── cosign.key                # Приватный ключ (не в git)
│   └── cosign.pub                # Публичный ключ для верификации
└── policies/
    └── kyverno-image-signature-policy.yaml  # Политика Kyverno

Как это работает

  1. Push в main → Gitea Actions запускает пайплайн
  2. Сборка → Docker-образ собирается и пушится в реестр git.realmanual.ru
  3. Подпись → Cosign подписывает образ по digest приватным ключом
  4. Верификация в CI → Cosign проверяет подпись публичным ключом
  5. Деплой → Helm разворачивает образ в namespace cosign-test
  6. Enforce → Kyverno перехватывает создание Pod, проверяет подпись образа и блокирует неподписанные

Шаги запуска

1. Генерация ключей Cosign

cosign generate-key-pair

Поместите cosign.key и cosign.pub в директорию keys/.

2. Настройка секретов CI/CD

Gitea (Settings → Secrets)

Секрет Описание
COSIGN_PRIVATE_KEY Содержимое файла cosign.key целиком (включая -----BEGIN/END-----)
COSIGN_PASSWORD Пароль от приватного ключа, заданный при cosign generate-key-pair
PUSH_TOKEN Токен доступа к реестру контейнеров

GitLab (Settings → CI/CD → Variables)

Для GitLab используйте файл .gitlab-ci.yml.example (переименуйте в .gitlab-ci.yml).

Переменная Тип Masked Protected Описание
COSIGN_PRIVATE_KEY Variable Yes Yes Содержимое файла cosign.key целиком
COSIGN_PASSWORD Variable Yes Yes Пароль от приватного ключа
REGISTRY_USER Variable No No Логин для реестра контейнеров
REGISTRY_PASSWORD Variable Yes Yes Пароль/токен для реестра контейнеров

Важно: переменные с флагом Masked не отображаются в логах джобов. Флаг Protected ограничивает доступ только защищёнными ветками (main).

3. Сборка и подпись образа

Пуш в ветку main автоматически запустит пайплайн, который соберёт, подпишет и верифицирует образ.

4. Применение политики Kyverno

kubectl apply -f policies/kyverno-image-signature-policy.yaml

Политика требует подпись для всех образов в namespace cosign-test.

5. Деплой в Kubernetes

helm upgrade -i -n cosign-test cosign-test helm/nginx

Требования

  • Kubernetes кластер с установленным Kyverno
  • Gitea с поддержкой Actions или GitLab CI/CD
  • Cosign (sigstore)
  • Helm 3
Description
No description provided
Readme 242 KiB
Languages
Dockerfile 55.9%
Smarty 44.1%