O heslech jsem už několikrát psal (třeba tady a tady a tady). Včera se tady ale rozjela akce ohledně zásad hesel na portále https://www.postaonline.cz. Viz. následující obrázek:
Na první pohled je to zbytečný extrém. Podívejme se, jestli je to extrém i na pohled druhý, nebo třeba není.
Navíc vás to nutí zadat si heslo o délce minimálně 8 znaků. Heslo musí také obsahovat alespoň 3 z následujících znaků: malé písmeno, velké písmeno, číslo nebo speciální znak (do budoucna to budu nazývat 3ze4).
Když jsem to zkoušel založit, vygenerovalo mi to login iuuy35. Tak jsem ho použil do hesla v této formě: iuuy35IUUY35 a normálně to prošlo. Takže souvislost loginu a hesla to nijak nekontroluje.
Zkoušel jsem ještě zamykání (account lockout) - ale nezdá se, že by měli vůbec zamykání účtů, ani po deseti pokusech se mi účet nezamknul.
Porovnejme to třeba i se zásadami hesla pro Windows - v Active Directory (AD DS) i pro lokální účty je možno vyžadovat:
- minimální délku hesla
- musí splňovat 3ze4 - musí obsahovat alespoň 3 z následujících skupin znaků: malé písmeno, velké písmeno, číslo nebo speciální znak
- nesmí obsahovat 3 a více znaků souvisle zapsaných z loginu daného účtu (ve Windows například vám například pro login ondrej neprojde heslo #.J@m5S-BonD7)
- zamykání účtů po několika špatných pokusech - buď až do administrativního ručního odemčení, nebo jen na několik minut
Takže zásady pro PostaOnline pustí něco, co Windows nepustí - login v hesle.
Nezpochybnitelné zásady pro kvalitní heslo
Aby bylo heslo bezpečné, musí být dlouhé. To asi souhlasí každý. Dále je potřeba, aby obsahovalo co nejširší možnou znakovou sadu, protože to oboje zvyšuje počet možných hesel - takže proto ty skupiny různých druhů znaků.
Berme to tak, že útočníkem je úplný anonym, který někde zjistil náš login. Loginy jsou obvykle velmi veřejné a nepovažují se za chráněné. Například ve Windows síti si může libovolný doménový uživatel, nebo i lokální uživatel pracující na doménovém počítači vylistovat všechny loginy z Active Directory. Mnohdy je loginem něco jako emailová adresa.
Proto je ve Windows také to omezení na použití loginu v hesle. Je to ale opravdu nutné, omezovat login v hesle? Má smysl omezovat v hesle slova jako "heslo"? Má smysl blokovat první písmeno malé? Má smysl blokovat poslední číslici?
Na tohle může mít každý nějaký názor. Většinou vám lidé řeknou - jasné, to je přece jasné že si tam každý dá tohle a tohle. Jenže to není pravda. To, že má někdo svůj individuální pocit, že si lidé ta hesla takhle asi volí, je jenom individuální pocit, který se skutečností má společného nula. Kromě případu NBU SK :-) To že si někdo myslí, že si lidé dávají do hesla slovo "heslo" je jenom teorie, která by chtěla nějaké statistické podklady.
Reálné statistiky co lidé dělají a co nedělějí
Jedinné, čím se má smysl řídit, z pohledu ochrany, nebo útoku, je reálně zjištěná statistika toho, jak si lidé rádi volí hesla, když je nic příliš neomezuje nebo nenutí. Našel jsem něco například tady. Jde samozřejmě o to, jak moc systém uživatele omezuje, nebo jak moc velkou volnost jim při vytváření hesla dává.
Výsledky jsou tyto:
- 70% lidí si dá heslo složené pouze z malých písmen
- 15% lidí si rádo dá jenom číselné heslo
- 20% lidí má alfanumerické heslo pokud je to kničemu nenutilo
- 50% lidí má alfanumerické heslo, pokud existuje politika požadující komplexnost tři ze čtyr (3ze4)
Další výzkum, pro nás zajímavější, byl například zde:
- 14% mělo heslo odvozené ze svého jména (přímo jméno, doplněné číslem na konci apod).
- 8% mělo heslo s názvem místa (opět třetina těchto případů měla na konci nebo začátku nebo uvnitř číslo)
- 25% mělo heslo ze slova ve slovníku (opět třetina těchto případů měla na konci/začátku/uvnitř číslo)
- 14% mělo jen číselné heslo (tady se to pěkně kryje s tou předchozí statistikou)
- 2.6% mělo v hesle použitu část své emailové adresy (loginu)
- 0.7% mělo v hesle sekvenci z klávesnice, tzn. QWERTY například
Z těchto výzkumů pro mě plyne, že je vhodné dávat si do hesla nikoliv jen 3ze4, ale 4ze4, protože logicky půjde útok nejprve jen na alfanumerická hesla. Část loginu v hesle se moc nepotvrdila, je to jenom několik málo procent. Stejně jako se nepotvrdila klávesnicová sekvence, která dělá jenom 0.7%. Otázka je, jak by tohle vypadalo v doménovém prostředí, kdyby tam neplatila ona výchozí Windows zásada, že se nesmí v hesle objevit ani část loginu.
Slovníková hesla plus číslice/číslo jsou velice běžná, dokonce cca 50%. Zde by opět pěkně zafungovala politika 4ze4 namísto 3ze4.
Důležitost zamykání účtů
Jakmile zavedete alespoň trošku komplexní hesla, zásadní ochrana je zamykání účtů při zadání špatného hesla po několika pokusech. Tím se dokonale omezí pokusy anonymního útočníka, který o hesle nic dopředu neví a může jenom zkoušet. Jakmile je heslo alespoň trošičku dlouhé a trošičku komplexní, zamykání ho chrání skoro dokonale.
Příklad - vezměme si například jen šestiznakové heslo a zámek dokonce po 70 špatných pokusech a dokonce jen na jednu minutu. Jak dlouho to bude trvat, než to někdo vyzkouší?
- šestiznakových hesel je cca 262 144 000 000
- pokud to někdo bude zkoušet, nejspíš to statisticky trefí po polovině pokusů, tedy 131 072 000 000 hesel
- při takovém zkoušení se to zamkne celkem 1 872 457 142
- což při zamykání na jednu minutu znamená, že se jedná o 3 562 let
Zamykání účtů samozřejmě nastavíte na hodnotu například 3, nebo 5 špatných pokusů. Uděláte to samozřejmě proto, abyste se vyhnuli právě těm základním odhadům typu "heSlo5". nebo "Login7". Pokud máte zamykání a politiku 3ze4, nebo dokonce 4ze4, tak těch možností, jak mohl uživatel okrášli libovolně "stupidní" heslo je tolik, že se to prostě minimálně několikrát zamkne.
A na zámek účtu se dá reagovat nějakým "incidentem".
Moje hodnocení tohoto penetračního testování PostaOnline
Kdybych já dělal pentest na přihlašování do PostaOnline, tak bych to vyhodnotil takto:
- doporučení - zbytečně komplikované a omezující podmínky na heslo, které "otravují" uživatele. Vývoj takto složitého validačního kódu zavání zbytečnými chybami
- doporučení - raději zavést jednoduchou zásadu 4ze4 a odstranit zbytečnosti. Pokud si už uživatel opravdu chce zadat "hloupé" heslo, tak proč bychom mu v tom měli my explicitně bránit? Kód aplikace bude jednodušší a méně otevřený chybám
- kritické - absence zamykání účtů
Mým penetračním testováním by to tedy s kytičkou neprošlo. Nikoliv kvůli heslům, ale kvůli absenci jejich zamykání.
Další poznámky, když už jsem tam lezl, tak jsem se podíval ještě na toto
- sice mají pěkný zelený certifikát, ale nemají v něm jméno postaonline.cz. Takže se tam nedá dostat bezpečně bez zadání www prefixu
- různí auditoři by jim vytknuli, že jejich certifikát je podepsán jen SHA-1. Já jim to ale nevytknu (důvody zde). Je pochopitelné, že ještě v roce 2014 dostali SHA-1 certifikát, protože CA/B forum (CA/browser forum - https://cabforum.org) takové nedoporučilo vydávat až od začátku roku 2015. Navíc jim platí jen do 12.3.2016, takže od roku 2017 už snad budou mít SHA256 a všechno pojede klientům, jak má.
- nejsou na HSTS pre-load listu (list samotný je k nalzení zde)
- heslo z webového formuláře posílají přímo v POST těle nijak nezašifrované (proměnné username a password). Pokud by chtěli řešit bezpečnost přihlašování na maximum, tak mohli to heslo hešovat ještě na klientovi a požadovat nějakou multifaktorovou metodu, jako je sms, nebo apoška na mobil.
Ale to jsou maličkosti :-)