Files
bare/docs/decisions/032-state-permissions.md
mayatnikovandClaude Opus 5 597c55301c Этап 1: аккаунты — argon2id, сессии, ключевой блоб, вход и регистрация
Сервер: миграция 001 со всей схемой storage.md, store на modernc.org/sqlite
(WAL, foreign_keys, один писатель), фоновая чистка раз в час, argon2id
с параметрами ADR-021 и сверкой constant-time, сессии по SHA-256 токена,
cookie bare_session, глобальная проверка Origin, девять эндпоинтов аккаунта.
Ник в журнал не попадает: для /api/ пишется шаблон маршрута.

Клиент: crypto.js по crypto.md построчно — мастер из пароля, два независимых
ключа из мастера, ключевой блоб с ником в AAD, отпечаток от сырой точки;
db.js со всеми хранилищами версии 1; экран входа и регистрации, настройки
со сменой пароля, выходом и удалением аккаунта.

Пароль не покидает клиент: проверено на боевом сервере — ни пароля, ни priv.d
ни в одном теле запроса, вход на втором устройстве даёт тот же отпечаток.

ADR-027: код internal для 500, причина только в журнале.
ADR-028: тексты состояний клиента сведены в ui.md.
ADR-029: вход под другим ником стирает историю только после подтверждения.
ADR-030: верхняя граница итераций KDF, проверка границ на обеих сторонах.
ADR-031: служебный выход перед повторным входом не заканчивает сеанс.
ADR-032: каталог состояния 0700, файлы базы 0600.

Прямые зависимости: modernc.org/sqlite, golang.org/x/crypto.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015DbCjVfTFq4ZFG8juD45YJ
2026-08-22 14:06:07 +03:00

2.1 KiB
Raw Permalink Blame History

ADR-032: Права на каталог состояния и файлы базы

Уточняет ADR-022: к юниту добавлены StateDirectoryMode и UMask.

Контекст

docs/deploy.md задавал владельца /var/lib/bare, но не режим. StateDirectory=bare создаёт каталог с режимом 0755, SQLite кладёт базу с 0644 — на целевой машине, где живут ещё десяток сайтов и чужие сервисы, файл базы читал любой локальный пользователь.

В базе нет плейнтекста, но есть argon2id(authKey) и ключевые блобы. Модель угроз прямо называет стойкость блоба к оффлайн-перебору равной стойкости пароля: раздавать этот материал соседям по машине незачем. Пункт «кража базы или бэкапа» подразумевает злоумышленника, а не любого пользователя системы.

Решение

  • Каталог /var/lib/bare — режим 0700, владелец bare. В юните StateDirectoryMode=0700, чтобы это переживало рестарт.
  • Файлы базы — 0600. В юните UMask=0077: bare.db, -wal и -shm создаются закрытыми.
  • /etc/bare — 0700, /etc/bare/env — 0600, владелец root: там VAPID-ключи.
  • Бэкап наследует те же права; VACUUM INTO пишет в тот же каталог.

Следствия

  • Локальный пользователь без root не читает ни базу, ни секреты окружения.
  • От оператора машины это не защищает и не должно: он остаётся вне модели угроз.
  • Восстановление из бэкапа требует восстановить и права; строка про это есть в docs/deploy.md.