Решение перенесено из закрытого PR #1 (ветка отведена до мержа v1, номера ADR там разошлись с main). Ссылки выправлены на актуальные ADR-003/006/013 и на формулировку threat-model «Слабый пароль». Заодно из open-questions.md убран пункт про сторону сообщений: его закрыл ADR-065, но вычеркнуть забыли. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QR8uS3zGkybzWRW4GEY1oz
3.4 KiB
3.4 KiB
ADR-066: серверного «перца» для ключевого блоба нет
Закрывает последний открытый вопрос из docs/open-questions.md, поставленный при ADR-006.
Контекст
Идея: шифровать ключевой блоб ещё раз серверным ключом, который лежит вне базы — например в /etc/bare/env рядом с VAPID. Тогда украденный дамп или бэкап сам по себе не даёт материала для оффлайн-перебора паролей. Против оператора это не помогает: у него есть и база, и файл с ключом.
Вопрос висел открытым с самого начала и мешает считать модель угроз закрытой: пока решения нет, непонятно, чего стоит ждать от следующей версии хранения.
Решение
Перца нет. Блоб хранится так, как описано в ADR-006 и ADR-013: один слой шифрования, ключ выведен из пароля.
Аргументы:
- Рядом с базой появляется второй критичный артефакт. ADR-003 обещает «бэкап — копия одного файла»; перец это обещание ломает. Потеря файла с перцем — невозможность входа с новых устройств сразу для всех, а восстановления паролей в Bare нет by design. Для маленького самохостного инструмента риск потерять ключ при переезде выше риска, который перец закрывает.
- Сценарий «утёк бэкап, но не сервер» уже закрыт ADR-013: PBKDF2-HMAC-SHA256 от 600 000 итераций и пароль от 12 символов делают перебор дорогим. Словарный пароль перец тоже не спасёт — при компрометации сервера он утекает вместе с базой.
- Каждый дополнительный слой — код, который нужно аудировать, и оперативная процедура, которую нужно помнить. Простота важнее.
Следствия
- Стойкость блоба в любом сценарии равна стойкости пароля, как и записано в
docs/threat-model.md, «Слабый пароль». Новых оговорок в модели угроз не появляется. - Развёртывание остаётся «бинарь плюс файл базы»: ничего, что нельзя потерять, кроме самой базы, у оператора нет.
/etc/bare/envвосстанавливается поdocs/deploy.md, VAPID-пара перевыпускается. - Решение обратимо: перец можно добавить позже отдельным ADR — он не меняет формат блоба, только оборачивает его.