fix(exchange): preserve old archives during server key rotation
All checks were successful
State Corp Backend CI/CD / Quality gate (push) Successful in 3m19s
State Corp Backend CI/CD / Build linux/amd64 images once (push) Successful in 2m54s
State Corp Backend CI/CD / Refresh and release internal main (push) Has been skipped
State Corp Backend CI/CD / Release customer main (push) Has been skipped
State Corp Backend CI/CD / Release dev (push) Successful in 54s
All checks were successful
State Corp Backend CI/CD / Quality gate (push) Successful in 3m19s
State Corp Backend CI/CD / Build linux/amd64 images once (push) Successful in 2m54s
State Corp Backend CI/CD / Refresh and release internal main (push) Has been skipped
State Corp Backend CI/CD / Release customer main (push) Has been skipped
State Corp Backend CI/CD / Release dev (push) Successful in 54s
This commit is contained in:
36
docs/exchange-key-rotation.md
Normal file
36
docs/exchange-key-rotation.md
Normal file
@@ -0,0 +1,36 @@
|
||||
# Ротация ключа обмена
|
||||
|
||||
`EXCHANGE_SHARED_TOKEN` служит текущим ключом HTTP-доступа к загрузке и материалом
|
||||
ключа шифрования пакетов. Его нельзя передавать frontend или публиковать в
|
||||
runtime-config.js. Публичный маркер браузерной загрузки требует отдельной
|
||||
серверной проверки JWT активного администратора; сам по себе он доступа не даёт.
|
||||
|
||||
При согласованной ротации Мостовик и State Corp получают новый общий ключ и новый
|
||||
`EXCHANGE_KEY_ID` (у Мостовика — `STATE_CORP_EXCHANGE_KEY_ID`). Чтобы ранее
|
||||
подготовленные архивы оставались доступны, State Corp может хранить одну прежнюю
|
||||
пару только на сервере:
|
||||
|
||||
- `EXCHANGE_PREVIOUS_SHARED_TOKEN` — прежний ключ расшифровки;
|
||||
- `EXCHANGE_PREVIOUS_KEY_ID` — точный `key_id` прежних пакетов.
|
||||
|
||||
Оба предыдущих параметра задаются вместе, предыдущий ID должен отличаться от
|
||||
текущего. Неполная или неоднозначная конфигурация отклоняет импорт. Старый ключ
|
||||
выбирается только для точного предыдущего `key_id`; перебора ключей при ошибке
|
||||
расшифровки нет. При пустых предыдущих параметрах сохраняется прежнее поведение
|
||||
с единственным текущим ключом, в том числе для контейнеров без `key_id`.
|
||||
|
||||
HTTP-загрузка всегда проверяет только текущий `EXCHANGE_SHARED_TOKEN`.
|
||||
Предыдущий ключ не предоставляет доступа к API. При загрузке старого архива
|
||||
с текущими правами действуют прежние правила проверки, атомарного импорта и
|
||||
распознавания дубликатов; миграции и преобразование предметных записей не нужны.
|
||||
|
||||
Порядок применения: убрать секрет из браузерной конфигурации, дождаться окончания
|
||||
активных задач отправителя, приватно сохранить текущую конфигурацию, установить
|
||||
предыдущую пару у получателя и новую текущую пару у обоих участников, пересоздать
|
||||
соответствующие процессы. Проверить отказ старого HTTP-ключа, загрузку текущим
|
||||
ключом старого и нового архивов, а также повтор без изменения предметных данных.
|
||||
Прежний ключ удаляют после согласованного срока хранения старых архивов; после
|
||||
удаления такие архивы перестанут расшифровываться автоматически.
|
||||
|
||||
Проверки: `uv run pytest tests/apps/exchange/`. Настройки, ключи и старые архивы
|
||||
не должны попадать в репозиторий, логи или публичные файлы.
|
||||
Reference in New Issue
Block a user