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

Merged
NotBigGhost merged 1 commits from issue-73-admin-password into dev 2026-09-19 00:10:37 +03:00
Collaborator

Что сделано

Добавлена команда ротации — решение владельца. Формы в админке нет.

python -m app.bootstrap --reset-admin-password

Команда применяет ADMIN_PASSWORD из настроек к существующему админу через user_service.set_password: пароль проходит обычную проверку, а token_version увеличивается, так что все выданные админские сессии перестают действовать. Отказ с понятной ошибкой, если пароль пуст, админа нет или ADMIN_BOOTSTRAP_ENABLED=false. Логин команда не меняет. Обычный старт (entrypoint.sh) пароль существующего админа по-прежнему не трогает.

Исправлены комментарии, отсылавшие к «смене через панель», которой нет: в bootstrap.py и в admin_service.set_player_password.

Процедура на Pi описана в deploy/pi/README.md, кратко — в README:

  1. поменять ADMIN_PASSWORD в .env;
  2. docker compose up -d — контейнер читает .env только при создании;
  3. docker compose exec app python -m app.bootstrap --reset-admin-password.

Модель угрозы

  • Сценарий: пароль админа утёк, или украдена админская cookie (живёт до 8 ч).
  • Было: сменить пароль можно было только правкой БД руками; отозвать выданные сессии — никак.
  • Стало:
    • владелец одной командой ставит новый пароль;
    • рост token_version отзывает все админские токены — get_current_admin сверяет ver.
  • Поверхность атаки не растёт: веб-эндпойнта нет, команда требует доступа к серверу.

Что проверено

  • pytest — 213 passed. Новый test_admin_password_reset.py:

    • после ротации применён новый пароль, token_version вырос на 1, прежняя админская cookie получает 401, вход по старому паролю — 401, по новому — 200;
    • обычный bootstrap в prod пароль существующего админа не меняет;
    • понятные отказы: нет админа, пустой пароль, bootstrap выключен.

    На старом bootstrap.py три теста падают. Четвёртый — страховка прежнего поведения — проходит, как и должен.

  • python -m app.bootstrap --help показывает флаг.

Коммиты

  • 0ee7cd1 Безопасность: команда ротации пароля администратора из .env

Отклонения от плана

Нет.

Closes #73

🤖 Generated with Claude Code

https://claude.ai/code/session_01LqSoRj99iwVEH5U5fnZgsd

## Что сделано Добавлена команда ротации — решение владельца. Формы в админке нет. ``` python -m app.bootstrap --reset-admin-password ``` Команда применяет `ADMIN_PASSWORD` из настроек к существующему админу через `user_service.set_password`: пароль проходит обычную проверку, а `token_version` увеличивается, так что все выданные админские сессии перестают действовать. Отказ с понятной ошибкой, если пароль пуст, админа нет или `ADMIN_BOOTSTRAP_ENABLED=false`. Логин команда не меняет. Обычный старт (`entrypoint.sh`) пароль существующего админа по-прежнему не трогает. Исправлены комментарии, отсылавшие к «смене через панель», которой нет: в `bootstrap.py` и в `admin_service.set_player_password`. Процедура на Pi описана в `deploy/pi/README.md`, кратко — в README: 1. поменять `ADMIN_PASSWORD` в `.env`; 2. `docker compose up -d` — контейнер читает `.env` только при создании; 3. `docker compose exec app python -m app.bootstrap --reset-admin-password`. ## Модель угрозы - **Сценарий:** пароль админа утёк, или украдена админская cookie (живёт до 8 ч). - **Было:** сменить пароль можно было только правкой БД руками; отозвать выданные сессии — никак. - **Стало:** - владелец одной командой ставит новый пароль; - рост `token_version` отзывает все админские токены — `get_current_admin` сверяет `ver`. - **Поверхность атаки не растёт:** веб-эндпойнта нет, команда требует доступа к серверу. ## Что проверено - `pytest` — 213 passed. Новый `test_admin_password_reset.py`: - после ротации применён новый пароль, `token_version` вырос на 1, прежняя админская cookie получает 401, вход по старому паролю — 401, по новому — 200; - обычный bootstrap в prod пароль существующего админа не меняет; - понятные отказы: нет админа, пустой пароль, bootstrap выключен. На старом `bootstrap.py` три теста падают. Четвёртый — страховка прежнего поведения — проходит, как и должен. - `python -m app.bootstrap --help` показывает флаг. ## Коммиты - `0ee7cd1` Безопасность: команда ротации пароля администратора из .env ## Отклонения от плана Нет. Closes #73 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01LqSoRj99iwVEH5U5fnZgsd
Agent added 1 commit 2026-09-19 00:08:20 +03:00
В prod пароль админа задавался только при первом создании: обычный bootstrap
его из .env не берёт, панель не меняет — комментарии отсылали друг к другу.
Теперь `python -m app.bootstrap --reset-admin-password` применяет ADMIN_PASSWORD
к существующему админу через user_service.set_password: пароль проверяется,
token_version растёт, и все админские сессии (в том числе чужие) отзываются.
Обычный старт по-прежнему пароль не трогает.

Процедура на Pi — в deploy/pi/README.md (правка .env → docker compose up -d →
exec команды), кратко — в README. #73

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LqSoRj99iwVEH5U5fnZgsd
NotBigGhost merged commit 709b864c60 into dev 2026-09-19 00:10:37 +03:00
NotBigGhost deleted branch issue-73-admin-password 2026-09-19 00:10:37 +03:00
Sign in to join this conversation.