Autentizace
- Autentizace = proces ověřování, zda je subjekt (osoba) tím, za koho se vydává
- Běžně se provádí zadáním uživatelského jména a jedné, nebo více soukromých informací, které by měl znát pouze daný subjekt
- Session management = proces, při kterém server udržuje stav entity, která s ním komunikuje
- Nutné k zapamatování, jak reagovat na jednotlivé požadavky
- Session je na serveru udržována pomocí session ID, které může být předáváno mezi klientem a serverem během požadavků a odpovědí
- Sessions by měly být pro každého uživatele jedinečné a nepředvídatelné
Autentizace obecně
Uživatelská ID
- Ujistěte se, že uživatelská jména / identifikátory nerozlišují velká a malá písmena
- Uživatel “jan” a “Jan” by měl být jeden a ten samý
- Zajistěte jedinečnost uživatelských jmen
- Utajte uživatelská jména u aplikací s vysokým stupněm zabezpečení
- O validaci emailových adres jako uživatelských ID najdete více informací v OWASP cheat sheetu
Implementace autentizace a citlivých účtů
- Nepovolujte přihlašování pomocí citlivých účtů (tj. účtů, které mohou být použity interně v rámci systému, např. k backendu, middleware, databázi)
- Nepoužívejte stejné autentizační řešení (IDP, AD), které se interně používá pro nezabezpečený přístup (veřejný přístup, DMZ)
Implementujte kontrolu síly hesel
- Politika síly hesel ztěžuje nebo dokonce znemožňuje uhodnutí hesla - manuálně i automatizovaně
- Vynuťte minimální délku hesla
- Hesla kratší než 8 znaků jsou považována za slabá
- Nenastavujte maximální délku hesla příliš nízko, aby uživatelům nebránila v jejich vytváření
- Nastavte maximální délku hesla tak, aby se zabránilo DoS útoku zadáním příliš dlouhého hesla
- Běžná maximální délka je 64 znaků, kvůli omezením některých hashovacích algoritmů
- Více informací o správě hesel najdete v cheat sheetu
- Nezkracujte hesla (pokud pracujete s heslem delším než maximální délka, podívejte se do cheat sheetu)
- Povolte použití všech znaků včetně unicode a bílých znaků
- Neomezujte a nezavádějte pravidla pro znaky, ze kterých je heslo složeno
- Zajistěte rotaci credentials v případě úniku hesla nebo v okamžiku kompromitace
- Implementujte měřič síly hesla, který uživatelům pomůže heslo vytvořit a zablokovat běžná a dříve povolená hesla
- Můžete použít knihovnu https://github.com/zxcvbn-ts/zxcvbn
- Pwned Passwords = služba, kde lze hesla porovnat s dříve prolomenými hesly (je možné si ji hostovat, nebo použít API)
Implementujte bezpečný postup pro obnovu hesla
- Umožněte uživateli obnovit si heslo v případě, že ho zapomene
Ukládejte hesla bezpečně
- Ukládejte hesla pomocí správné kryptografické techniky
Používejte bezpečené hashovací funkce
- Porovnávejte uživatelská hesla pomocí bezpečné hashovací funkce (např. PHP
[password_verify()](https://www.php.net/manual/en/function.password-verify.php)
) - Pokud to není možné, zajistěte
- maximální délku vstupu, aby byla služba chráněna před DoS útoky
- explicitní nastavení typu proměnných, aby byla služba chráněna proti útokům na záměnu typu (např. Magic Hashes v PHP)
- vrácení v konstantním čase, aby byla služba chráněná proti timing útokům
Funkce pro změnu hesla
- Ověřte, že je uživatel přihlášen a má platnou session
- Ověřte aktuální heslo - zajistíte tím, že heslo mění oprávněný uživatel
- Legitimní uživatel používá veřejný počítač a zapomene se odhlásit
- Počítač po chvíli použije někdo jiný (předchozí uživatel je stále přihlášený), ale není schopen změnit heslo, protože nezná to původní
Hesla přenášejte pouze prostřednictvím TLS
- Zpřístupněte přihlašovací stránku a stránky po přihlášení pouze prostřednictvím TLS protokolu
- Nepoužití TLS umožňuje útočníkovi upravit akci přihlašovacího formuláře a způsobit odeslání přihlašovacích údajů uživatele na libovolné místo
- Nepoužití TLS na stránkách po přihlášení umožňuje útočníkovi zobrazení session ID, čímž je ohrožena session uživatele
Zvažte silnou transakční autentizaci a autorizaci
- Použijte dvoufaktorové ověření, pokud uživatel přistupuje k citlivým datům nebo operacím
TLS client authentication
- Spočívá v tom, že prohlížeč i server během TLS handshake odesílají své TLS certifikáty
- Stejně jako lze ověřit pravost serveru pomocí certifikátu, je možné ověřit i pravost klienta
- Server musí poskytnout uživateli certifikát vygenerovaný speciálně pro něj a přiřadit příslušné hodnoty, aby bylo možné určit, jakého uživatele má certifikát ověřit
- Vhodné použít, když
- je žádoucí, aby měl uživatel přístup na web pouze z jednoho počítače / prohlížeče
- je uživatel technicky zdatnější (nevyděsí se instalace certifikátu do prohlížeče), případně je k dispozici IT podpora, která to za uživatele udělá
- web vyžaduje další zabezpečení
- se jedná o intranetové stránky organizace
- Nepoužívejte tuto metodu pro široce a veřejně dostupné stránky
- Není dobrý nápad tuto metodu používat pro aplikace typu Facebook
- Vyhnete se sice zadávání hesla, ale vždy tuto variantu zvažte
- Pokud je klient za proxy serverem, který provádí SSL/TLS dešifrování, dojde k přerušení ověřování certifikátu, pokud není web na proxy serveru povolen
Přihlašování a error zprávy
- Nesprávně implementovaná chyba v přihlašování by mohla znamenat uživatelskou nebo password enumeraci
Odpověď na autentizaci
- Reagujte obecnou chybovou zprávou při přihlášení, resetu a obnovení hesla bez ohledu na to, zda
- uživatelské jméno nebo heslo není správné
- účet neexistuje
- je účet zablokován
- Použijte stejný proces také u registrace pokud uživatel existuje
- Cílem je zabránit útočníkovi v provedení enumerace uživatelů
- Byznys logika v enumeraci také napomáhá tím, že je např. příliš pomalá, což útočníkovi naznačuje, že se “něco děje” a může tak provést útok, který je založený na čase
- Příklad pseudo kódu pro login funkcionalitu:
IF USER_EXISTS(username) THEN
password_hash=HASH(password)
IS_VALID=LOOKUP_CREDENTIALS_IN_STORE(username, password_hash)
IF NOT IS_VALID THEN
RETURN Error("Invalid Username or Password!")
ENDIF
ELSE
RETURN Error("Invalid Username or Password!")
ENDIF
- Pokud uživatel neexistuje, aplikace rovnou vyhodí chybu
- Pokud uživatel existuje, ale heslo je špatné, dojde k další chybě
- Tím je doba odezvy odlišná, což útočníkovi umožňuje rozlišit špatné uživatelské jméno a heslo
password_hash=HASH(password)
IS_VALID=LOOKUP_CREDENTIALS_IN_STORE(username, password_hash)
IF NOT IS_VALID THEN
RETURN Error("Invalid Username or Password!")
ENDIF
- Tento kód umožňuje vrátit chybu přibližně ve stejný čas
- Problém s vrácením obecné chyby je záležitostí UX
- Uživatel by se mohl generickými zprávami cítit zmateně a ztížilo by mu to používání aplikace
- Rozhodnutí o vrácení generických chyb by mělo být určeno na základě kritičnosti aplikace a dat
- V enumeraci uživatelů může být účinná CAPTCHA, protože brání enumeraci ve velkém měřítku
- Lze ji použít tam, kde nelze vrátit obecnou chybu kvůli zachování uživatelského komfortu
Přihlášení - příklad špatných hlášek
- Přihlášení uživatele Foo se nezdařilo: špatné heslo
- Přihlášení se nezdařilo: špatné uživatelské jméno
- Přihlášení se nezdařilo: tento účet je zablokován
- Přihlášení se nezdařilo: tento účet není aktivní
Přihlášení - příklad správných hlášek
- Přihlášení se nezdařilo: špatné uživatelské jméno nebo heslo
Obnova hesla - příklad špatných hlášek
- Poslali jsme vám odkaz pro obnovu vašeho hesla
- Tento email v naší databázi neexistuje
Obnova hesla - příklad správných hlášek
- Pokud je tato adresa v naší databázi, zašleme vám email s odkazem pro obnovu hesla
Vytvoření účtu - příklad špatných hlášek
- Toto uživatelské jméno je již používané
- Vítejte! Příhlášení proběhlo úspěšně
Vytvoření účtu - příklad správných hlášek
- Na zadanou emailovou adresu vám byl zaslán odkaz pro aktivaci účtu
Chybové kódy a URL
- Aplikace může vrátit jiný HTTP kód v závislosti na odpovědi k pokusu o přihlášení
- V případě úspěchu může odpovědět 200 a v případě neúspěchu 403
- I když se zobrazí obecná chybová stránka, chybový kód se může lišit, což může vést k úniku informací o tom, zda je účet platný, nebo ne
- Přečtěte si cheat sheet o zpracování chyb
Chraňte se proti automatizovaným útokům
Brute force | Testování více hesel ze slovníku nebo jiného zdroje proti jednomu účtu |
---|---|
Credential stuffing | Testování dvojic uživatelských jmen - heslo získaných z narušení jiného webu |
Password spraying | Testování jednoho slabého hesla na velkém počtu různých účtů |
- Na ochranu před těmito útoky je možné implementovat různé ochranné mechanismy
- V mnoha případech však neposkytují úplnou ochranu
- Při implementaci několika mechanismů najednou (in-depth přístup) se dosáhne přiměřené úrovně ochrany
Multifaktorová autentizace
- MFA je nejlepší obranou proti většině útoků souvisejících s hesly
- Měla by být zavedena všude, kde je to možné
- V závislosti na cílové skupině nebo povaze aplikace však nemusí být praktická
- Více informací najdete v MFA cheat sheetu
Zablokování účtu
- Po určitém počtu neúspěšných pokusů o přihlášení se účet na nějakou dobu zablokuje a znemožňuje další pokusy o přihlášení
- Počítadlo s neúspěšnými pokusy by mělo být spojeno s konkrétním účtem (nikoli s IP adresou atd.)
- Zvažte různé faktory, aby bylo možné najít rovnováhu mezi bezpečností a použitelností
- Počet neúspěšných pokusů před zablokováním účtu
- Časový úsek, ve kterém musí k těmto pokusům dojít
- Na jak dlouho je účet zablokován
- Zvažte použití exponenciálního zablokování namísto pevně stanovené doby zablokování (např. 10 minut)
- Doba zablokování začíná jako krátká, ale po každém neúspěšném pokusu o přihlášení se zdvojnásobí
- Dbejte na to, aby útočník nezneužil DoS zablokováním účtů jiných uživatelů
- Jedním ze způsobů je umožnit uživateli změnit si heslo (funkce zapomenutého hesla), i když je účet zablokován
CAPTCHA
- Slabinou CAPTCHA je možnost jejího vyřešení pomocí automatizovaných technik
- Pohlížejte na CAPTCHU jako na jednu z možností in-depth obrany než jako na prevenci brute force útoků
- Vyžadujte CAPTCHU až po několika neúspěšných pokusech o přihlášení (uživatelsky přívětivější)
Bezpečnostní otázky a zapamatovatelná slova
- Tato technika není považována za MFA, protože jde o stejný faktor jako heslo (něco, co uživatel zná)
- Bezpečnostní otázky jsou často slabé a mají předvídatelné odpovědi, takže je potřeba je pečlivě vybírat
Logování a monitoring
- Umožňuje odhalení útoků v reálném čase
- Zalogujte a zkontrolujte všechny chyby
- Zalogujte a zkontrolujte všechna selhání spojená se zadáním hesla
- Zalogujte a zkontrolujte všechny blokace účtů
- Více informací najdete v cheat sheetu o logování
Používejte autentizační protokoly, které nevyžadují heslo
- Ověřování pomocí uživatelského jména a hesla a MFA je sice považováno za bezpečné, ale v některých případech není považováno za nejlepší nebo dokonce bezpečné
- Příkladem může být propojení aplikací třetích stran, které se chtějí připojit k webové aplikaci
- V takovém případě není považováno za bezpečné umožnit přihlašování pomocí uživatelského jména a hesla, protože se rozšiřuje plocha pro útok, kterou nemáme pod kontrolou
OAuth
- Protokol umožňující aplikaci ověření vůči serveru bez vyžadování hesla
- Používá token vygenerovaný serverem a poskytuje způsob, jakým probíhají autorizační toky - klient tak může serveru sdělit, jaký uživatel službu používá atd.
- Používejte verze OAuth 1.0a nebo OAuth 2.0
- OAuth 2.0 se spoléhá na HTTPS a pro své API služby ho využívá např. Facebook, Google nebo Twitter
- Použití OAuth 1.0a vyžaduje použití kryptografických knihoven pro digitální podpisy
- OAuth 1.0a nespoléhá na HTTPS, takže může být výhodnější pro transakce s vyšším rizikem
OpenId
- Protokol založený na HTTP, který využívá poskytovatele identit k ověření toho, že uživatel je tím, za koho se vydává
- Jednoduchý protokol umožňující způsob jednotného přihlášení (SSO)
- Uživatel může opakovaně používat jednu identitu na více webových stránkách, aniž by musel poskytovateli dávat jakékoli heslo
- Díky jednoduchosti a ochraně hesel se dobře ujal
- Mezi známé poskytovatele identit patří např. Google nebo Facebook
- Pro nepodniková prostředí je OpenId považován za bezpečnou a často lepší volbu, pokud je poskytovatel identit důvěryhodný
SAML
- Sucurity Assertion Markup Language
- Často považován za konkurenci OpenId
- Nejvíce doporučovaná verze je 2.0, protože je funkčně úplná a poskytuje silné zabezpečení
- Stejně jako OpenId používá poskytovatele identit
- Je založen na XML, což poskytuje větší flexibilitu
- Je založen na přesměrování prohlížeče
- SAML není iniciován pouze poskytovatelem služeb, ale také poskytovatelem identit
- To umožňuje uživateli procházet různými portály a přitom se nechat ověřit, aniž by musel cokoliv dělat
- Proces je velmi transparentní
- SAML je často volbou pro podnikové aplikace
- Důvodem je, že existuje velmi málo OpenId poskytovatelů identit, kteří jsou považováni za poskytovatele podnikové třídy
- Způsob, jakým ověřují identity, nesplňuje vysoké standardy pro podnikové identity
- Často se používá uvnitř intranetových webů, někdy dokonce s využitím serveru z intranetu jako poksytovatelem identity
- V posledních letech se aplikace jako SAP ERP a SharePoint rozhodly používat SAML 2.0 jako preferovanou metodu pro implementaci jednotného přihlášení
FIDO
- Dva protokoly pro usnadnění online ověřování
- UAF = Universal Authentication Framework
- U2F = Universal Second Factor
- UAF se zaměřuje na ověřování bez hesla
- U2F umožňuje přidat druhý faktor ke stávajícímu ověřování založeném na heslu
- Oba protokoly jsou založeny na kryptografickém modelu challenge-response
- UAF využívá stávající bezpečnostní technologie, které jsou v zařízeních k ověřování k dispozici - snímače otisků prstů, kamer (biometri obličeje), TEE
- Protokol je navržen tak, aby tyto schopnosti zařízení zapojil do procesu ověřování
- UAF funguje s nativními i webovými aplikacemi
- U2F rozlišuje ověřování založené na heslu pomocí hardwarového tokenu (obvykle USB), který uchovává kryptografické klíče, které používá k podepisování
- Stejný token může uživatel použít jako druhý faktor pro více aplikací
- U2F funguje s webovými aplikacemi
- Poskytuje ochranu proti phishingu tím, že k vyhledávání uloženého ověřovacího klíče využívá URL webové stránky
Správci hesel
- Programy, pluginy nebo webové služby, které automatizují správu velkého počtu credentials
- Většina správců hesel má funkce, které umožňují uživatelům snadno je používat na webových stránkách
- Vložením hesel do přihlašovacího formuláře
- Simulací jejich zadání uživatelem
- Neztěžujte správcům hesel práci více, než je nutné
- Použijte standardní HTML formuláře pro zadávání uživatelského jména a hesla s příslušnými
type
atributy- Vyhněte se přihlašovacím stránkám založených na pluginech (např. Flash nebo Silverlight)
- Implementujte přiměřenou maximální délku hesla (např. 64 znaků), jako je popsáno v cheat sheetu o práci s hesly
- Povolte použití libolných tisknutelných znaků v heslech
- Umožněte uživatelům vkládat uživatelská jména a hesla do polí (CTRL+V)
- Umožněte uživatelům přecházet mezi poli stistknutím klávesy
Tab
Kam dál
Cheat sheety
- Vícefaktorové ověření (MFA)
- Zabezpečení transportní vrstvy
- Správa session
- Ukládání hesel
- Zapomenuté heslo
- Prevence credential stuffing