Przejdź do głównej zawartości

Uwierzytelnianie i bezpieczeństwo

Lokalne konta i sesje JWT. Nowa instalacja zawsze pozwala utworzyć jednego lokalnego administratora; dalsza publiczna rejestracja jest zamknięta.

Strona logowania ma obok przełącznika motywu wybór języka. Język można ustawić przed zalogowaniem; wybór zapisuje się w bieżącej przeglądarce i obowiązuje także przy rejestracji.

Pierwsza konfiguracja​

Pierwsze konto w pustej bazie otrzymuje admin; kolejne tylko przy włączonej rejestracji. Istniejące role bez zmian.

Konta lokalne​

Nazwa, opcjonalny e-mail, hasło 12 znaków–72 bajty UTF-8 z dużą/małą literą i cyfrą. bcrypt, rate-limit.

Zarządzanie użytkownikami​

Administratorzy otwierają Settings → Zarządzanie użytkownikami, aby administrować instancją. Adres /users otwiera ten sam obszar ustawień, zaczynając od listy kont. Administracja dzieli się na pięć sekcji:

  • Użytkownicy: konta, oczekujące akceptacje rejestracji, tworzenie i edycja kont, usuwanie oraz odzyskiwanie drugiego składnika.
  • Grupy: członkostwa w grupach i wyszukiwanie efektywnego dostępu.
  • Dostęp i zasady: dostęp do Work i zasady środowiska, ustawienia Ollama, pobieranie modeli, wyszukiwanie w sieci, Agenci, narzędzia, uprawnienia głosowe oraz serwer poczty wychodzącej dla powiadomień e-mail.
  • Bezpieczeństwo: zasada dwuskładnikowa instancji oraz log audytu bezpieczeństwa.
  • Ustawienia domyślne: motyw strony logowania i kont bez własnej preferencji motywu.

Listę kont przeszukasz po nazwie użytkownika lub adresie e-mail i przefiltrujesz według roli. Oczekujące rejestracje pozostają oddzielone od kont aktywnych, więc łatwo zauważyć pracę do akceptacji. Wyczyszczenie wyszukiwania i filtra roli przywraca pełną listę.

Utwórz użytkownika i Edytuj użytkownika otwierają skupione formularze konta. Puste hasło podczas edycji zachowuje dotychczasowe. Usunięcie i reset drugiego składnika proszą o potwierdzenie dla wybranego konta przed wprowadzeniem zmiany.

Nawigacja między sekcjami obsługuje strzałki oraz klawisze Home i End, także w układach od prawej do lewej. Zmiana sekcji zachowuje niedokończone formularze, dopóki Zarządzanie użytkownikami pozostaje otwarte. Pozostałe sekcje ładują się przy pierwszym otwarciu, więc otwarcie listy kont nie ładuje wszystkich zasad ani elementów audytu.

Akceptacja rejestracji​

Publiczne konta zaczynają pending. Wyjątek: pierwszy bootstrap active/admin.

Rejestracja zwraca 202, approvalRequired: true, bez tokenu. Login: 403, ACCOUNT_PENDING; OAuth ?approval=pending. Status sprawdzany zawsze.

Administrator ma Oczekujące, aktywuj/odrzuć, badge/toast, polling GET /api/users/pending-approvals, akceptację PATCH /api/users/:id/approve. Rola pozostaje user.

Włącz rejestrację świadomie​

ENABLE_SIGNUP=false nadal pozwala utworzyć pierwszego administratora.

ENABLE_SIGNUP=true

Po oknie wróć do false. Pusta baza zawsze pozwala jednego lokalnego admina; OAuth nie zajmuje slotu. Zdalny bootstrap chroń Cloudflare Access.

Role​

admin: instancja, użytkownicy, system, Work. user: zwykłe funkcje. Operacje modeli zmieniające host są admin-only.

Work​

Domyślnie admin-only z powodu arbitralnych komend. Można otworzyć dla aktywnych w Settings → Zarządzanie użytkownikami → Dostęp i zasady, ale foldery hosta nadal admin-only. Dostęp traktuj jako operatora runtime.

Aktualna rola z bazy unieważnia dostęp natychmiast. Backend zatrzymuje runy/kontenery zachowując rekordy/wolumeny. Błąd cleanup nie przywraca dostępu. Usunięcie użytkownika najpierw usuwa Work; brak dowodu cleanup blokuje.

Grupy i granty​

Administratorzy tworzą grupy i zarządzają członkostwem w Settings → Zarządzanie użytkownikami → Grupy. Wyszukiwanie efektywnego dostępu znajduje się w tej samej sekcji. Właściciel chatu, notatki, dokumentu, kolekcji, folderu, persony, promptu, umiejętności lub kalendarza może dać read, write, admin użytkownikowi/grupie przez wspólny dialog (Udostępnianie). Global admin nie widzi cudzej treści. Członkostwo sprawdzane na żądanie.

Audyt​

Loginy, błędy, wylogowania, odwołania i zmiany trafiają do append-only logu po redakcji. Zmiana i audyt w jednej transakcji. Administratorzy przeglądają log w Settings → Zarządzanie użytkownikami → Bezpieczeństwo; AUDIT_RETENTION_DAYS domyślnie 180.

Sesje​

JWT_SECRET=replace-with-a-long-random-secret

Zmiana JWT_SECRET unieważnia. JWT_EXPIRES_IN domyślnie 7d. WebSocket używa krótkiego jednorazowego biletu. Sesje serwerowe można odwołać na wszystkich replikach; stare bez ID wygasają lub podlegają cutoff.

2FA i passkeys​

TOTP: base32, otpauth://, kod 6 cyfr, 10 kodów odzysku, POST /api/auth/mfa/verify, ochrona replay, kody jednorazowe. Passkeys WebAuthn: discoverable, weryfikacja użytkownika, attestation none, ES256/EdDSA, szyfrowanie, challenge 5 min, licznik klonu, HTTPS/localhost, WEBAUTHN_RP_ID.

Challenge MFA używa sekretu pochodnego od JWT_SECRET, nie autoryzuje API i jest zużywany. Administrator może wymusić drugi składnik w Settings → Zarządzanie użytkownikami → Bezpieczeństwo lub przez MFA_REQUIRED_MODE=required oraz resetować TOTP. OAuth/OIDC ufa providerowi; tokeny API bez zmian.

Tokeny API​

Prefix lwk_, sekret raz, hash. Scopes chat, models, documents, notes, personas, media, work, admin; route wymagają scope, sesje niedostępne. Wygasanie, ostatnie użycie, revoke i rate-limit. Admin token wymaga admina. chat działa z publicznym /v1.

Turnstile​

TURNSTILE_EXPECTED_HOSTNAME można ustawić jawnie.

TURNSTILE_SITE_KEY=...
TURNSTILE_SECRET_KEY=...
TURNSTILE_EXPECTED_HOSTNAME=chat.example.com

Akcje login/signup, weryfikacja hosta; BASE_URL fallback. Bez obu kluczy wyłączone.

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. Losowy state w HttpOnly SameSite, callback odrzuca mismatch. JWT w 60-sekundowym cookie, nigdy URL/history/referrer.

Redirecty i 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

Demo​

Frontend z mockami, nie produkcyjne auth.

Lista bezpieczeństwa​

Silny JWT_SECRET, trwały DATA_DIR, backup ENCRYPTION_KEY, Turnstile, HTTPS, minimalne klucze, dokładne callbacks, Work tylko zaufani.

Powiązane​