5db0ab10f6bcfcad75b6877a123ea15f9930b3a9
All checks were successful
build, sign and push / build-and-sign (push) Successful in 34s
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
Как это работает
- Push в main → Gitea Actions запускает пайплайн
- Сборка → Docker-образ собирается и пушится в реестр
git.realmanual.ru - Подпись → Cosign подписывает образ по digest приватным ключом
- Верификация в CI → Cosign проверяет подпись публичным ключом
- Деплой → Helm разворачивает образ в namespace
cosign-test - 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
Languages
Dockerfile
55.9%
Smarty
44.1%