Skip to content

ADR 0011: учётные записи, группы доступа и каталог пакетов ​

Статус: accepted. Дата: 2026-09-23.

Контекст ​

Ранее Arkvory принимал только сервисные ключи из локального файла. Их списки репозиториев и операций образовывали декартово произведение прав. Это удобно для небольшого числа интеграций, но не подходит для пользователей с разными ролями в разных репозиториях. Каталог зарегистрированных UPack имел единственный фиксированный порядок и не был доступен отдельным экраном консоли.

Решение ​

  • Учётные записи создаёт администратор. Первый администратор — существующий сервисный ключ с явным administrator: true; init:local выдаёт такой ключ. Самостоятельная регистрация отсутствует. Администратор создаёт пользователей и группы, назначает пользователя в группу и задаёт каждой группе read или write для конкретного репозитория. write включает чтение. Административное право отдельно от прав на содержимое.
  • Пароли хранятся как scrypt-хеш с отдельной случайной солью. Пять неудачных входов блокируют учётную запись на 15 минут. Успешный вход выдаёт случайный bearer token на 12 часов; в PostgreSQL хранится только SHA-256 токена. Не более 32 сессий одного пользователя остаются активными: новый вход отзывает самые старые. Одновременная проверка паролей на одном API-процессе ограничена двумя запросами. Logout удаляет сессию. Консоль держит токен только в памяти вкладки.
  • Администратор может отключить/включить учётную запись и сменить пароль; отключение и смена пароля отзывают все её сессии.
  • Права пользовательской сессии извлекаются из актуальных membership/grants при каждом запросе API. Legacy сервисные ключи сохраняют прежний формат. Пользовательские права представлены привязками репозитория к операциям, чтобы права разных групп не объединялись в более широкое разрешение. Worker перед завершением задания повторно проверяет права пользователя. Существующий предел полосы по principal применим и к пользователям.
  • GET /api/v1/repositories/{repository}/packages принимает ограниченный выбор сортировки group|name|version, направления asc|desc и группировки none|group|package. Версии сравниваются по SemVer. Консоль и SDK используют этот контракт.

Последствия ​

Миграция 6 только добавляет таблицы, не меняет старые записи и не требует сброса ключей. Существующие установки должны явно назначить administrator: true доверенному ключу до управления пользователями. Аутентификация пользователей требует доступной PostgreSQL; потеря БД закрывает новые запросы. Права отозваны для следующего запроса после фиксации изменения, уже начатый поток не прерывается только из-за смены membership. Предел списка пакетов остаётся 1000 записей; более широкая пагинация — отдельное изменение контракта.

Уточнение по аудиту 2026-09-24: единый допуск двух password operations распространяется также на создание пользователя и административный reset. Ограничения identity-каталога проверяются в коротких транзакциях под отдельным lock 18471/10: 1000 users, 100 groups, по 10 000 memberships/grants. История аудита и регрессионные проверки: review.

Уточнение по аудиту 2026-09-26: публичный login не использует общий request budget защищённого API. Отдельный допуск 16 запросов применяется до parsing тела; абсолютный deadline 10 секунд ограничивает медленных отправителей. После parsing остаётся прежний password gate; долгие передачи файлов не получают короткий login deadline. Допуск освобождается при завершении или разрыве ответа.

Уточнение 2026-10-01: блокировку «5 ошибок → 15 минут» и общий password gate заменили ограниченный backoff учётной записи, throttling по адресу клиента и раздельные очереди проверки паролей; самостоятельная регистрация стала опцией. См. ADR 0049.

Arkvory · ProAnimaStudio