Files
cosign-images/README.md
Vassiliy Yegorov c04e161cbc
All checks were successful
build, sign and push / build-and-sign (push) Successful in 28s
add pic
2026-03-26 20:25:54 +07:00

107 lines
4.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Cosign Image Signing + Kyverno Policy
## Описание
Демонстрация полного цикла безопасного деплоя контейнеров: сборка кастомного nginx-образа, криптографическая подпись через Cosign (Sigstore), деплой в Kubernetes через Helm и валидация подписи политикой Kyverno.
![Workflow](docs/pic.png)
---
## Структура проекта
```
.
├── .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