- заведена `trusted-header-login` и поставлена в голову очереди - пять задач про механику OIDC закрыты как отменённые ею - `dev-run-task` и `api-tokens` переписаны под новый вход
6.6 KiB
✨ Пускать по доверенным заголовкам 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, а
выкладку запускает человек.