- в конфиг добавлены секция [auth.test_headers] и предохранитель [server] debug: заголовки входа подставляет слой транспорта, второго процесса локальный запуск больше не требует - подкоманда devtools proxy удалена целиком: всё, ради чего её поднимали, делает сам сервис - адресного предохранителя нет по решению владельца — цена названа в ADR и в модели угроз
77 lines
6.3 KiB
Markdown
77 lines
6.3 KiB
Markdown
# Адресного предохранителя у отладочного входа нет: держит его умолчание, а не машина
|
||
|
||
- **Дата:** 2026-08-23
|
||
- **Источник:** [../../openspec/changes/archive/2026-08-23-config-test-headers-login/design.md](../../openspec/changes/archive/2026-08-23-config-test-headers-login/design.md),
|
||
решение 4
|
||
|
||
## Решение
|
||
|
||
Отладочная подстановка заголовков входа не требует от настроек ничего сверх
|
||
самого предохранителя `[server] debug`. Решение владельца на чекпоинте записано
|
||
в источнике дословно:
|
||
|
||
> «предохранитель по адресам не делаем, полагаемся только на параметр debug».
|
||
|
||
Рассматривалось требование, чтобы при включённом предохранителе перечень
|
||
доверенных адресов состоял только из петлевых записей; оно снято вместе с
|
||
предикатом «петлевая запись», который заводился ровно ради него.
|
||
|
||
Согласованность с барьером узнавания при этом остаётся: подставленный заголовок
|
||
проходит тот же перечень доверенных адресов, что и пришедший, и судит адрес та
|
||
же функция. Предохранителем это не служит — «от конфига она не требует ничего и
|
||
круга тех, кто мог назваться кем угодно, не расширяет».
|
||
|
||
## Почему
|
||
|
||
Решение покупает работоспособность отладочного входа там, где адрес пира не
|
||
петлевой:
|
||
|
||
> отладочный вход работает **внутри контейнера** — адрес пира там принадлежит
|
||
> сети докера, и она же стоит в боевом перечне, — а локальный прогон не
|
||
> переставляет перечень доверенных адресов на петлевой: петлевые записи
|
||
> добавляются к тем, что в нём уже стоят.
|
||
|
||
Цена названа в источнике прямо, и владелец принял именно её:
|
||
|
||
> Что этим потеряно, и это надо назвать прямо: боевую поломку больше не ловит
|
||
> машина. Сервис, поднятый в бою с включённым предохранителем и заполненной
|
||
> имитацией, отдаст архив всякому, кто дотянулся до него с доверенного адреса, —
|
||
> а доверенный адрес в бою это адрес обратного прокси, то есть **любой запрос,
|
||
> пришедший обычным путём**.
|
||
|
||
Между боевой выкладкой и открытым входом остаётся три вещи, и других нет:
|
||
умолчание предохранителя «выключено»; отказ старта при заполненной имитации без
|
||
предохранителя; боевой конфиг, который рендерит шаблон Ansible, а не
|
||
копируют с машины разработчика.
|
||
|
||
Отвергнуты вместе с адресным предохранителем ещё два подхода. **Принудительно
|
||
слушать петлевой адрес при включённом предохранителе** — «меняет поведение молча
|
||
… и закрывает ровно то, что решение покупает: внутри контейнера сервис слушает не
|
||
петлю». **Новый ключ `[server] listen`** — «публичная поверхность настроек ради
|
||
предохранителя, которого решением владельца нет».
|
||
|
||
## Почему это ADR
|
||
|
||
Триггер — **намеренный отказ** от очевидного подхода. Требовать петлевой перечень
|
||
при включённом отладочном входе — первое, что предлагает всякий, кто читает
|
||
модель угроз; отказ от этого оставляет боевую поломку, которую машина не
|
||
исключает, и объяснить его надо один раз здесь, а не на каждом ревью, которое
|
||
эту дыру находит заново.
|
||
|
||
## Последствия
|
||
|
||
- `+` Отладочный вход работает и на машине разработчика, и внутри контейнера:
|
||
перечень доверенных адресов остаётся границей доверия, а не признаком отладки.
|
||
- `+` Локальный прогон не переставляет перечень на петлевой — петлевые записи к
|
||
нему добавляются.
|
||
- `+` Предиката «петлевая запись» в коде нет вовсе: он заводился ради одной этой
|
||
проверки.
|
||
- `−` **Машина не исключает боевую поломку «конфиг с `debug = true` и
|
||
заполненной имитацией».** Такой сервис поднимется на любом перечне доверенных
|
||
адресов и назовёт своим именем всякого, кто пришёл обычным путём. Записано это в модели
|
||
угроз, [security.md](../security.md), «Периметр», и в спеке
|
||
[access](../../openspec/specs/access/spec.md).
|
||
- `−` Одна из трёх опор лежит вне репозитория: шаблон Ansible из
|
||
`pet-project-server`. Проверить её отсюда нечем — тем же свойством обладает
|
||
правило прокси про заголовки `Remote-*`.
|