fix(observability): у Grafana остаётся один вход — внешний basic_auth снят с витрины (#3078) #3113

Merged
bot-backend merged 1 commit from fix/3078-grafana-single-auth into main 2026-08-26 12:25:42 +00:00
Owner

По решению владельца: два запроса пароля подряд мешали работе. Снят ровно один слой и ровно с витрины.

Что снято и что осталось

путь было стало
handle { } — витрина Grafana basic_auth Caddy + вход Grafana только вход Grafana
/ingest/prometheus/* basic_auth без изменений
/ingest/loki/* basic_auth без изменений

Приём метрик остаётся под basic_auth намеренно: туда ходит агент по паролю, который лежит в открытом виде в окружении продуктового хоста, и отдельная учётка там ограничивает ущерб записью. Это обоснование уже было в metrics-ingest.caddy.snippet и остаётся в силе.

У Grafana собственная аутентификация с ролями и GF_USERS_ALLOW_SIGN_UP=false.

Что теряется — записано в конфиге, а не только здесь

basic_auth отсекал сканеры до Grafana и прикрыл бы её собственную будущую уязвимость. Теперь страница входа Grafana видна из интернета напрямую. Комментарий об этом стоит прямо в infra.caddy, чтобы через полгода снятый слой не выглядел недосмотром, а читался как решение.

Почему файл сниппета оставлен

caddy/metrics-ui.caddy.snippet и его bind-mount не удалены: так диффу меньше, а вернуть слой можно одной строкой import. Гард из #3104 проверяет обратное направление — что каждый import покрыт маунтом, — поэтому оставшийся без импорта маунт его не трогает.

Проверено

  • scripts/check-caddy-snippet-mounts.py — зелёный (6 конфигов, 7 bind-маунтов);
  • конфиг с новой версией infra.caddy прогнан через caddy validate в одноразовом контейнере на Beget (работающий Caddy не тронут) — Valid configuration.

Проверка в одноразовом контейнере здесь не формальность: синтаксическая ошибка в infra.caddy кладёт на этом хосте ещё и git.gendsgn.ru, из которого идёт деплой — что уже случалось 26.08 в постмортеме #3103.

Refs #3078

По решению владельца: два запроса пароля подряд мешали работе. Снят **ровно один слой и ровно с витрины**. ## Что снято и что осталось | путь | было | стало | |---|---|---| | `handle { }` — витрина Grafana | basic_auth Caddy + вход Grafana | только вход Grafana | | `/ingest/prometheus/*` | basic_auth | **без изменений** | | `/ingest/loki/*` | basic_auth | **без изменений** | Приём метрик остаётся под basic_auth намеренно: туда ходит агент по паролю, который лежит в открытом виде в окружении продуктового хоста, и отдельная учётка там ограничивает ущерб записью. Это обоснование уже было в `metrics-ingest.caddy.snippet` и остаётся в силе. У Grafana собственная аутентификация с ролями и `GF_USERS_ALLOW_SIGN_UP=false`. ## Что теряется — записано в конфиге, а не только здесь `basic_auth` отсекал сканеры **до** Grafana и прикрыл бы её собственную будущую уязвимость. Теперь страница входа Grafana видна из интернета напрямую. Комментарий об этом стоит прямо в `infra.caddy`, чтобы через полгода снятый слой не выглядел недосмотром, а читался как решение. ## Почему файл сниппета оставлен `caddy/metrics-ui.caddy.snippet` и его bind-mount не удалены: так диффу меньше, а вернуть слой можно одной строкой `import`. Гард из #3104 проверяет обратное направление — что каждый `import` покрыт маунтом, — поэтому оставшийся без импорта маунт его не трогает. ## Проверено - `scripts/check-caddy-snippet-mounts.py` — зелёный (6 конфигов, 7 bind-маунтов); - конфиг с новой версией `infra.caddy` прогнан через `caddy validate` **в одноразовом контейнере** на Beget (работающий Caddy не тронут) — `Valid configuration`. Проверка в одноразовом контейнере здесь не формальность: синтаксическая ошибка в `infra.caddy` кладёт на этом хосте ещё и `git.gendsgn.ru`, из которого идёт деплой — что уже случалось 26.08 в постмортеме #3103. Refs #3078
lekss361 added 1 commit 2026-08-26 12:21:27 +00:00
fix(observability): у Grafana остаётся один вход (#3078)
All checks were successful
CI Trade-In / changes (pull_request) Successful in 8s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI / changes (pull_request) Successful in 10s
CI Trade-In / browser-tests (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
f893662ef1
Внешний basic_auth Caddy снят с витрины по решению владельца: два запроса
пароля подряд мешали работе, а у Grafana есть собственная аутентификация с
ролями и GF_USERS_ALLOW_SIGN_UP=false.

Что теряется, чтобы решение было осознанным: basic_auth отсекал сканеры до
Grafana и прикрыл бы её собственную будущую уязвимость. Теперь страница входа
видна из интернета напрямую. Это записано комментарием прямо в конфиге, чтобы
через полгода не выглядело недосмотром.

Приём метрик НАРОЧНО остаётся под basic_auth: туда ходит агент по паролю,
который лежит в открытом виде в окружении продуктового хоста, и отдельная
учётка там ограничивает ущерб записью. Снят ровно один слой и ровно с витрины.

Файл metrics-ui.caddy.snippet и его bind-mount оставлены на месте: диффу так
меньше, вернуть слой можно одной строкой. Гард импортов (#3104) проверяет
обратное направление - что каждый import покрыт маунтом, - поэтому лишний
маунт его не трогает.

Проверено: scripts/check-caddy-snippet-mounts.py зелёный (6 конфигов,
7 маунтов); конфиг с новой версией infra.caddy проходит caddy validate в
одноразовом контейнере на Beget - Valid configuration.
bot-backend merged commit 6dd2d26c60 into main 2026-08-26 12:25:42 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#3113
No description provided.