Yubikey v2.0
Na Yubikey, výrobek švédské firmy Yubico, jsem už kdysi dávno narazil a teď před pár týdny mi ji někdo připomněl. Co to je? Docela zajímavá věcička, vzhledově i účelem velice podobná klasickým bezpečnostním tokenům, ale postavená na úplně jiném principu. To má své nevýhody, zejména co se bezpečnosti týče, ale také nezanedbatelné výhody – mimo jiné velice slušnou kompatibilitu s nejrůznějšími aplikacemi.
Z obrázku je vidět, že Yubikey (zde v bílém provedení, koupit se ale dá i černé a pokud objednáte větší množství – tzn. 5000 kusů a více – lze si vybrat barvu libovolnou) je velice malá hračka – výrobce uvádí rozměry 18x45x3 milimetry a váhu 2,5 gramu. Celé je to vyrobeno z jednoho kusu tvrdého plastu se zalisovanými integrovanými obvody, bez jakýchkoliv pohyblivých částí (to, co vypadá jako tlačítko, je jen dotyková ploška) a bez zdroje energie. A k čemu to slouží? Podobně jako klasické tokeny je Yubikey určen k přidání druhého autentizačního faktoru – vedle běžného „what you know“ (co člověk zná, typicky heslo) přináší běžnému uživateli ještě požadavek na „what you have“ (co člověk má, typicky token). Ovšem na principu naprosto odlišném než u klasických tokenů.
Úvaha firmy Yubico jde zhruba tímto směrem: Token je bezpečné a časem prověřené řešení, které ale má jednu zásadní nevýhodu – problematickou kompatibilitu. Každý token funguje trochu jinak a program, který ho má využít, musí tyto odlišnosti respektovat. Pod Windows to není problém, protože každý výrobce tokenů ovladače pro nejrozšířenější systém ve vlastním zájmu dodá, ale podpora pod jinými operačními systémy je nejistá a v pre-boot prostředí skoro vyloučená, a i kdyby tohle všechno bylo vyřešeno, pořád je tu otázka softwaru, který k tokenu bude přistupovat – drtivá většina aplikací s tokeny příliš nepočítá. Nedalo by se ale navrhnout něco, co bude plnit zhruba stejnou funkci, ale nebude trpět těmito nedostatky?
Tím něčím je právě Yubikey. Jak se vypořádal s nastíněnými problémy? Vlastně docela jednoduše – Yubikey se vůči počítači tváří jako běžná USB klávesnice, která na vyžádání vyšle určitou sekvenci znaků. Jde jen o to, aby ta sekvence znaků šla využít – ani ne tak operačním systémem samotným (dnes už existuje řada operačních systémů, které dokáží vstup z klávesnice přijmout a předat ho aplikaci), jako spíš konkrétními aplikacemi. Yubikey to řeší tak, že umožňuje práci ve dvou zásadně odlišných režimech, určených pro odlišné situace a nesoucích odlišné dopady na bezpečnost a kompatibilitu.
One-time-password
Základním, a v prvních verzích Yubikey jediným, režimem práce je režim „one-time-password“, tedy „jednorázové heslo“. Jde o režim velmi vhodný pro autentizaci, který se vyznačuje tím, že každé heslo má jen omezenou časovou platnost a jde ho použít jen jednou – při pokusu o opakování to autentizační program pozná a pokus odmítne. V případě Yubikey to funguje zhruba následovně (přesný postup je popsán v manuálu; je to docela krátké a srozumitelné čtení, takže pokud vás zajímají detaily, odkážu vás přímo na Yubikey Technical Manual): Při stisku tlačítka Yubikey poskládá balíček dat složený z privátního ID (řetězec znaků stanovený uživatelem), čítače stisků tlačítka (ve skutečnosti jsou to čítače dva, zřejmě z praktických důvodů, aby byl uživatel rychleji donucen koupit nový Yubikey), časové značky, náhodného čísla, a kontrolního součtu toho všeho. Tento balíček zašifruje šifrou AES se 128bitovým klíčem (také stanoveným uživatelem) a zakóduje do sekvence kláves, kterou pošle počítači. Autentizační program převezme tuto sekvenci, odšifruje AES (protože mu uživatel už dříve řekl šifrovací klíč) a zkontroluje CRC (a případně privátní ID. Tím si ověří, že řetězec přišel ze správného Yubikey. Následně se podívá na čítač stisků a porovná si ho se svojí uloženou hodnotou; pokud je čítač menší nebo roven, jde o opakovaný klíč a autentizační program ho odmítne. V opačném případě si uloží načtenou hodnotu čítače a přihlášení uživatele povolí.
Tohle všechno pochopitelně vyžaduje, aby software Yubikey znal a uměl si z jeho řetězce dekódovat požadovaná data, což se nijak výrazně neliší od problémů tokenů (rozdíl je jen v tom, že výstup Yubikey každý program dokáže aspoň načíst, protože to pro něj je prostě jen sekvence kláves, na jejichž čtení nepotřebuje žádné zvláštní API). Navíc se to dá rozumně použít jen pro autentizační úlohy, ale už ne moc dobře pro vytváření šifrovacího klíče třeba pro TrueCrypt (jasně, v zásadě by se to privátní ID dalo použít jako klíč, ale na to je dost krátké). Proto má Yubikey ještě druhý režim:
Static password
V tomto režimu je Yubikey naprogramován tak, aby při stisku „tlačítka“ vypustil vždy stejnou dlouhou sekvenci znaků, pokud možno náhodně generovaných. Tu lze tudíž použít jako heslo všude tam, kde libovolný program očekává stále stejný tajný vstup z klávesnice – v přihlašovací obrazovce Windows, v TrueCryptovském dotazu na heslo při bootu, atd. Proti klasickému heslu to má tu zásadní výhodu, že vyprodukovaný řetězec je dlouhý a naprosto náhodný, tudíž odolný proti slovníkovým a dalším brute-force útokům. Navíc nehrozí, že ho uživatel zapomene – dokud Yubikey neztratí, stačí mu vzpomenout si, do kterého konektoru se klíč strká a jak se na něm mačká tlačítko. Kompatibilita je skoro úplná, výrobce si dal i tu práci, že svůj výstup kóduje jen do těch písmenek, které jsou na všech klávesnicích na stejném místě; problém mohou dělat jen programy, které nepočítají s dlouhými hesly (i ten slavný TrueCrypt končí na šedesáti čtyřech znacích…). V konfiguraci lze dokonce do jisté míry ovlivnit chování „kolem“ samotného hesla – jde například říct, že před heslem se má „zmáčknout“ tabulátor a po hesle zase „enter“, dokonce lze (s jistými omezeními) stanovit i fixní část úplně na začátku (ještě před tabulátorem) – lze tak dosáhnout třeba toho, že myší kliknu do políčka pro uživatelské jméno, zmáčknu tlačítko na Yubikey a nejen že se mi vyplní jméno i heslo, ale rovnou se to i odešle ke zpracování.
Výborná věc je, že od verze 2.0 (prodávaná zhruba od půlky června) lze každému Yubikey nastavit dva „profily“: Na krátké stisknutí tlačítka se aktivuje jeden profil, na dlouhé stisknutí druhý profil. Oba profily jsou naprosto nezávislé a jde libovolně kombinovat one-time-password i static password – můžete mít tedy 2x OTP nebo 2x SP, nebo 1+1 v libovolném pořadí.
Jak je to s podporou aplikací pro OTP? Wikipedia Yubico udává několik aplikací, které už Yubikey podporují – ze známějších třeba TrueCrypt, Google Apps nebo blogovací systém WordPress. V řadě případů je ovšem výraz „podpora“ poněkud nadnesený, protože jde prostě o použítí statického hesla (TrueCrypt, například).
Nic vám ovšem nebrání napsat si podporu do své aplikace – k dispozici jsou knihovny pro C/C++, Javu, PHP a některé další jazyky, a převést tyto knihovny do jazyka dalšího je triviální záležitost. Nepříliš složitější pak je využití těchto knihoven ve vlastní aplikaci – speciálně s mojí pascalskou knihovnou (včetně variant „commandlajnová aplikace“ nebo „DLL“) to je doslova práce na jeden řádek kódu, jak uvidíte v blízké budoucnosti, až odladím a ověřím svůj fork FTP serveru SlimFTPd s podporou Yubikey.
Použití
Použití static password je asi zřejmé – dají se jím nahradit nebo prodloužit (zesložitit) klasická hesla, zejména v šifrovacích programech. U OTP je situace složitější – nepochybně se může hodit v některých armádních aplikacích, ale popravdě řečeno jsem dost dlouho nechápal, k čemu by mi mohlo být doma: server to neochrání vůbec (když útočník kompromituje server, získá i všechny údaje pro zfalšování Yubikeye), přenosovou cestu by to sice ochránilo, ale na to máme i účinnější prostředky (VPN, SSL apod.). Až později mě to trklo: tohle je určené na ochranu před kompromitovaným klientským strojem! Dejme tomu, že mám někde server přístupný z internetu. Je celkem jedno, co je to za typ serveru, představte si třeba poštovní nebo FTP server, podstatné ale je, že k tomuto serveru potřebuji přistupovat a že bych skoro radši, kdyby k němu nemohl přistupovat někdo další. To samozřejmě dokážu nějakým tím šifrovaným tunelem zařídit, až na jednu drobnost: ten tunel musím někde spustit a na tomto počítači je ten tunel napadnutelný (minimálně si lze představit, že nějaký malware soubory potřebné pro vytvoření tunelu zkopíruje). Dokud s sebou tahám notebook, ze kterého se připojuji, tak to není problém, ale dříve či později nastane situace, kdy se potřebuji připojit k serveru a svůj důvěryhodný notebook s sebou nemám – budu muset využít nějakou internetovou kavárnu nebo třeba počítač zaměstnavatele, a na obou mohu nějakou havěť s jistotou očekávat. OTP tohle velmi uspokojivě řeší – dobře, útočník si zachytí přihlašovací heslo, ale toto heslo mu bude houby platné, protože se dá použít jen jednou!
Bezpečnost
Jak je na tom Yubikey s bezpečností? Nevyrovnaně. Na samotných kryptografických základech není v současné době co zlepšovat (zapomeňte na námitky, že 256bitový klíč by byl lepší – byl, ale ani pro 128bitový klíč k AES není v současné době znám ani teoretický způsob, jak ho prolomit). Jsou ale určitá omezení, která je potřeba mít na paměti:
-
Statické heslo je, stejně jako každý jiný vstup z klávesnice, volně napadnutelné keyloggery. Na teoretické úrovni to není problém, protože jakmile je počítač zkompromitovaný (nebo potenciálně zkompromitovaný, třeba proto, že je útočníkovi fyzicky přístupný), nelze na něm žádnou operaci považovat za zcela bezpečnou. Z praktického hlediska je ovšem nutné si přiznat, že keyloggery jsou podstatně rozšířenější než mikrokamery nebo zmrazovače pamětí a tudíž je daleko pravděpodobnější, že na ně narazíte.
-
OTP trpí zase jiným problémem: Kvůli zvolenému kryptografickému řešení (symetrická šifra AES) je slabým místem server – aby byl schopen konkrétní Yubikey autentizovat, musí obsahovat taková data, která mu v případě zájmu dovolí tento Yubikey i zfalšovat. Je to dokonce triviálně jednoduché – ze serveru si útočník vytáhne privátní ID a šifrovací klíč, čítač si může celkem libovolně tipnout (zvolí prostě tak velké číslo, aby bylo určitě větší než pravý čítač) a zbylé údaje jsou buď náhodné (tzn. z hlediska útočníka držícího klíč a ID volně volitelné) nebo z předchozích dopočitatelné. Oběť na to pochopitelně rychle přijde, protože všechna její hesla začnou být odmítána (protože mají nižší čítač použití než nasadil útočník), ale to je celkem málo platné. Tady by bylo velice vhodné do nějaké budoucí verze Yubikey zapracovat nějakou asymetrickou šifru – ověřující server by měl jen veřejný klíč, kterým by dokázal ověřit platnost OTP, ale ne už vygenerovat nové OTP.
-
Asi není třeba zvlášť zdůrazňovat, že jeden profil Yubikey se smí použít jen na jednom serveru (klidně i ve víc aplikacích, které ovšem budou používat společnou databázi čítačů), jinak padá jednorázovost (pokud nejsou databáze propojené, tak se první server nedozví o použití Yubikey na serveru druhém, a „jednorázové“ heslo z druhého serveru půjde použít i na něm).
-
Yubikey samotný nemá takřka žádné zabezpečení proti zneužití – zařízení se nestará o to, kdo to tlačítko mačká, ale jen o to, že ho mačká. Pokud vám Yubikey někdo ukradne, bez problémů se s ním bude moci přihlašovat na vaše účty. Zvlášť kritické je to u statických hesel, která se budou obtížně měnit (nezapomeňte na to, že staré zálohy budou uložené ještě se starým heslem). Pro svoje potřeby počítám s tím, že moje dosavadní dlouhé a složité heslo pomocí Yubikey nenahradím, ale jen doplním – vznikne ještě mnohem delší a složitější heslo, a když mi někdo Yubikey ukradne, to dosavadní „čistě paměťové“ heslo by mělo být dostatečně silné na to, aby data ochránilo.
Určitým světlem na konci tunelu je to, že z ukradeného Yubikeye nejde vytáhnout ani šifrovací klíč, ani privátní ID (s možnou výjimkou rozebrání celého zařízení, ale to bude u jednolitého kusu plastu docela obtížné) – celé zařízení se pro účely nastavování chová jako write-only, tzn. jde do něj zapsat, ale neexistuje rozhraní, kterým by se dalo zapsané přečíst. Dokonce jde zařídit i to, aby pro zápis bylo napřed vyžadováno „zapisovací heslo“, bez kterého se nastavení nedá změnit. Pokud tedy včas změníte přihlašovací údaje na svých serverech, zloděj získá akorát luxusní otvírák lahví :-).
Cena a dostupnost
Yubikey stojí 25 USD. K tomu ovšem musíte připočítat DPH ve výši 25% (protože Yubico je švédská firma a Švédsko je stejně jako ČR členem EU, platíte švédskou DPH) a dalších 5 USD poštovného (bez ohledu na počet objednaných Yubikeyů). Za dva kousky (černý a bílý) jsem tedy zaplatil 68,75 USD. Musel jsem ovšem docela dlouho čekat na dodání, poptávka je velká a Yubico nestíhá vyrábět dost rychle. Ale třeba budete mít větší štěstí.
Cena je asi největší problém celého Yubikey: vlastně vás tak každý ochráněný server přijde na 12,50 USD. A ruku na srdce – opravdu vám možnost bezpečně se přihlásit na váš blog z cizího počítače za tuto cenu stojí, když stejně dobře můžete počkat do večera a přihlásit se stejně bezpečně, ale zadarmo, z domova? Opravdu se za tuto cenu budete chtít přihlašovat ke Googlovským aplikacím? A opravdu si za tuto cenu budete zřizovat účet na diskusním fóru Yubica? (Prý kvůli spamu je Yubico Forum přístupné jedině přes Yubikey. Reálně je to samozřejmě proto, že každý účet přidává do kasičky Yubico 12,50 USD…)
Zhodnocení
Celkově vzato se mi Yubikey dost líbí. S jeho omezeními se dokážu vypořádat a vlastnosti docela dobře využiji (protože často cestuji a z cizích počítačů potřebuji přistupovat ke svému FTP nebo VNC). Do budoucna se pak těším na nějakou budoucí verzi, která místo AES použije některou ze silných asymetrických šifer a tím odstraní slabé místo v podobě serveru. Do budoucna počítám s tím, že na Yubico přehodím všechny služby běžící na mém serveru. O implementace se zde samozřejmě podělím a naopak přivítám implementace vaše.
Dobrou podporu poskytuje primo cesky distributor http://www.yubikeys.cz .
Díky za informace, snažil jsem se vygooglit neco v cestine – aspon neco informovaneho jsem nasel 🙂