Аутентификация и безопасность
Локальные учётные записи и JWT-сессии. Новая установка всегда позволяет создать одного локального администратора; дальнейшая публичная регистрация закрыта.
На странице входа рядом с переключателем темы есть выбор языка. Язык можно выбрать до входа; выбор сохраняется в текущем браузере и действует также при регистрации.
Первая настройка
Первая учётная запись в пустой базе получает admin; последующие — только при включённой регистрации. Существующие роли не меняются.
Локальные учётные записи
Имя, необязательный e-mail, пароль 12 znaków–72 bajty UTF-8 с прописной, строчной буквой и цифрой. bcrypt, rate-limit.
Управление пользователями
Администраторы открывают Settings → Управление пользователями, чтобы администрировать экземпляр. Адрес /users открывает тот же раздел настроек, начиная со списка учётных записей. Администрирование разделено на пять секций:
- Пользователи: учётные записи, ожидающие одобрения регистрации, создание и редактирование записей, удаление и восстановление второго фактора.
- Группы: членство в группах и поиск эффективного доступа.
- Доступ и политики: доступ к Work и политики runtime, настройки Ollama, загрузка моделей, веб-поиск, Агенты, инструменты, голосовые разрешения и сервер исходящей почты для уведомлений по почте.
- Безопасность: политика двухфакторной аутентификации экземпляра и журнал аудита безопасности.
- Настройки по умолчанию: тема страницы входа и учётных записей без личной настройки темы.
Список ищется по имени пользователя или адресу электронной почты и фильтруется по роли. Ожидающие регистрации отделены от активных учётных записей, поэтому работу по одобрению легко заметить. Сброс поиска и фильтра роли возвращает полный список.
Создать пользователя и Редактировать пользователя открывают отдельные формы учётной записи. Пустой пароль при редактировании сохраняет текущий. Удаление и сброс второго фактора запрашивают подтверждение для выбранной записи перед изменением.
Навигация по секциям поддерживает клавиши со стрелками, Home и End, в том числе в макетах справа налево. Переключение секций сохраняет незавершённые формы, пока открыто Управление пользователями. Остальные секции загружаются при первом открытии, поэтому открытие списка учётных записей не загружает все элементы политик и аудита.
Одобрение регистрации
Публичные учётные записи начинают в pending. Исключение: первый bootstrap active/admin.
Регистрация возвращает 202, approvalRequired: true, без токена. Login: 403, ACCOUNT_PENDING; OAuth ?approval=pending. Статус проверяется всегда.
Администратор видит Oczekujące, aktywuj/odrzuć, badge/toast, polling GET /api/users/pending-approvals, akceptację PATCH /api/users/:id/approve. Rola pozostaje user.
Включайте регистрацию осознанно
ENABLE_SIGNUP=false по-прежнему позволяет создать первого администратора.
ENABLE_SIGNUP=true
После окна верните false. Пустая база всегда разрешает одного локального администратора; OAuth не занимает место. Удалённый bootstrap защитите Cloudflare Access.
Роли
admin: instancja, użytkownicy, system, Work. user: zwykłe funkcje. Операции моделей, меняющие хост, доступны только администратору.
Work
По умолчанию только администратор из-за произвольных команд. Можно открыть активным пользователям в Settings → Управление пользователями → Доступ и политики, но папки хоста остаются admin-only. Считайте доступ правами оператора runtime.
Текущая роль из базы немедленно отменяет доступ. Backend останавливает runs и контейнеры, сохраняя записи и тома. Ошибка cleanup не возвращает доступ. При удалении пользователя сначала удаляются его ресурсы Work; отсутствие подтверждённой очистки блокирует удаление.
Группы и права
Администраторы создают группы и управляют членством в Settings → Управление пользователями → Группы; там же находится поиск эффективного доступа. Владелец чата, заметки, документа, коллекции, папки, персоны, prompt, навыка или календаря может дать read, write, admin пользователю или группе через общий диалог (Общий доступ). Глобальный admin не видит чужой контент. Членство проверяется при запросе.
Аудит
Входы, ошибки, выходы, отозвания и изменения попадают в append-only журнал после редактирования. Изменение и аудит в одной транзакции. Администраторы просматривают журнал в Settings → Управление пользователями → Безопасность; AUDIT_RETENTION_DAYS по умолчанию 180.
Сессии
JWT_SECRET=replace-with-a-long-random-secret
Изменение JWT_SECRET аннулирует сессии. JWT_EXPIRES_IN по умолчанию 7d. WebSocket использует короткий одноразовый билет. Серверные сессии можно отозвать на всех репликах; старые без ID истекают или подчиняются cutoff.
2FA и passkeys
TOTP: base32, otpauth://, код из 6 цифр, 10 кодов восстановления, POST /api/auth/mfa/verify, защита от replay и одноразовые коды. Passkeys WebAuthn: discoverable, проверка пользователя, attestation none, ES256/EdDSA, шифрование, challenge на 5 минут, счётчик клона, HTTPS/localhost, WEBAUTHN_RP_ID.
Challenge MFA использует секрет, производный от JWT_SECRET, не авторизует API и расходуется при успехе. Администратор может потребовать второй фактор в Settings → Управление пользователями → Безопасность или через MFA_REQUIRED_MODE=required, а также сбрасывать TOTP. OAuth/OIDC доверяет поставщику; API-токены без изменений.
API-токены
Префикс lwk_, секрет показывается один раз, хранится только hash. Scopes chat, models, documents, notes, personas, media, work, admin; маршруты требуют scope, сессии недоступны. Поддерживаются срок, последнее использование, revoke и rate-limit. Admin token требует актуальную роль администратора. chat работает с публичным /v1.
Turnstile
TURNSTILE_EXPECTED_HOSTNAME можно задать явно.
TURNSTILE_SITE_KEY=...
TURNSTILE_SECRET_KEY=...
TURNSTILE_EXPECTED_HOSTNAME=chat.example.com
Действия login/signup, проверка хоста; BASE_URL fallback. Без обоих ключей отключено.
GitHub OAuth
GITHUB_CLIENT_ID=...
GITHUB_CLIENT_SECRET=...
GITHUB_CALLBACK_URL=https://your-domain.example/api/auth/oauth/github/callback
gh_, rola user.
Hugging Face OAuth
HUGGINGFACE_CLIENT_ID=...
HUGGINGFACE_CLIENT_SECRET=...
HUGGINGFACE_CALLBACK_URL=https://your-domain.example/api/auth/oauth/huggingface/callback
hf_, rola user. Случайный state w HttpOnly SameSite, callback отклоняет mismatch. JWT w 60-sekundowym cookie, никогда URL/history/referrer.
Перенаправления и CORS
Ustaw CORS_ORIGIN:
BASE_URL=https://your-domain.example
CORS_ORIGIN=https://your-domain.example
CORS_ORIGIN=http://localhost:5173,http://127.0.0.1:5173
Демо
Frontend с имитациями, не производственная аутентификация.
Список безопасности
Сильный JWT_SECRET, постоянный DATA_DIR, backup ENCRYPTION_KEY, Turnstile, HTTPS, минимальные ключи, точные callbacks, Work только доверенным.