44683a4996
Clarify that the global administrator sets which domains a domain-admin can manage. Co-authored-by: Cursor <cursoragent@cursor.com>
71 lines
4.2 KiB
Markdown
71 lines
4.2 KiB
Markdown
# План: domain-admin (роль администратора домена)
|
||
|
||
**Статус:** согласовано
|
||
**Версия:** целевой bump **1.x** MINOR при совместимой миграции текущего админа
|
||
в глобального.
|
||
**Порядок:** рекомендуется после [web-split](web-split.md), до
|
||
[inbound-relay](inbound-relay.md).
|
||
|
||
---
|
||
|
||
## Что это
|
||
|
||
Сейчас в панели ровно один субъект: `requireAuth` — булев гейт, а не роль
|
||
([web.go](../../internal/web/web.go) — обёртка
|
||
`mux.Handle("/", s.requireAuth(authed))`), сессия не несёт ничего, кроме факта
|
||
входа.
|
||
|
||
Роль выдаёт доступ к **явно назначенным доменам** (одному или нескольким);
|
||
перечень доменов определяет **глобальный администратор**. Для каждого домена из
|
||
списка:
|
||
|
||
- приложения этого домена (создание, режим отправителя, перегенерация пароля,
|
||
удаление, свой L2-лимит);
|
||
- DKIM/DNS-статус домена;
|
||
- журнал отправки, отфильтрованный по домену — фильтр в журнале уже есть
|
||
([sendLogData](../../internal/web/handlers_monitor.go)).
|
||
|
||
Вне роли остаётся то, что глобально по своей природе:
|
||
|
||
- добавление и удаление доменов;
|
||
- создание domain-admin пользователей и назначение им доменов;
|
||
- `/reload`;
|
||
- полный бэкап (это весь `/data` вместе с `sasldb2`, то есть все домены
|
||
сразу);
|
||
- очередь и хвост `mail.log` — они серверные и к домену не привязаны.
|
||
|
||
## Почему расширение v1.0
|
||
|
||
[product.md](../product.md) относит «несколько пользователей панели, роли» к
|
||
out of scope (один администратор). Появление второго субъекта — сознательное
|
||
расширение границ проекта, как и inbound-relay.
|
||
|
||
Цена — уровня фазы, а не патча:
|
||
|
||
- таблица пользователей и их привязка к доменам;
|
||
- роль в сессии;
|
||
- авторизация в каждом хендлере (а не только на маршруте — сейчас `{id}`/`{aid}`
|
||
не сверяются ни с чем, кроме существования);
|
||
- пересмотр первичного setup'а и смены пароля под нескольких пользователей;
|
||
- учёт нового субъекта в бэкапе и экспорте домена.
|
||
|
||
*(Прежняя формулировка этого пункта — «2FA и несколько администраторов» —
|
||
заменена: 2FA снята с рассмотрения, а «несколько администраторов» уточнено до
|
||
одной конкретной роли, потому что нужна не вторая копия всевластного админа, а
|
||
ограниченный доступ владельца одного или нескольких доменов — перечень задаёт
|
||
глобальный администратор.)*
|
||
|
||
## Готово, когда
|
||
|
||
- Глобальный администратор и domain-admin с разными правами работают через
|
||
панель; domain-admin не может выйти за пределы **назначенных** доменов;
|
||
- текущий единственный админ мигрирует в глобального без потери доступа;
|
||
- бэкап/восстановление учитывает пользователей и привязки;
|
||
- `build`/`vet`/`test`/образ зелёные.
|
||
|
||
## Риски
|
||
|
||
- Неполная проверка `{id}`/`{aid}` в хендлерах — утечка доступа к чужому
|
||
домену;
|
||
- breaking setup/бэкап — тогда semver major, не 1.x.
|