V dnešní době, kdy se svět stále více opírá o data, je ochrana uživatelských údajů naprosto klíčová.
Jako softwaroví vývojáři máme už tak dost starostí: musíme se potýkat se složitými a náchylnými systémy s mnoha potenciálními body selhání, a přitom převádět nejasné lidské požadavky do srozumitelných uživatelských rozhraní a robustních backendů. K tomu všemu se nyní přidává nová, zásadní oblast: zabezpečení dat. A je to naprosto pochopitelné. My sami jako uživatelé jsme rozhořčení, když se s našimi daty zachází neoprávněně (proto je naprosto v pořádku, že chceme svým uživatelům zajistit bezpečný a příjemný zážitek), a navíc to vyžadují i vládní nařízení a firemní politiky.
Zabezpečení dat jako kolektivní zodpovědnost
Zabezpečení je komplikované, protože má několik vrstev a je zodpovědností všech zúčastněných. V moderním cloudovém prostředí se na řízení datového toku podílí mnoho týmů: vývojáři, správci databází, systémoví administrátoři (DevOps inženýři, chcete-li), privilegovaní back-office uživatelé a další. Je snadné, aby tyto role/týmy odvracely zrak a považovaly zabezpečení dat za problém někoho jiného. Realita je ale taková, že každý má své vlastní starosti. Správce databáze nemůže ovlivnit zabezpečení aplikace, DevOps inženýr nemůže zasahovat do přístupu do back-office a tak dále.
Vývojáři a role v zabezpečení dat
Navzdory tomu všemu mají vývojáři největší vliv na to, jak se s daty zachází: vytvářejí všechny části aplikace, propojují ji s různými backendovými službami, přenášejí přístupové tokeny tam a zpět, mají plný přístup ke čtení i zápisu do databázového clusteru. Aplikace, které píší, mají neomezený přístup do všech částí systému (například produkční aplikace Django má právo vypsat nebo smazat celou S3 kolekci za posledních deset let) a tak dále. Výsledkem je, že největší riziko zanedbání nebo přehlédnutí z hlediska bezpečnosti hrozí právě na úrovni zdrojového kódu, což je přímou zodpovědností vývojáře.
Zabezpečení dat je rozsáhlá oblast, kterou nelze v jediném článku plně obsáhnout. Chci se však zaměřit na základní terminologii, kterou by vývojáři měli znát, aby jejich aplikace byly bezpečné. Berte to jako takový základní kurz zabezpečení dat pro aplikace.
Tak pojďme na to!
Hašování
Pokud chcete přesnou definici, vždy se můžete podívat na Wikipedii, ale zjednodušeně řečeno, hašování je proces převodu dat do jiné formy, kde jsou informace nečitelné. Například pomocí známého (a velmi nezabezpečeného) procesu Base64 kódování, lze řetězec „Je moje tajemství u vás v bezpečí?“ převést („hashovat“) na „SXMgbXkgc2VjcmV0IHNhZmUgd2l0aCB5b3U/“. Pokud byste si například psali osobní deník ve formátu Base64, vaše rodina by nemohla číst vaše tajemství (pokud by nevěděla, jak je dekódovat z Base64)!
Tento princip kódování dat se využívá při ukládání hesel, čísel kreditních karet atd. ve webových aplikacích (a ve skutečnosti by se měl používat ve všech typech aplikací). Smyslem je samozřejmě to, aby v případě úniku dat útočník nemohl hesla, čísla kreditních karet atd. použít ke způsobení reálné škody. K provádění tohoto hašování se používají vysoce robustní a sofistikované algoritmy; něco jako Base64 by byl vtip a útočník by to okamžitě prolomil.
Hašování hesel využívá kryptografickou techniku známou jako jednosměrné hašování, což znamená, že i když je možné data zakódovat, není možné je dekódovat zpět. Jak potom aplikace při přihlášení pozná, že je to vaše heslo? No, používá stejný proces a porovnává zakódovanou formu toho, co jste právě zadali jako heslo, se zakódovanou formou uloženou v databázi. Pokud se shodují, můžete se přihlásit!
Když už mluvíme o hashech, je tu jedna zajímavost. Pokud jste si někdy stahovali software nebo soubory z internetu, možná jste byli vyzváni k ověření staženého souboru před použitím. Pokud si například stahujete ISO Ubuntu Linux, na stránce pro stahování uvidíte možnost ověření staženého souboru. Pokud na ni kliknete, otevře se vyskakovací okno:
Vyskakovací okno vás informuje, že máte spustit příkaz, který v podstatě zahašuje celý stažený soubor a výsledek porovná s hashovacím řetězcem uvedeným na stránce pro stahování: 5fdebc435ded46ae99136ca875afc6f05bde217be7dd018e1841924f571db46. Tato konverze se provádí pomocí algoritmu SHA256, jehož zmínku můžete vidět na konci příkazu: shasum -a 256 –check.
Myšlenka je taková, že pokud se hash, který jste si vypočítali vy, liší od uvedeného hashe, znamená to, že někdo do vašeho stahování zasáhl a místo toho vám podstrčil kompromitovaný soubor.
Mezi známá jména, která v oblasti hašování hesel uslyšíte, patří MD5 (nezabezpečená a dnes nepoužitelná), SHA-1 a SHA-2 (rodina algoritmů, do které patří SHA-256 a SHA-512), SCRYPT, BCRYPT atd.
Solení
Celá oblast zabezpečení je taková hra na kočku a myš: zloděj si osvojí současný systém a přijde s novým způsobem prolomení, který se odhalí, a výrobci zámků vylepší své technologie, a tak dále a tak dále. Kryptografie není výjimkou. I když se převod hashů zpět na hesla stal nemožným, útočníci časem vyvinuli sofistikované techniky, které kombinují inteligentní odhady s obrovským výpočetním výkonem. Výsledkem je, že v devíti z deseti případů dokážou uhodnout správné heslo pouze s pomocí hash.
„Pane Rumpelstiltskine, předpokládám?!“
Proto se vyvinula technika solení. Znamená to jen to, že výpočet hashe hesla (nebo jakýchkoli dat) bude proveden na základě kombinace dvou věcí: samotných dat a také nového náhodného řetězce, který útočník nemůže odhadnout. Takže pokud chceme za použití solení hašovat heslo superman009, nejprve si jako „sůl“ vybereme náhodný řetězec, řekněme bCQC6Z2LlbAsqj77a, a pak provedeme výpočet hashe na superman009-bCQC6Z2LlbAsqj77. Výsledný hash se bude lišit od obvyklých struktur generovaných algoritmem, čímž se výrazně sníží prostor pro chytré zpětné inženýrství nebo hádání.
Jak hašování, tak i solení jsou neuvěřitelně komplexní obory, které se neustále vyvíjejí. My jako vývojáři aplikací bychom se do nich nikdy neměli pouštět sami. Ale velmi by nám pomohlo, kdybychom o tom měli povědomí a mohli se lépe rozhodovat. Pokud například spravujete starý PHP framework a zjistíte, že pro hesla používá MD5 hash, víte, že je na čase do procesu vytváření uživatelského účtu přidat novou knihovnu pro práci s hesly.
Klíče
S pojmem „klíče“ se často setkáte v souvislosti se šifrováním. Doposud jsme se zabývali hašováním hesel nebo jednosměrným šifrováním, kdy data nenávratně převedeme a původní podobu zničíme. Pro běžné praktické použití je to ale špatný nápad – dokument napsaný a poslaný e-mailem tak bezpečným způsobem, že si ho nikdy nikdo nepřečte, je k ničemu! Chceme data šifrovat tak, aby informace byly přístupné odesílateli a příjemci, ale během přenosu nebo ukládání by měly být nečitelné.
K tomuto účelu existuje v kryptografii koncept „klíče“. Je to přesně to, co to zní: klíč od zámku. Osoba, která data vlastní, je zašifruje pomocí určitého tajemství zvaného klíč. Pokud příjemce/útočník tento klíč nemá, není možné data dešifrovat, bez ohledu na to, jak sofistikované mohou být jejich algoritmy.
Rotace klíčů
I když klíče umožňují šifrování a jsou spolehlivé, nesou s sebou podobná rizika jako hesla: jakmile někdo zná klíč, celá hra je ztracená. Představte si scénář, kdy někdo hackne část služby jako GitHub (třeba i na pár sekund) a dostane se ke kódu starému 20 let. V kódu také najde kryptografické klíče používané k šifrování firemních dat (hrozná praxe ukládat klíče spolu se zdrojovým kódem, ale budete se divit, jak často se to děje!). Pokud si firma nedala práci s rotací svých klíčů (stejně jako hesel), může být stejný klíč použit ke způsobení velkých škod.
Proto se vyvinula praxe časté výměny klíčů. Nazývá se rotace klíčů a pokud používáte jakéhokoli seriózního poskytovatele cloudových služeb, mělo by to být k dispozici jako automatizovaná služba.
Obrázek: AWS
Například AWS má pro tento účel vyhrazenou službu nazvanou AWS Key Management Service (KMS). Automatizovaná služba vám ušetří problémy s výměnou a distribucí klíčů mezi všechny servery a v dnešní době je standardem u velkých implementací.
Kryptografie veřejného klíče
Pokud vás dosavadní řeči o šifrování a klíčích vedou k dojmu, že je to velmi komplikované, tak máte pravdu. Uchovávání klíčů v bezpečí a jejich sdílení tak, aby data viděl pouze příjemce, naráží na logistické problémy, které by dnešní zabezpečené komunikaci neumožnily fungovat. Ale díky kryptografii s veřejným klíčem můžeme bezpečně komunikovat nebo nakupovat online.
Tento typ kryptografie byl velkým matematickým průlomem a je jedním z hlavních důvodů, proč se internet nerozpadá ve strachu a nedůvěře. Podrobnosti o algoritmu jsou složité a matematicky náročné, proto vám je zde mohu vysvětlit jen koncepčně.
Obrázek: The Electronic Frontier Foundation
Šifrování s veřejným klíčem se spoléhá na použití dvou klíčů k zpracování informací. Jeden klíč se nazývá Soukromý klíč a má zůstat soukromý a nikdy by se neměl s nikým sdílet. Druhý klíč se nazývá Veřejný klíč (odtud název metody) a je určen k zveřejnění. Pokud vám posílám data, musím nejprve získat váš veřejný klíč, data s ním zašifrovat a odeslat vám je. Vy na svém konci můžete data dešifrovat pomocí kombinace soukromého a veřejného klíče. Pokud tedy neprozradíte svůj soukromý klíč, můžu vám posílat zašifrovaná data, která dokážete otevřít jen vy.
Krása systému spočívá v tom, že nepotřebuji znát váš soukromý klíč a kdokoliv, kdo zprávu zachytí, s ní nic nezmůže, i když má váš veřejný klíč. Pokud se ptáte, jak je to vůbec možné, tak nejstručnější a nejméně technická odpověď vychází z vlastností násobení prvočísel:
Pro počítače je těžké rozkládat velká prvočísla. Pokud je tedy původní klíč velmi velký, můžete si být jisti, že zprávu nelze dešifrovat ani za tisíce let.
Transport Layer Security (TLS)
Nyní už víte, jak funguje kryptografie veřejného klíče. Tento mechanismus (znát veřejný klíč příjemce a posílat mu pomocí něj zašifrovaná data) stojí za popularitou HTTPS a díky němu Chrome říká „Tento web je zabezpečený.“ Dochází k tomu, že server a prohlížeč šifrují HTTP provoz (pamatujte, že webové stránky jsou velmi dlouhé řetězce textu, které prohlížeče dokážou interpretovat) pomocí svých veřejných klíčů, což vede k zabezpečenému HTTP (HTTPS).
Obrázek: MozillaJe zajímavé poznamenat, že k šifrování nedochází na transportní vrstvě jako takové. Model OSI neříká nic o šifrování dat. Jde o to, že data jsou zašifrována aplikací (v tomto případě prohlížečem) před tím, než jsou předána transportní vrstvě, která je později odešle na místo určení, kde jsou dešifrována. Tento proces však zahrnuje transportní vrstvu a v konečném důsledku to vše vede k zabezpečenému přenosu dat, proto se vžil volný pojem „transportní“ vrstva zabezpečení.
V některých případech se můžete setkat i s pojmem Secure Socket Layer (SSL). Je to stejný koncept jako TLS, jen SSL vzniklo mnohem dříve a nyní je nahrazeno TLS.
Úplné šifrování disku
Někdy jsou požadavky na zabezpečení tak vysoké, že nic nelze ponechat náhodě. Například vládní servery, kde jsou uložena všechna biometrická data země, nelze nastavit a provozovat jako běžné aplikační servery, protože riziko je příliš vysoké. Pro takové případy nestačí, aby data byla šifrována pouze při přenosu. Musí být zašifrována i v klidu. Proto se využívá úplné šifrování disku, které zašifruje celý pevný disk, aby byla zajištěna bezpečnost dat i při fyzickém narušení.
Je důležité si uvědomit, že úplné šifrování disku musí být provedeno na hardwarové úrovni. Pokud totiž zašifrujeme celý disk, zašifruje se i operační systém a při spuštění počítače se nespustí. Hardware tedy musí vědět, že obsah disku je zašifrován a musí provádět dešifrování za běhu, když předává požadované bloky disku operačnímu systému. Kvůli této práci navíc má úplné šifrování disku za následek pomalejší čtení/zápis, což musí vývojáři takových systémů mít na paměti.
End-to-End šifrování
Vzhledem k neustálým problémům velkých sociálních sítí v oblasti soukromí a bezpečnosti si dnes téměř každý uvědomuje pojem „end-to-end šifrování“, i když to nemá nic společného s vytvářením nebo správou aplikací.
Již dříve jsme viděli, jak úplné šifrování disku poskytuje dokonalou neprůstřelnou strategii, ale pro běžného uživatele to není praktické. Představte si, že Facebook chce chránit data generovaná a ukládaná vaším telefonem, ale nemůže mít přístup k zašifrování celého telefonu a zablokovat tak vše ostatní.
Z tohoto důvodu tyto firmy zavedly end-to-end šifrování, což znamená, že data jsou šifrována při vytváření, ukládání nebo přenosu. Jinými slovy, i když se data dostanou k příjemci, jsou plně zašifrována a přístupná pouze z telefonu příjemce.
Obrázek: Google
Všimněte si, že end-to-end šifrování (E2E) nemá žádné matematické záruky jako šifrování veřejným klíčem. Jde jen o standardní šifrování, kdy je klíč uložen u firmy a vaše zprávy jsou tak bezpečné, jak se firma rozhodne.
Závěr 👩🏫
O většině těchto pojmů jste už asi slyšeli. Možná i o všech. Pokud ano, doporučuji vám, abyste si znovu promysleli své chápání těchto pojmů a také zhodnotili, jak vážně je berete. Pamatujte, že zabezpečení dat aplikací je bitva, kterou musíte vyhrávat neustále (ne jen jednou), protože i jediný incident stačí ke zničení celého odvětví, kariéry a dokonce i životů!