В test/prod нет штатного способа сменить пароль администратора #73

Closed
opened 2026-09-14 19:55:39 +03:00 by Agent · 2 comments
Collaborator

Проблема

Пароль администратора в test/prod задаётся только один раз — при первом создании админа, — и дальше сменить его штатно нельзя:

  • app/bootstrap.py:39-42: если админ уже существует и окружение не development, пароль из .env не применяется. Комментарий: «пароль НЕ перезаписываем (мог быть изменён через панель)».
  • Но через панель пароль админа не меняется. admin_service.set_player_password (PUT /api/admin/users/{id}/password) явно отказывает для role != 'player', а в докстринге написано «Пароль админа так не меняется — он задаётся ADMIN_PASSWORD в .env».
  • Эндпойнта «сменить свой пароль» для админа нет: PUT /api/users/me/password требует сессию игрока (fs_session), у админа её нет.

Получается замкнутый круг: .env отсылает к панели, панель — к .env, и ни то ни другое не работает.

Чем грозит

  • Утёк или скомпрометирован пароль админа на проде — поменять его можно только правкой БД руками (sqlite3 в томе + bcrypt-хеш) или удалением админа с пересозданием через bootstrap.
  • Смена ADMIN_PASSWORD в .env на Pi молча ни на что не влияет: владелец уверен, что пароль сменён, а вход работает со старым. При этом _forbid_default_secrets_in_prod продолжает требовать от .env недефолтный пароль.
  • token_version админа тоже не увеличить, так что уже выданные админские сессии не отозвать (живут до 8 ч или до logout).

Варианты решения

  • Добавить админу смену собственного пароля в панели (с текущим паролем, throttle, инкрементом token_version); и/или
  • явную команду ротации, например python -m app.bootstrap --reset-admin-password / переменную ADMIN_PASSWORD_FORCE_RESET=1, чтобы применить пароль из .env на проде осознанно;
  • поправить комментарии в bootstrap.py и admin_service.py и описать процедуру в deploy/pi/README.md.

Найдено при сверке документации с кодом.

## Проблема Пароль администратора в test/prod задаётся **только один раз** — при первом создании админа, — и дальше сменить его штатно нельзя: - `app/bootstrap.py:39-42`: если админ уже существует и окружение не `development`, пароль из `.env` **не применяется**. Комментарий: «пароль НЕ перезаписываем (мог быть изменён через панель)». - Но через панель пароль админа не меняется. `admin_service.set_player_password` (`PUT /api/admin/users/{id}/password`) явно отказывает для `role != 'player'`, а в докстринге написано «Пароль админа так не меняется — он задаётся ADMIN_PASSWORD в .env». - Эндпойнта «сменить свой пароль» для админа нет: `PUT /api/users/me/password` требует сессию игрока (`fs_session`), у админа её нет. Получается замкнутый круг: `.env` отсылает к панели, панель — к `.env`, и ни то ни другое не работает. ## Чем грозит - Утёк или скомпрометирован пароль админа на проде — поменять его можно только правкой БД руками (`sqlite3` в томе + bcrypt-хеш) или удалением админа с пересозданием через bootstrap. - Смена `ADMIN_PASSWORD` в `.env` на Pi молча ни на что не влияет: владелец уверен, что пароль сменён, а вход работает со старым. При этом `_forbid_default_secrets_in_prod` продолжает требовать от `.env` недефолтный пароль. - `token_version` админа тоже не увеличить, так что уже выданные админские сессии не отозвать (живут до 8 ч или до logout). ## Варианты решения - Добавить админу смену собственного пароля в панели (с текущим паролем, throttle, инкрементом `token_version`); **и/или** - явную команду ротации, например `python -m app.bootstrap --reset-admin-password` / переменную `ADMIN_PASSWORD_FORCE_RESET=1`, чтобы применить пароль из `.env` на проде осознанно; - поправить комментарии в `bootstrap.py` и `admin_service.py` и описать процедуру в `deploy/pi/README.md`. Найдено при сверке документации с кодом.
Agent added the Kind/Security
Priority
Medium
3
labels 2026-09-14 19:55:39 +03:00
Agent self-assigned this 2026-09-19 00:01:42 +03:00
Agent added the
Reviewed
Confirmed
1
label 2026-09-19 00:01:43 +03:00
Author
Collaborator

План выполнения

Решение владельца — явная команда ротации из .env, без формы в админке.

  1. python -m app.bootstrap --reset-admin-password: берёт ADMIN_PASSWORD из настроек и записывает его существующему админу через user_service.set_password (проверка пароля + token_version++ → все админские сессии отзываются). Понятный отказ, если пароль пуст, админа нет или bootstrap выключен. Обычный запуск из entrypoint.sh не меняется.
  2. Исправить комментарии в bootstrap.py и admin_service.set_player_password: никакой «смены через панель».
  3. Процедура в deploy/pi/README.md и README.md: правка .env → docker compose up -d (пересоздать app, иначе он не увидит новый .env) → docker compose exec app python -m app.bootstrap --reset-admin-password.
  4. Тесты: новый пароль применён; старая админская cookie → 401; обычный bootstrap в prod пароль не трогает; ошибки при пустом пароле или без админа.

Критерии готовности

  • Команда меняет пароль и отзывает админские сессии; обычный bootstrap в prod пароль не трогает.
  • Процедура описана в документации; pytest зелёный, новые тесты на старом коде падают.

Ветка: issue-73-admin-password от dev

## План выполнения Решение владельца — **явная команда ротации из `.env`**, без формы в админке. 1. `python -m app.bootstrap --reset-admin-password`: берёт `ADMIN_PASSWORD` из настроек и записывает его существующему админу через `user_service.set_password` (проверка пароля + `token_version++` → все админские сессии отзываются). Понятный отказ, если пароль пуст, админа нет или bootstrap выключен. Обычный запуск из `entrypoint.sh` не меняется. 2. Исправить комментарии в `bootstrap.py` и `admin_service.set_player_password`: никакой «смены через панель». 3. Процедура в `deploy/pi/README.md` и `README.md`: правка `.env` → `docker compose up -d` (пересоздать `app`, иначе он не увидит новый `.env`) → `docker compose exec app python -m app.bootstrap --reset-admin-password`. 4. Тесты: новый пароль применён; старая админская cookie → 401; обычный bootstrap в prod пароль не трогает; ошибки при пустом пароле или без админа. **Критерии готовности** - Команда меняет пароль и отзывает админские сессии; обычный bootstrap в prod пароль не трогает. - Процедура описана в документации; `pytest` зелёный, новые тесты на старом коде падают. **Ветка:** `issue-73-admin-password` от `dev`
Agent added the
Status
In Review
label 2026-09-19 00:08:21 +03:00
Author
Collaborator

Работа выполнена, открыт PR: #95

Итог: python -m app.bootstrap --reset-admin-password применяет ADMIN_PASSWORD из .env к существующему админу и отзывает все его сессии (token_version++). Процедура на Pi — в deploy/pi/README.md: правка .env → docker compose up -d → docker compose exec app python -m app.bootstrap --reset-admin-password.
Проверки: pytest — 213 passed; новые тесты на старом коде падают.
Статус: Status/In Review
Осталось за вами: ревью и мёрж PR — задача закроется автоматически.

Работа выполнена, открыт PR: https://gitea.arseniev.info/NotBigGhost/ForbiddenStarsApp/pulls/95 **Итог:** `python -m app.bootstrap --reset-admin-password` применяет `ADMIN_PASSWORD` из `.env` к существующему админу и отзывает все его сессии (`token_version++`). Процедура на Pi — в `deploy/pi/README.md`: правка `.env` → `docker compose up -d` → `docker compose exec app python -m app.bootstrap --reset-admin-password`. **Проверки:** `pytest` — 213 passed; новые тесты на старом коде падают. **Статус:** `Status/In Review` **Осталось за вами:** ревью и мёрж PR — задача закроется автоматически.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: NotBigGhost/ForbiddenStarsApp#73