Prepare 0.1.0 for lab release: durable handlers, HTTP Compose, CI, and pulumi-tests.
- Harden DB-backed handlers and seed profiles; align client wire shapes for cluster resources, QEMU config, and node SSL fields - Serve plain HTTP on Compose :8006; keep TLS optional (--profile tls) and terminate HTTPS at Kubernetes Ingress - Add pulumi-tests (full contract surface majors 6–9 + BPG lifecycle) and make pulumi-tests - Ship bilingual docs, CHANGELOG, SECURITY, CONTRIBUTING, and GitHub Actions (make ci + Compose/Helm validation)
This commit is contained in:
@@ -0,0 +1,85 @@
|
||||
**Language / Язык:** [English](../authentication.md) | [Русский](authentication.md)
|
||||
|
||||
# Аутентификация
|
||||
|
||||
Симулятор реализует аутентификацию Proxmox-совместимыми тикетами и API-токенами
|
||||
с проверкой ACL для не-root принципалов.
|
||||
|
||||
## Вход по тикету
|
||||
|
||||
```http
|
||||
POST /api2/json/access/ticket
|
||||
Content-Type: application/x-www-form-urlencoded
|
||||
|
||||
username=root@pam&password=secret
|
||||
```
|
||||
|
||||
Успешный ответ включает:
|
||||
|
||||
- `ticket` — также устанавливается как HttpOnly cookie `PVEAuthCookie` (SameSite=Strict)
|
||||
- `CSRFPreventionToken` — обязателен для мутаций с аутентификацией по тикету
|
||||
- `username` и связанные поля идентичности
|
||||
|
||||
Тикеты подписываются HMAC с `TICKET_SIGNING_KEY`, по умолчанию истекают через два часа
|
||||
и допускают небольшой сдвиг часов в будущее.
|
||||
|
||||
### Правила CSRF
|
||||
|
||||
| Запрос | Сессия по тикету | API-токен |
|
||||
|---|---|---|
|
||||
| `GET` / `HEAD` / `OPTIONS` | Достаточно cookie (или тикета) | Заголовок `Authorization` |
|
||||
| Другие методы | Cookie **и** заголовок `CSRFPreventionToken` | CSRF **не** требуется |
|
||||
|
||||
```bash
|
||||
curl -X POST \
|
||||
-H "Cookie: PVEAuthCookie=$TICKET" \
|
||||
-H "CSRFPreventionToken: $CSRF" \
|
||||
-d '...' \
|
||||
http://localhost:8006/api2/json/nodes/pve01/qemu/100/status/start
|
||||
```
|
||||
|
||||
## API-токены
|
||||
|
||||
Формат заголовка:
|
||||
|
||||
```http
|
||||
Authorization: PVEAPIToken=USER@REALM!TOKENID=SECRET
|
||||
```
|
||||
|
||||
Секреты хранятся только как scrypt-хеши. Создание и явная регенерация возвращают
|
||||
plaintext-секрет **один раз**; list и read его никогда не выводят. Удаление токена
|
||||
немедленно его инвалидирует.
|
||||
|
||||
Привилегии токена — **пересечение** привилегий токена и эффективных (прямых +
|
||||
унаследованных) ACL владельца. Токен не может эскалировать права выше владельца.
|
||||
|
||||
## Seeded development-принципалы
|
||||
|
||||
Сидятся **каждым** профилем — включая `minimal` и после demo unload в Web UI.
|
||||
Unload уменьшает guests/nodes/storages; лабораторные принципалы и токены
|
||||
`apply_seed` всё равно вставляет:
|
||||
|
||||
| Принципал | Пароль | Токен | Примечания |
|
||||
|---|---|---|---|
|
||||
| `root@pam` | `secret` | `automation` / `automation-secret` | Полный доступ по тикету; токен всё равно ограничен при ограниченных привилегиях |
|
||||
| `auditor@pve` | `auditor-secret` | `readonly` / `readonly-secret` | Унаследованный auditor ACL — чтение OK, power ops запрещены |
|
||||
| `operator@pve` | `operator@pve-password` | `operator` / `operator-secret` | VM audit/power на `/vms` |
|
||||
| `storage@pve` | `storage@pve-password` | `storage` / `storage-secret` | Область datastore на `/storage` |
|
||||
|
||||
Эти учётные данные **только для лаборатории**. Смените или отключите их перед
|
||||
выходом в сеть за пределы вашей рабочей станции.
|
||||
|
||||
## Root vs ACL
|
||||
|
||||
Root-сессии по тикету обходят обычные проверки ACL в Proxmox-совместимом смысле,
|
||||
используемом этим симулятором. Отдельные API-токены остаются ограниченными. Тесты
|
||||
совместимости проверяют разделение привилегий для персон auditor/operator/storage.
|
||||
|
||||
## Связанные пути
|
||||
|
||||
- Тикет: `/access/ticket`
|
||||
- Пользователи / группы / роли / ACL / realm'ы / permissions
|
||||
- Токены: `/access/users/{userid}/token[/{tokenid}]`
|
||||
- TFA и OpenID: durable локальное состояние; **без** живых вызовов IdP
|
||||
|
||||
См. доменное руководство [Access](../domains/access.md).
|
||||
Reference in New Issue
Block a user