Zabezpečení Slevomatu

Embed Size (px)

DESCRIPTION

Jak jsme zlepšili zabezpečení Slevomatu. Chceš zlepšit zabezpečení webu a nevíš kde začít a kdy skončit? Ukážu ti, co jsme udělali na Slevomatu, co všechno jsme museli vyřešit, čemu jsme se divili a co plánujeme. Třeba tě to trochu taky nakopne.

Citation preview

  • 1. Jak jsme zlepili zabezpeen Slevomat.cz Michal paek @spazef0rze www.michalspacek.cz Tyto slajdy obsahuj poznmky nejen pro ty, kte na pednce nebyli.

2. $this context Slevomat m ~1M zkaznk, v databzi ~1.8M uivatelskch t a web slevomat.cz denn navtv pes 200k nvtvnk. Slevomat v roce 2013 doshl miliardovho obratu, m vlastn znaku zbo i vlastn sklad. Ve Slevomatu pracuje 150 lid, vvojov oddlen t 10 hlav, mezi nimi nap. @kukulich, @vasekpurchart nebo @patrikvotocek. Nechce se k nim pidat? Slevomat pouv PHP 5.5, Nette 2.1, Elasticsearch a MySQL resp. Percona Server, kter obslou ~2.5M dotaz za hodinu. sla kreditnch karet nejsou uloena v databzi Slevomatu, pamatuje si je platebn brna. Uivatel mohou na svch tech mt kredity, ktermi mohou platit, ale nedaj se pevdt na jinho uivatele. 3. Dve bylo mon se pihlsit z jakkoliv strnky po kliknut na tlatko vpravo nahoe se rovnou objevil pihlaovac formul a to i pesto, e strnka pila po nezabezpeenm HTTP. Formul se sice odeslal ifrovan pomoc HTTPS, ale mohl bt po cest do prohlee zmnn tak, aby se odeslal nkam pln jinam. Pihlaovn jsme tedy pesunuli na samostatnou strnku, kter se stahuje po HTTPS, obsah formule tedy do prohlee doraz v pvodnm stavu. 4. Web slevomat.cz zatm neb cel na HTTPS, take akoliv se ppadn mizera nedostane k pihlaovacm dajm zmnou formule po cest, me se odposlechem dostat k session id cookie, protoe ta se pen i po nezabezpeenm HTTP. A bude cel web pstupn pouze po HTTPS, cookie ozname jako Secure a tm zajistme, e se bude penet jen po ifrovanm HTTPS a nepjde odposlechnout. Direktivy session.cookie_httponly a session.use_only_cookies pro obranu ped toky na session mme samozejm zapnut u docela dlouho. session.cookie_secure 5. Pi relativn velk zti webovch server Slevomatu nechceme pechod na zabezpeen HTTPS udlat najednou, ale radji postupn pesunujeme jednotliv sti webu. Velmi brzy bude cel web pstupn jen a pouze pes HTTPS. A pak zas meme vrtit pihlaovac formul do Lightboxu na kadou strnku. 6. HTTP Strict Transport Security Strict-Transport-Security: max-age=31536000; includeSubDomains A bude cel web pstupn pouze pomoc HTTPS, budeme poslat hlaviku Strict-Transport-Security, kter zajst to, e se prohle ani nebude pokouet server kontaktovat po HTTP a rovnou bude po stanovenou dobu vechny odkazy sm pevdt na HTTPS. Zabrnme tm man-in-the-middle tokm, kter pevdj ifrovan HTTPS spojen na obyejn HTTP. Hlaviku podporuje vtina modernch browser, IE ji bude podporovat od verze 12. 7. Penos hesel a session ids tedy bude zabezpeen docela dobe. K uivatelskm dajm se ale d dostat i jinak, ne odposlechem. Teba tak, e jednoho krsnho dne najdete na serveru 12 GB zloh cizch databz, protoe je tam nkdo kdysi nahrl a nesmazal. Opravdu se to stv a je lep potat s tm, e i vae databze se me nkde objevit. 8. $dibi select('jmeno') where( "id = $_GET[id]"); Ale nemus to bt jenom zlohy na nepatinch mstech. Firemn daje a hesla uivatel se z databze daj vysosat teba spnm provedenm toku SQL Injection. Spousta uivatel pouv jedno heslo na vce mstech a kdy z jednoho takovho msta to heslo unikne, tak radji nedomlet. A ano, SQL Injection lze provst i v Nette, Dibi a PDO, pokud se tyto nstroje pouij trochu neikovn. dn nstroj automagicky nevye zabezpeen webu. 9. 8b8f05049b2114ad3d33 0db391e78549670d6b4b Slevomat dve heslo ped uloenm zahashoval pomoc algoritmu SHA-1, aby nebylo tak jednoduch ho zskat, pokud by se k databzi njakm zpsobem dostal nkdo nepovolan. Heslo nebylo saltovan, take nebylo chrnno proti tzv. narozeninovm tokm, ani proti pouit pedpotanch tabulek. Jene ty se u dnes stejn moc nepouvaj, hesla se crackuj hrubou silou, slovnkovmi nebo hybridnmi toky. Kad obyejn laptop um spotat destky milin SHA-1 hash za vteinu a modern grafick karty jsou stokrt rychlej. Cracknout takov bn heslo hashovan SHA-1 je tedy otzkou maximln pr minut a ani salt by crackovn nezpomalil. Zkuste si to sami pomoc nstroje oclHashcat. 10. cHJvZDE=;GwEuCSSgBCL x0BHHAAb8IA==;kvmDV/ DEJ3H+how7bErLa+/xap V2282MmISXqVo8xREfnB KcNmAixIaDDnYkODCu9K W3+6sbM04W7Tm3w1S+NQ== Nyn Slevomat ukld hesla tak, e heslo zahashuje relativn pomalm algoritmem bcrypt, aktuln s cost parametrem 10. Vsledn hash se navc zaifruje pomoc AES-256-CBC a pot se ulo do databze. Je to klacek pod nohy, pravdpodobnost, e se mizera dostane k databzi a zrove ke konfiguranmu souboru aplikace, ve kterm je uloen ifrovac kl, je mnohem men, ne e se dostane jenom k databzi. A pokud zsk databzi i kl, tak po rozifrovn m ped sebou pod ty bcrypt hashe. Ve je m aktuln heslo tak, jak je uloeno v produkn databzi Slevomatu. Vimnte si id kle, inicializanho vektoru a ifrovanho hashe, ve oddleno stednkem a zakdovno do Base64. 11. password_hash(, PASSWORD_DEFAULT) ircmaxell/password_compat Pro pouh hashovn hesel algoritmem bcrypt pouijte funkci password_hash() a pro oven password_verify(). Tyto funkce jsou dostupn a od PHP 5.5, ale pro star PHP (od PHP 5.3.7) existuje knihovna password_compat, kter tyto funkce implementuje v istm PHP. Najdete ji na GitHubu nebo ji mete nainstalovat pomoc Composeru. Jednoduch pklad najdete na GitHubu: https://github.com/spaze/encrypt-hash-password-php v souboru hash.php. 12. mcrypt_encrypt() MCRYPT_RIJNDAEL_128 Pro nsledn ifrovn hash hesel pomoc AES-256 v PHP pouijte funkce mcrypt_encrypt() a mcrypt_decrypt() z rozen mcrypt. Blokov ifra AES je variantou ifry Rijndael s velikost bloku 128 bit, pouijeme tedy konstantu MCRYPT_RIJNDAEL_128. Hodnota 256 v nzvu znamen velikost pouitho ifrovacho kle v bitech. Pro ukldn hash je vhodn reim CBC (Cipher-block chaining), ten pi voln mcrypt_encrypt() zvolme pomoc MCRYPT_MODE_CBC. Inicializan vektor vytvome funkc mcrypt_create_iv() s parametrem MCRYPT_DEV_URANDOM. Jednoduch funkn pklad najdete opt na GitHubu: https://github.com/spaze/encrypt-hash-password-php v souboru encrypthash.php. 13. aes(bcrypt(sha1())) aes(bcrypt()) Ve Slevomatu jsme chtli zabezpeit i hesla uivatel, kte se dlouho nepihlsili. Vzali jsme tedy stvajc SHA-1 hashe, zahashovali bcryptem a pak zaifrovali AES-256. Takov hesla jsme si oznaili, abychom pi ovovn vdli, e z hesla zadanho uivatelem mme nejdve udlat SHA-1 hash a a pak s nm pracovat dle. Kdy se takov uivatel spn pihls, tak zadan heslo v iteln podob zahashujeme jen bcryptem s vynechnm SHA-1, hash zaifrujeme a vsledek ulome do databze. To dlme i pi nastaven hesla novho. Mezikrok s SHA-1 je lep, ne vynucen zmna hesla vech uivatel, je ale zbyten a pokud meme, tak ho odstranme. 14. bcrypt(token) Pomoc funkce password_hash() hashujeme i tokeny pro semi-permanentn pihlen i pro pihlen pomoc Facebooku. V iteln podob je v databzi nemme. Token z cookie pak ovujeme stejn jako heslo pi pihlaovn, tedy funkc password_verify(). Hash tokenu v databzi nalezneme podle identifiktoru uivatele z cookie. 15. Funkci Zapomenut heslo mme vyeenu tak, e uivateli poslme odkaz, kter obsahuje token, jeho platnost je asov omezena momentln na 30 minut od odesln odkazu. Tento interval by neml peshnout 60 minut. E-mail nov obsahuje i odkaz pro zneplatnn tokenu. Token hashujeme bcryptem, v databzi nen uloen v iteln podob. Zkaznick podpoe jsme odebrali monost nastavovat hesla uivatelm v administraci Slevomatu, ale pro nkter domny jsme tuto monost museli vrtit zpt. Centrum.cz toti doruuje nkter e-maily s mnohahodinovm zpodnm a uivatel tak provihne interval, bhem kterho je token platn a o pomoc pak d prv zkaznickou podporu. 16. Vae heslo je: Hesla nov nikdy neposlme e-mailem, ani pi registraci. Veker zmny logujeme a vme kdo, kdy a z jak IP adresy zmnil heslo nebo e-mailovou adresu. Uivatele po zmn informujeme, pro jistotu. Brzy chceme zmnit politiku vytven hesel, souasn omezen na min. 5 znak je dnes ji nevyhovujc. Nov hesla by mla mt minimln 8 znak. Maximln povolen dlka hesla je 4096 znak, del hesla pli zatuj server pi hashovn bcryptem. 17. Content Security Policy Ve Slevomatu pouvme ablonovac systm Latte, kter je soust Nette Frameworku. Latte automagicky oetuje vypisovan promnn, ale i pesto se me stt, e udlte chybu, teba pi tvorb vlastnch maker, a v web bude zraniteln pomoc toku Cross-Site Scripting (XSS). Ke snen dopadu ppadnho spnho toku bude Slevomat brzy poslat HTTP hlaviku Content-Security-Policy, kter vyjmenovv zdroje (whitelisting), odkud me prohle do strnky vkldat obrzky, kaskdov styly, JavaScript a dal. Browser nebude spoutt ani inline JavaScript, pokud se pole i hodnota 'unsafe-inline', JavaScriptov kd pak mus bt v externch souborech. Na pesunu piln pracujeme. 18. Poslat hodnotu 'unsafe-inline' rozhodn chcete, zakznm spoutn JavaScriptu vloenho pmo do strnky zabrnte spnmu proveden toku Cross-Site Scripting i kdyby nkdo njak do strnky njak JavaScript vloil. Obas se pmo do strnky mysln vkld njak konfigurace, ovem pokud je to udlno ve uvedenm zpsobem, tak to pestane fungovat. S 'unsafe-inline' momentln nefunguje ani kd Google Tag Manageru, a to ani s vyuitm experimentln podpory nonce-source z pipravovan specifikace CSP 1.1 v Chrome 35. Slevomat pouv Google Tag Manager a 'unsafe-inline' je pro ns tedy momentln nepouiteln. 19. Konfiguraci ve strnce je mon zachovat, jen je poteba zmnit typ obsahu znaky SCRIPT na text/json. JSON nen kd, nelze spustit a browser ho tedy pi 'unsafe-inline' nemus blokovat. V code.js se pak k hodnotm dostanete takto: var c = document.getElementById('conf'); var d = JSON.parse(c.textContent || c.innerHTML);. 20. $c = stream_context_create(array( 'ssl' => array( 'verify_peer' => true, 'verify_depth' => 9, 'cafile' => $caFile, 'disable_compression' => true, ) )); Pokud potebujeme komunikovat s njakm API, pouvme k tomu ifrovan protokol HTTPS. Pro bezpenou komunikaci musme tak ovovat, e opravdu komunikujeme teba s bankou a e to nen njak mizera, kter se za banku vydv. Vypnutm TLS komprese se pak brnme proti toku CRIME. Takto bude defaultn nastaveno i PHP 5.6+. 21. JDE TO! www.michalspacek.cz V zabezpeovn Slevomatu a uivatelskch dat budeme samozejm pokraovat dle, jet ns ek spousta prce, ale kdy se chce, tak to jde. Snad jsem vs tak trochu inspiroval a pokud byste chtli se zabezpeenm web a aplikac pomoci, napite mi, rd pomohu. Kontakty jsou uvedeny na mm webu. Dky!