All checks were successful
build, sign and push / build-and-sign (push) Successful in 34s
106 lines
4.4 KiB
Markdown
106 lines
4.4 KiB
Markdown
# 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
|