Added secuirty 2FA for users
This commit is contained in:
+102
-1
@@ -197,4 +197,105 @@ NIE wymuszaj `require-trusted-types-for 'script'`. Powód:
|
||||
przy zewnętrznych skryptach manipulujących DOM stringami (Turnstile, GA)
|
||||
- Zysk bezpieczeństwa nie równoważy ryzyka zepsucia strony
|
||||
|
||||
Zostaw Trusted Types poza CSP, dopóki Next/React nie da natywnego wsparcia.
|
||||
Zostaw Trusted Types poza CSP, dopóki Next/React nie da natywnego wsparcia.
|
||||
|
||||
## Zmiana ścieżki panelu admina (/admin → /its)
|
||||
|
||||
Ukrycie panelu przed botami skanującymi znane ścieżki (`/admin`, `/wp-admin`).
|
||||
Plugin ustawia ścieżkę przez opcję `adminRoute`:
|
||||
|
||||
```ts
|
||||
// payload.config.ts
|
||||
ipalKit({
|
||||
i18n: i18nConfig,
|
||||
adminRoute: '/its', // panel pod /its zamiast /admin
|
||||
})
|
||||
```
|
||||
|
||||
### WYMAGANE — przenieś folder panelu w projekcie
|
||||
|
||||
Plugin ustawia `config.routes.admin`, ale NIE tworzy plików w `app/` projektu.
|
||||
Musisz przenieść folder panelu, żeby ścieżka zadziałała:
|
||||
|
||||
```
|
||||
# PRZED:
|
||||
app/(payload)/admin/[[...segments]]/page.tsx
|
||||
app/(payload)/admin/[[...segments]]/not-found.tsx
|
||||
|
||||
# PO (nazwa folderu = adminRoute bez ukośnika):
|
||||
app/(payload)/its/[[...segments]]/page.tsx
|
||||
app/(payload)/its/[[...segments]]/not-found.tsx
|
||||
```
|
||||
|
||||
Bez przeniesienia folderu: `config.routes.admin = '/its'`, ale `/its` daje 404
|
||||
(brak pliku), a `/admin` też nie działa (config zmieniony). Oba muszą się zgadzać.
|
||||
|
||||
### To OBSCURITY, nie SECURITY
|
||||
|
||||
Zmiana ścieżki utrudnia automatyczne skany, ale NIE jest zabezpieczeniem.
|
||||
Prawdziwa ochrona panelu:
|
||||
- **2FA** dla każdego użytkownika (planowane — wymuszenie przez plugin)
|
||||
- Silne hasła
|
||||
- Rate limiting na logowaniu
|
||||
- IP allowlist (jeśli panel tylko dla zespołu)
|
||||
- buildSecurityHeaders (nagłówki)
|
||||
|
||||
Zmiana `/admin → /its` to warstwa (odsiewa głupie boty), nie zamek. Traktuj jako
|
||||
dodatek do prawdziwych zabezpieczeń, nie zamiast nich.
|
||||
|
||||
## 2FA (TOTP) — WYMUSZONE dla każdego użytkownika
|
||||
|
||||
Plugin wymusza dwuskładnikowe uwierzytelnianie (TOTP) dla WSZYSTKICH użytkowników
|
||||
panelu — bez możliwości wyłączenia per użytkownik. Każdy projekt ma to z automatu.
|
||||
Używa sprawdzonego `@clocklimited/payload-2fa` (wrapuje access control — TOTP
|
||||
sprawdzane przed dostępem do DANYCH, nie tylko UI panelu).
|
||||
|
||||
### Zależność
|
||||
|
||||
```bash
|
||||
pnpm add @clocklimited/payload-2fa
|
||||
```
|
||||
To PEER dependency — ipal-kit importuje ją dynamicznie tylko gdy 2FA włączone
|
||||
(domyślnie). Bez niej i z włączonym 2FA plugin rzuci jasny błąd.
|
||||
|
||||
### Konfiguracja (payload.config.ts)
|
||||
|
||||
```ts
|
||||
ipalKit({
|
||||
i18n: i18nConfig,
|
||||
twoFactor: {
|
||||
issuer: 'Nazwa Firmy', // pokazywane w aplikacji authenticator (Google Auth itp.)
|
||||
// collectionSlug: 'users', // domyślnie 'users'
|
||||
},
|
||||
})
|
||||
```
|
||||
|
||||
Plugin ustawia `forceSetup: true` — każdy użytkownik MUSI skonfigurować TOTP po
|
||||
zalogowaniu (przekierowanie na setup). Nie ma opcji „włącz/wyłącz" dla użytkownika.
|
||||
|
||||
### Wyłączenie (ODRADZANE)
|
||||
|
||||
```ts
|
||||
twoFactor: false // TYLKO gdy projekt naprawdę nie może użyć 2FA (rzadkie)
|
||||
```
|
||||
Domyślnie 2FA jest WYMUSZONE. `false` to świadoma rezygnacja — unikaj.
|
||||
|
||||
### Jak działa dla użytkownika
|
||||
|
||||
1. Loguje się (email + hasło)
|
||||
2. Przy pierwszym logowaniu: przekierowanie na Setup TOTP (QR + sekret)
|
||||
3. Skanuje QR aplikacją (Google Authenticator, Authy, 1Password, Microsoft Auth)
|
||||
4. Wpisuje kod → 2FA aktywne
|
||||
5. Kolejne logowania: email + hasło + kod TOTP
|
||||
|
||||
### Reset 2FA (admin)
|
||||
|
||||
Admin może zresetować 2FA innego użytkownika (gdy zgubi telefon) — przez
|
||||
`adminManageAccess` w konfiguracji @clocklimited. Patrz jego dokumentacja.
|
||||
|
||||
### Dlaczego @clocklimited, nie inne
|
||||
|
||||
Wybrany, bo wrapuje ACCESS CONTROL (TOTP przed dostępem do danych) + forceSetup
|
||||
(wymuszenie dla wszystkich). Inne pluginy 2FA dla Payload gatują tylko nawigację
|
||||
/admin — user z hasłem może omijać przez REST/GraphQL/Bearer. @clocklimited chroni
|
||||
dostęp do danych, nie tylko UI.
|
||||
Reference in New Issue
Block a user