# Cosign Image Signing + Kyverno Policy ## Описание Демонстрация полного цикла безопасного деплоя контейнеров: сборка кастомного nginx-образа, криптографическая подпись через Cosign (Sigstore), деплой в Kubernetes через Helm и валидация подписи политикой Kyverno. --- ## Структура проекта ``` . ├── .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 ```sh 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 ```sh kubectl apply -f policies/kyverno-image-signature-policy.yaml ``` Политика требует подпись для всех образов в namespace `cosign-test`. ### 5. Деплой в Kubernetes ```sh helm upgrade -i -n cosign-test cosign-test helm/nginx ``` --- ## Требования - Kubernetes кластер с установленным Kyverno - Gitea с поддержкой Actions или GitLab CI/CD - Cosign (sigstore) - Helm 3