tasks: вход переезжает на заголовки прокси, пять задач про OIDC закрыты
- заведена `trusted-header-login` и поставлена в голову очереди - пять задач про механику OIDC закрыты как отменённые ею - `dev-run-task` и `api-tokens` переписаны под новый вход
This commit is contained in:
@@ -0,0 +1,72 @@
|
||||
# ✨ Пускать по доверенным заголовкам Authelia вместо входа OIDC
|
||||
|
||||
- **Тип:** feature
|
||||
- **Категория:** Очередь — Вход переезжает на заголовки прокси: пять задач про механику OIDC этим закрываются, а всё, что трогает вход и локальный прогон, ставится на него
|
||||
- **Зачем:** Вход собран своими руками — состояние, PKCE, обмен кода внутрипроцессным запросом к роутеру хранилища, — а обратный прокси уже отдаёт трём соседним сервисам заголовки Remote-* от Authelia; заодно секрет клиента лежит в базе, а панель обходится подменой знака в пути.
|
||||
|
||||
Кто пришёл, сервис узнаёт из заголовка, который поставил обратный прокси, сходив
|
||||
к Authelia. Своего входа у сервиса не остаётся вовсе: ни адреса, уводящего к
|
||||
провайдеру, ни возврата, ни куки сессии, ни выхода.
|
||||
|
||||
Контур к этому готов: `files/caddyproxy/Caddyfile.template` в
|
||||
`pet-project-server` уже отдаёт `Remote-User`, `Remote-Groups`, `Remote-Email` и
|
||||
`Remote-Name` панели, netdata и remembos, а правила для этого сервиса там нет
|
||||
вовсе — он не выложен. Контейнер портов наружу не публикует.
|
||||
|
||||
Три следствия, ради которых это и делается. Отзыв доступа перестаёт ждать
|
||||
семи суток: Authelia судит каждый запрос, а не только вход. Секрет клиента
|
||||
уходит из конфига и из базы — вместе с ним снимается изъятие из инварианта
|
||||
«Секрет не покидает конфиг». Панель закрывается доменом, а не правилом на литерал
|
||||
пути, и обход `/%5f/` перестаёт существовать.
|
||||
|
||||
## Затрагивает
|
||||
|
||||
- адреса `GET /auth/login`, `GET /auth/callback`, `POST /auth/logout` — исчезают
|
||||
целиком вместе с корнем `/auth`;
|
||||
- куки `transcriber_session` и `transcriber_login`, слои `SessionFromCookie` и
|
||||
`BlockSessionRefresh`;
|
||||
- заголовки `Remote-User`, `Remote-Email`, `Remote-Name` — новый недоверенный
|
||||
вход, и адрес источника запроса как условие доверия к ним;
|
||||
- секция `[auth]` конфига и `config.example.toml`: имена ключей — необратимое;
|
||||
- настройки провайдера у коллекции `users` (`ApplyProviderSettings`) и новый шаг
|
||||
схемы; применённый `202608120001_oidc_login` не переписывается;
|
||||
- собственные адреса входа хранилища под `/api/collections/users/`: обмена кода,
|
||||
входа по паролю и запроса подтверждения почты больше не предъявляет никто;
|
||||
- `cmd/oidcstub` и подставной провайдер в тестах входа;
|
||||
- способ представиться на машине без прокси: сегодня им служит заглушка
|
||||
провайдера, и замену ей называет эта задача — на неё опирается `dev-run-task`;
|
||||
- спека `access`; `docs/security.md` — периметр, недоверенный вход, «Четвёртый
|
||||
сдвиг»; `CLAUDE.md` — изъятие из инварианта о секрете; `docs/architecture.md`;
|
||||
- правило прокси и правило Authelia для домена сервиса — они живут в
|
||||
`pet-project-server`, вне этого репозитория.
|
||||
|
||||
## Критерии приёмки
|
||||
|
||||
- Обращение к адресу приложения с заголовком от доверенного источника идёт от
|
||||
имени учётной записи, заведённой при первом таком обращении, а повторное с тем
|
||||
же значением попадает в ту же запись. Оракул — тест обработчика: два запроса
|
||||
подряд, в хранилище одна запись пользователя.
|
||||
- Тот же заголовок с недоверенного адреса даёт `401`, а не вход под названным
|
||||
именем. Оракул — тест: запрос с адресом источника вне перечня доверенных.
|
||||
- Собственные адреса входа хранилища сессии не выдают и учётную запись не
|
||||
меняют. Оракул — тест по перечню адресов под `/api/collections/users/`: каждый
|
||||
отвечает отказом.
|
||||
- Механики OIDC в дереве не осталось: корня `/auth`, кук входа,
|
||||
`ApplyProviderSettings`, `cmd/oidcstub` и секрета клиента в конфиге. Оракул —
|
||||
поиск по этим именам плюс зелёный `task gate`.
|
||||
- Разграничение записей по владельцу работает как прежде: чужая запись
|
||||
неотличима от несуществующей. Оракул — существующие тесты владельца остаются
|
||||
зелёными.
|
||||
|
||||
## Рамки
|
||||
|
||||
Ключ учётной записи — `Remote-User`: переименование пользователя в Authelia
|
||||
заведёт новую запись, и прежние записи останутся у прежней. Это принятая цена,
|
||||
и она записывается в спеку, а не обходится.
|
||||
|
||||
Второй уровень доступа по `Remote-Groups` здесь не заводится: его потребителя —
|
||||
страницы расхода — ещё нет.
|
||||
|
||||
Половина работы живёт в `pet-project-server` и этим репозиторием не проверяется
|
||||
ничем: задача обязана назвать требование к контуру в `docs/security.md`, а
|
||||
выкладку запускает человек.
|
||||
Reference in New Issue
Block a user