- пришедшего называет заголовок Remote-User от прокси, и верят ему только с адреса из перечня trusted_proxies; своего входа у сервиса не осталось — ни корня /auth, ни кук, ни срока сессии, ни секрета клиента в конфиге и в базе - учётная запись заводится первым обращением: EnsureUser в пакете хранилища, шаг схемы 202608220001 с колонкой provider_login и снятыми правилами users - cmd/oidcstub заменён на cmd/devtools с подкомандой proxy; заодно закрыт унаследованный DL3066 — пользователь образа назван числом
72 lines
6.4 KiB
Markdown
72 lines
6.4 KiB
Markdown
## Why
|
|
|
|
Сервис ведёт вход своими руками: уводит человека к провайдеру, помнит выданное
|
|
состояние у браузера, меняет принесённый код на сессию и потом семь суток верит
|
|
выданной куке, ни разу больше не спросив провайдера. Отзыв доступа доходит до
|
|
сервиса только истечением этой куки — то есть с задержкой до недели, — а секрет
|
|
клиента ради обмена лежит и в конфиге, и в базе.
|
|
|
|
Обратный прокси между интернетом и сервисом уже спрашивает Authelia на **каждом**
|
|
запросе и называет пришедшего заголовком: трём соседним сервисам того же контура
|
|
он так и служит. Сервису достаточно этот заголовок прочитать, и весь собственный
|
|
протокол входа становится лишним.
|
|
|
|
## What Changes
|
|
|
|
- **BREAKING** Кто пришёл, сервис узнаёт из заголовка, поставленного обратным
|
|
прокси. Своего входа у него не остаётся вовсе: ни адреса, уводящего к
|
|
провайдеру, ни возврата, ни куки, ни выхода.
|
|
- **BREAKING** Заголовку верят только с адреса, объявленного доверенным.
|
|
Пришедший с любого другого адреса тем же заголовком не узнаётся никак.
|
|
- Учётная запись заводится сама, при первом обращении с новым именем, и
|
|
находится по нему же при каждом следующем. Имя из заголовка становится ключом
|
|
учётной записи и живёт своей колонкой.
|
|
- **BREAKING** Секция настроек входа переписывается целиком: адреса провайдера,
|
|
идентификатор и секрет клиента уходят, приходит перечень доверенных адресов.
|
|
- Секрет клиента исчезает и из настроек хранилища. Вместе с ним снимается изъятие
|
|
из инварианта «Секрет не покидает конфиг»: чтение файла базы больше не
|
|
равносильно чтению секрета.
|
|
- Отзыв доступа перестаёт ждать семи суток: Authelia судит каждый запрос, а
|
|
сервис назначенного срока сессии больше не держит вовсе.
|
|
- Панель владельца закрывается доменом, а не правилом на литерал пути, и обход
|
|
подменой знака в адресе перестаёт существовать. Половина этой работы живёт в
|
|
контуре выкладки, вне репозитория.
|
|
- Способ представиться на машине без прокси заводится заново: подставной
|
|
провайдер уходит вместе с протоколом.
|
|
|
|
## Capabilities
|
|
|
|
### New Capabilities
|
|
|
|
Новых нет: работа меняет то, как узнаётся пришедший, а не заводит новое
|
|
поведение.
|
|
|
|
### Modified Capabilities
|
|
|
|
- `access`: узнавание пришедшего переезжает с собственного входа у внешнего
|
|
провайдера на заголовок доверенного источника. Уходят требования о протоколе
|
|
входа, о куке сессии, о сроке её жизни, о выходе, о продлении и о секрете
|
|
провайдера в конфиге; приходят требования о доверенном источнике, о заголовке
|
|
как имени пришедшего и о заведении учётной записи первым обращением.
|
|
Требования о владельце записи, об открытых адресах и о том, как приложение
|
|
узнаёт вошедшего, остаются по существу и правятся в формулировках.
|
|
|
|
## Impact
|
|
|
|
- Транспорт HTTP: обработчики входа и возврата, слой предъявления куки, слой
|
|
запрета продления, корень `/auth` целиком.
|
|
- Хранилище: приведение настроек провайдера к конфигу при подъёме, новый шаг
|
|
схемы — колонка имени из заголовка, снятие настроек OAuth2 и правила создания
|
|
записи. Применённый шаг `202608120001_oidc_login` не переписывается.
|
|
- Настройки: секция входа в конфиге и в его образце. Имена ключей — необратимое,
|
|
и решение по ним принимает человек.
|
|
- Приложение: адрес, которым экран уводил ко входу.
|
|
- Инструменты: подставной провайдер OIDC уходит, на его место встаёт способ
|
|
представиться без прокси. На него опирается задача `dev-run-task`.
|
|
- Документы: модель угроз — периметр, недоверенный вход, разграничение доступа,
|
|
сдвиг про секрет в базе; `CLAUDE.md` — изъятие из инварианта о секрете;
|
|
устройство и схема хранилища.
|
|
- Вне репозитория: правило обратного прокси и правило Authelia для домена
|
|
сервиса живут в `pet-project-server`. Этой работой они не проверяются, но
|
|
требование к ним она обязана назвать.
|