56 lines
2.8 KiB
Markdown
56 lines
2.8 KiB
Markdown
# Security model
|
||
|
||
## Domyslne zasady
|
||
|
||
- Panel nasluchuje domyslnie tylko na `127.0.0.1`.
|
||
- Produkcyjny cookie sesji: `Secure`, `HttpOnly`, `SameSite=Strict`.
|
||
- Kazda mutacja po zalogowaniu wymaga CSRF.
|
||
- Sesje/challenge MFA maja losowe tokeny kryptograficzne.
|
||
- Logowanie i recovery sa limitowane per IP + konto.
|
||
- CSP nie zawiera `unsafe-inline` ani `unsafe-eval`; dodatkowo nosniff, frame deny, no-referrer i ograniczony Permissions-Policy.
|
||
- Request body i timeout sa limitowane.
|
||
- Za reverse proxy adres klienta brany jest z `X-Forwarded-For`/`X-Real-IP` tylko od adresow z `security.trusted_proxies` (prawy skrajny niezaufany adres) – klient nie moze podszyc sie pod inny IP.
|
||
- Sesje sa co `session_revalidate_seconds` sprawdzane w bazie: wylaczone/usuniete konto oraz odebrane domeny dzialaja natychmiast.
|
||
- Zmiana hasla wylogowuje pozostale sesje konta; zmiana hasla/dezaktywacja przez administratora wylogowuje wszystkie sesje tego konta.
|
||
- Wygasle sesje, wyzwania MFA i liczniki prob sa okresowo czyszczone z pamieci.
|
||
- `hsts = true` dodaje `Strict-Transport-Security`.
|
||
|
||
## Development mock DB
|
||
|
||
`database.dev_mock=true` jest akceptowane tylko z `environment="development"` i SQLite. `dev.sh` tworzy `.dev/postfixadmin-rs.sqlite` z publicznymi testowymi credentialami. Tego pliku ani tych kont nie wolno przenosic do produkcji; `.dev/` jest ignorowane przez Git i nie trafia do paczki release.
|
||
|
||
## Legacy hasla
|
||
|
||
Formaty MD5, SHA1, DES, cleartext i podobne sa wspierane tylko dla zgodnosci. Nie nalezy automatycznie migrowac mailbox hashy do Argon2, jesli Dovecot/Postfix SASL nie obsluguje tego samego schematu.
|
||
|
||
Weryfikator rozpoznaje samopisujace hashe i moze obslugiwac mieszana baze podczas migracji. Nowe hashe sa generowane przez `password.scheme`. Recovery tokeny sa zawsze Argon2id i nie dziedzicza legacy schematu.
|
||
|
||
Fallback `doveadm pw` nie uzywa shella. Haslo jest przekazywane przez stdin, nie przez argv procesu.
|
||
|
||
## Hooki
|
||
|
||
Hook to lista `[program, arg1, arg2, ...]`. Program jest wykonywany bez `sh -c`; placeholdery sa podstawiane jawnie. `allow_legacy_shell_hooks` nie wlacza arbitralnej powloki.
|
||
|
||
## Alias i fetchmail
|
||
|
||
Niebezpieczne cele aliasow (pipe/command) sa domyslnie blokowane. `fetchmail_extra_options=false` blokuje arbitrary MDA/extra options.
|
||
|
||
## Sekrety
|
||
|
||
Hasla DB/SMTP trzymaj poza TOML, np.:
|
||
|
||
```bash
|
||
POSTFIXADMIN_RS__DATABASE__PASSWORD='...'
|
||
POSTFIXADMIN_RS__SMTP__PASSWORD='...'
|
||
```
|
||
|
||
Nie commituj `.env`.
|
||
|
||
## Reverse proxy i IP
|
||
|
||
Obecna wersja uzywa bezposredniego TCP peer do rate limit i TOTP exception. Za reverse proxy nie wlaczaj TOTP IP exceptions, dopoki nie ma jawnie skonfigurowanego trusted-proxy header handling.
|
||
|
||
## Deployment
|
||
|
||
Uruchamiaj jako dedykowany, nieuprzywilejowany user. Przyznaj tylko potrzebny dostep do `doveadm`, `openssl`, `mysqldump`/`pg_dump` i wymaganych socketow/uslug. Nie uruchamiaj jako root.
|