локальный вход задаётся конфигом: заголовки подставляет сам сервис
- в конфиг добавлены секция [auth.test_headers] и предохранитель [server] debug: заголовки входа подставляет слой транспорта, второго процесса локальный запуск больше не требует - подкоманда devtools proxy удалена целиком: всё, ради чего её поднимали, делает сам сервис - адресного предохранителя нет по решению владельца — цена названа в ADR и в модели угроз
This commit is contained in:
+34
-9
@@ -77,6 +77,29 @@ Telegram — связи чата с учётной записью сервис
|
||||
`Remote-*` прокси обязан перезаписывать, а не пропускать**. Выкладку запускает
|
||||
человек.
|
||||
|
||||
**Изъятие из барьера одно — отладочный запуск, и заведено оно 2026-08-23**
|
||||
задачей `config-test-headers-login`. При включённом предохранителе
|
||||
`[server] debug` заголовки входа ставит не прокси, а сам сервис значениями из
|
||||
секции `[auth] test_headers`: на машине разработчика прокси нет, а браузер
|
||||
заголовков не ставит. Узнавание при этом остаётся тем же и подставленного
|
||||
заголовка от пришедшего не отличает — отлаживается боевая ветка. Нормирует
|
||||
изъятие спека [access](../openspec/specs/access/spec.md).
|
||||
|
||||
Держится оно тремя вещами, и других нет: умолчание предохранителя —
|
||||
«выключено»; заполненная имитация при выключенном предохранителе роняет старт с
|
||||
именем ключа; боевой конфиг рендерится шаблоном Ansible, а не копируется с
|
||||
машины разработчика. Подставленный заголовок проходит тот же барьер доверенного
|
||||
адреса, что и пришедший, и судит адрес та же функция — но барьером отладочному
|
||||
входу это не служит: перечень доверенных адресов включению предохранителя не
|
||||
мешает.
|
||||
|
||||
**Боевая поломка машиной не исключена, и это названо прямо.** Сервис, поднятый в
|
||||
бою с включённым предохранителем и заполненной имитацией, поднимется на любом
|
||||
перечне доверенных адресов и назовёт своим именем всякого, чей запрос пришёл
|
||||
через обратный прокси, — то есть всякого, кто пришёл обычным путём. Адресного
|
||||
предохранителя у изъятия нет: требование петлевого перечня рассматривалось и
|
||||
снято решением владельца на чекпоинте задачи.
|
||||
|
||||
**`X-Forwarded-For` сервис читает сам, и правило чтения закрывает дописывание.**
|
||||
С 2026-08-22 адрес спрашивающего ограничитель частоты берёт из этого заголовка:
|
||||
иначе счётчик ведётся по адресу пира, а пир теперь всегда один — прокси, — и
|
||||
@@ -120,7 +143,7 @@ Telegram — связи чата с учётной записью сервис
|
||||
|
||||
| Вход | Канал | Кто может слать |
|
||||
| --- | --- | --- |
|
||||
| **Имя пришедшего, имя для показа и почта** | Заголовки `Remote-User`, `Remote-Name`, `Remote-Email` | Обратный прокси — и **всякий, кто дотянулся до сервиса с доверенного адреса**. Значение принимается: пустое, пробельное, длиннее 255 знаков и с управляющими знаками не узнают никого; **два значения одного заголовка** не узнают никого тоже. С недоверенного адреса заголовок не действует, и это идёт в журнал предупреждением с адресом пира, но без значения |
|
||||
| **Имя пришедшего, имя для показа и почта** | Заголовки `Remote-User`, `Remote-Name`, `Remote-Email` | Обратный прокси — и **всякий, кто дотянулся до сервиса с доверенного адреса**. Значение принимается: пустое, пробельное, длиннее 255 знаков и с управляющими знаками не узнают никого; **два значения одного заголовка** не узнают никого тоже. С недоверенного адреса заголовок не действует, и это идёт в журнал предупреждением с адресом пира, но без значения. Слать тройку может ещё и сам сервис — при включённом предохранителе `[server] debug`, значением из настроек; изъятие целиком описано в «Периметре» выше |
|
||||
| Аудиофайл и его имя | `POST /app/audiorecords`, multipart-поле `audio` | Любой узнанный; неузнанному — `401` до чтения тела. Имя доходит до колонки записи обрезанным по пределу и без управляющих знаков |
|
||||
| Идентификатор записи | `GET /app/audiorecords/{id}` и `/text` | Любой узнанный; неузнанному — `401`, одинаковый для заведённой и незаведённой записи |
|
||||
| Ключ страницы, размер страницы, состояние отбора | `GET /app/audiorecords`, параметры запроса | Любой узнанный; нечитаемый ключ и негодный размер дают `400`, а не молчаливую первую страницу |
|
||||
@@ -382,14 +405,16 @@ Storage, оттуда его читает SpeechKit. Третий путь —
|
||||
|
||||
- **Атака на сам сервер и на контур.** Компрометация хоста, прокси, Docker и
|
||||
Ansible — не наша граница.
|
||||
- **Машина разработчика и то, что он на ней поднимает.** В репозитории лежит
|
||||
`cmd/devtools` — оснастка разработчика; её подкоманда `proxy` встаёт на место
|
||||
контура: ставит заголовок `Remote-User` и переправляет запрос сервису, не
|
||||
проверяя ничего. С 2026-08-15 по 2026-08-22 ту же роль играл `cmd/oidcstub`,
|
||||
подставной провайдер OIDC. Двух вещей это не отменяет, и обе проверяемы: в
|
||||
образ оснастка не едет (ступень собирает `./cmd/transcriber` поимённо), а
|
||||
слушает петлевой адрес. Периметра выкладки она поэтому не касается; кто поднял
|
||||
её у себя в чужой сети, отвечает за это сам.
|
||||
- **Машина разработчика и то, что он на ней поднимает.** На место контура встаёт
|
||||
сам сервис: при включённом предохранителе `[server] debug` он подставляет
|
||||
заголовки входа значениями из конфига. Прежде эту роль играли отдельные
|
||||
процессы — `cmd/oidcstub` с 2026-08-15 по 2026-08-22 и подкоманда
|
||||
`cmd/devtools proxy` с 2026-08-22 по 2026-08-23; ни того, ни другой в
|
||||
репозитории больше нет. Периметра выкладки отладочный запуск не касается,
|
||||
пока предохранитель выключен, а выключен он по умолчанию; кто включил его у
|
||||
себя в чужой сети, отвечает за это сам. В оснастке `cmd/devtools` осталась
|
||||
одна подкоманда — `resume`, — и в образ она не едет: ступень собирает
|
||||
`./cmd/transcriber` поимённо.
|
||||
- **Злоупотребление со стороны пользователя из белого списка.** Приглашённому
|
||||
доверяем полностью.
|
||||
- **Достоверность расшифровки.** Подмена или искажение текста на стороне
|
||||
|
||||
Reference in New Issue
Block a user