Zapomenuté heslo
- Pro správné zavedení systému správy uživatelů je zapotřebí integrace služby “Zapomenuté heslo”
- Přestože funkce vypadá jednoduše, je častým zdrojem zranitelností (např. enumerace uživatelů)
- Vraťte konzistentní zprávu pro existující i neexistující účty
- Zajistěte, aby byl response time jednotný
- Sdělte způsob obnovení hesla pomocí jiného kanálu
- Použijte URL tokeny pro nejjednodušší a nejrychlejší implementaci
- Zajistěte, aby vygenerované tokeny byly
- n áhodně generované pomocí bezpečného kryptografického algoritmu
- dostatečně dlouhé (ochrana proti brute force)
- bezpečně uložené
- na jedno použití a expirovaly po uplynutí určité doby
- Neprovádějte změny na účtu, dokud není předložen platný token (např. zablokování účtu)
- Informace ohledně resetování hesla pro vícefaktorové ověření (MFA) najdete v cheat sheetu
Služba zapomenuté heslo
Požadavek na změnu hesla
- Vraťte konzistentní zprávu pro existující i neexistující účty
- Zajistěte, aby se odpovědi vracely v konzistentním čase a útočník nemohl spočítat, které účty existují
- Implementujte ochranu proti nadměrnému počtu automatických odesílání (CAPTCHA)
- Jinak by útočník mohl poslat tisíce žádostí o změnu hesla pro různé účty
- Řiďte se také cheat sheety prevence SQL injection a validace vstupu
Reset hesla
- Umožněte uživateli resetovat heslo po prokázání totožnosti (token z emailu, SMS kód)
- Donuťte uživatele potvrdit heslo dvojím zapsáním
- Zaveďte politiku bezpečného zadávání hesel, která je v souladu se zbytkem aplikace
- Aktualizujte a ukládejte heslo podle bezpečných postupů
- Pošlete uživateli email s informací, že jeho heslo bylo resetováno
- Nezasílejte heslo v emailu
- Nepřihlašujte uživatele automaticky, protože to do kódu vnáší složitost a zvyšuje pravděpodobnost pro vznik zranitelností
- Zeptejte se uživatele, zda chce zneplatnit všechny stávající sessions
Metody
- Abyste mohli uživateli umožnit změnu hesla, musíte mít způsob, jak se s ním spojit prostřednictvím jiného kanálu
- Metody zvyšují míru jistoty, že je uživatel ten, za koho se vydává
- Zajistěte, aby měl uživatel vždy možnost svůj účet obnovit i v případě, že to vyžaduje kontaktování podpory a prokázání totožnosti pracovníkům
Obecné bezpečnostní postupy
- Všechny tokeny a kódy by měly být
- generovány kryptograficky bezpečným generátorem náhodných čísel
- Místo náhodných tokenů je možné použít JWT tokeny
- dostatečně dlouhé (ochrana proti brute force)
- svázány s daným uživatelem v databázi
- zneplatněny po použití
- uloženy bezpečným způsobem
- generovány kryptograficky bezpečným generátorem náhodných čísel
URL tokeny
- Vygenerujte token a přidejte jej do URL query stringu
- Odešlete uživateli token emailem
- Nespoléhejte se na hlavičku
Host
při vytváření resetovacích URL adres- Vyhnete se Host Header injection
- Používejte HTTPS protokol
- Přidejte referrer policy s hodnotou
noreferrer
po resetování hesla (aby nedošlo k úniku odkazů) - Implementujte ochranu proti brute force tokenů (rate limiting)
- Proveďte další kroky ověření uživatele v případě potřeby (bezpečnostní otázky)
- Nechte uživatele vytvořit a potvrdit nové heslo
- Používejte stejnou zásadu pro hesla, jako se používá ve zbytku aplikace
PIN
- Číslo mezi 6 a 12 znaky
- Zaslán uživateli postranním kanálem (SMS)
- Vygenerujte PIN
- Pošlete ho uživateli SMS nebo jiným mechanismem
- Oddělte PIN mezerami, aby byl čitelnější
- Uživatel vyplní PIN spolu se svým username
- Vytvořte omezenou session, která uživateli dovolí změnit si heslo
- Nechte uživatele vytvořit a potvrdit nové heslo
- Používejte stejnou zásadu pro hesla, jako se používá ve zbytku aplikace
Offline metody
- Umožňují reset hesla bez vyžadování speciálního identifikátoru (PIN, token)
- Ověřování stále provádí backend
- Metody jsou poskytovány po registraci nebo speciální konfiguraci
- Tyto identifikátory by měly být uloženy bezpečným způsobem offline (správci hesel)
- Některé implementace jsou postaveny na hardwarových OTP tokenech nebo certifikátech
Backup kódy
- Poskytněte ho uživateli při registraci
- Vyzvěte uživatele k uložení kódu na bezpečném místě
- Metoda uplatňuje například Google nebo GitHub
- Délka by měla být minimálně 8 znaků (pro lepší zabezpečení 12)
- Uživatel by měl mít k dispozici více kódů, aby bylo zajištěné, že jeden z nich bude fungovat
- Většina služeb poskytuje 10 kódů
- Zaveďte proces, který umožňuje uživateli zneplatnění všech existujících kódů pro obnovení v případě, že leaknou
- Omezte rychlost a zaveďte další ochrany, aby se zabránilo brute force kódů a dalším automatizovaným útokům
Bezpečnostní otázky
- Nepoužívejte je jako jediný mechanismus pro resetování hesel
- Odpovědi jsou často uhodnutelné nebo se dají snadno získat
- V kombinaci s ostatními metodami poskytují další vrstvu zabezpečení
- Vybírejte bezpečné otázky, jako je popsáno v OWASP cheat sheetu o bezpečnostních otázkách
Zablokování účtu
- Neblokujte účty jako reakci na útok na zapomenuté heslo - může to být zneužito k odepření přístupu uživatelům ke službě
- Více informací najdete v cheat sheetu o autentizaci