USB Tokeny a jak je použít

Většina dnes běžně používaných asymetrických šifrovacích algoritmů stojí na principu veřejného a privátního klíče. A je jedno, zda jde o podepisování e-mailů, autorizaci do VPN či cokoliv jiného - pokud se někdo zmocní privátního klíče, je obvykle zaděláno na velký problém. Vzhledem k tomu, že privátní klíč se obvykle válí jako soubor na disku, je riziko ukradení poměrně velké. Nešlo by to udělat nějak lépe?

Jedním z řešeních tohoto problému jsou karty smartcard nebo hardwarové tokeny (ve své podstatě to funguje stejně, jen na karty je potřeba čtečka, zatímco token se strká rovnou do USB portu). Do tokenu se uloží daný privátní klíč tak, že z ho z něj již nejde dostat žádnou cestou ven (případně lze klíč vygenerovat přímo v tokenu). Samotné podepisování/šifrování dat se provádí tak, že se pomocí daného algoritmu aplikuje privátní klíč na šifrovaná/podepisovaná data a výsledek se následně pošle. My ovšem už klíč nemáme - je v tokenu a nejde dostat ven, takže co dál? Aplikace, která se snaží daná data podepsat nebo zašifrovat, je nyní jenom nacpe do tokenu. Token provede samotnou kryptografickou operaci a zpět předá zašifrovaná/podepsaná data. Tím se dosáhlo toho, že pro ukradení vlastního privátního klíče je třeba fyzicky ukrást daný token (který navíc obvykle bývá chráněn pinem, který se po x neúspěšných pokusech zablokuje). Jisté omezení spočívá v tom, že algoritmy, které lze nyní použít, musí umět token (to co umí používaná aplikace je teď poměrně jedno). Obvykle bývá standardem podpora RSA s 1024b nebo 2048b klíčem, což na většinu věcí postačuje.

OpenSC

Po tom, co máme funkční smartkartu vloženou v počítači nebo token s funkčním ovladačem (pro Linux lze jako ovladač k některým zařízením použít software OpenCT), je třeba na ni vytvořit nějakou datovou strukturu. O to se stará tzv. middleware - ten tedy sebou nese sadu nástrojů, jak na zařízení uložit klíč atd. Také se s ním obvykle instalují nějaké knihovny zpřístupňující zařízení ostatním aplikacím. Nás zajímá především PKCS#11 API, které podporují například aplikace z rodiny Mozilla. Samotné aplikaci se následně předhodí tato API knihovna, čímž aplikace dosáhne schopností povídat si s tokenem.

OpenSC je tedy middlewarem, implementujícím PKCS#11 API a kompatibilním se spoustou zařízení. Stáhnout ho lze z webových stránek, případně na Linuxu bývá obvykle v repozitářích distribucí. OpenSC vytváří strukturu podle standardu PKCS#15. Ve zkratce na tokenu je vytvořen PIN (který by se měl vázat na danou osobu) a pod daný PIN se dále umisťují klíče, případně i s certifikátem.

Inicializace a vytváření objektů na tokenu

Při prvním použití nového tokenu (nebo recyklaci starého) je ho potřeba napřed smazat a inicializovat. Pro smazání tokenu stačí použít příkaz pkcs15-init -E a pro následnou inicializaci příkaz pkcs15-init -C. Během inicializace, pokud to zařízení umí, budete dotázání na SO PIN a v případě, že jej specifikujete, tak i na SO PUK. SO PIN je PIN sloužící k ochraně zařízení - je potřeba jej zadat vždy, když se mění data na tokenu. PUK slouží pro případ, že PIN byl zablokován neúspěšnými pokusy o zadání.

Nyní je potřeba vytvořit nějaký uživatelský PIN, kterým budou chráněny klíče. Zadáním pkcs15-init -P --label popis -a 01 budete dotázáni na uživatelský PIN, PUK a případně na SO PIN, pokud byl zadán. Parametr -a slouží jako číselné ID daného PINu (bude dále potřeba při vytváření klíčů). Pokud bude PINů na tokenu více, je potřeba zvolit pokaždé jiné číslo. Label slouží jenom jako popisek daného PINu (zobrazí se ve výpisu objektů).

Generování klíče

Jedním ze způsobů, jak dostat pár klíčů do tokenu, je přímo je v něm vygenerovat. Tento způsob je celkem bezpečný - máte jistotu, že daný klíč existuje jenom v tokenu a nikde jinde. Generování klíče začne příkazem pkcs15-init -G typ -a 01. Typ klíče se zapisuje jako algoritmus/délka a je závislý na tom, co daný token podporuje. Například pokud zvládá RSA klíče délky 2048b, vypadal by parametr jako rsa/2048. Za parametr -a je potřeba vyplnit číselné ID PINu, pod který klíč spadá. Také lze použít popisný parametr label. Při generování klíče budete dotázáni na PIN uživatele, kterému klíč patří (ten co je již vytvořen) a případně na SO PIN.

Import certifikátu

V elektronickém podpisu v emailu se běžně používají X509 certifikáty (a i na spoustu dalších věcí). Certifikát je obvykle veřejný klíč obalený doplňujícími údaji (jméno, email, atd.) a podepsaný nějakou důvěryhodnou třetí stranou, která se zavazuje, že dané údaje jsou pravdivé. Pro vydávání certifikátu se používá tzv. žádost. Je to víceméně už certifikát, kterému chybí podpis 3. strany. Žádost tedy jednak prokazuje, že vlastníte daný privátní klíč a už obsahuje údaje, které sebou ponese certifikát. Taková žádost se následně předá certifikační autoritě, jí se prokážete (třeba občankou), ona žádost podepíše a certifikát je na světě. Jako první krok je tedy napřed nutné žádost vytvořit.

K tomu poslouží nástoj OpenSSL. Začneme tím, že pouhým příkazem openssl spustíme interaktivní režim. Vygenerování žádosti pak vypadá nějak takto:

OpenSSL> engine dynamic -pre SO_PATH:/usr/lib/engines/engine_pkcs11.so -pre ID:pkcs11 -pre LIST_ADD:1 -pre LOAD -pre MODULE_PATH:/usr/lib/opensc/opensc-pkcs11.so
(dynamic) Dynamic engine loading support
[Success]: SO_PATH:/usr/lib/engines/engine_pkcs11.so
[Success]: ID:pkcs11
[Success]: LIST_ADD:1
[Success]: LOAD
[Success]: MODULE_PATH:/usr/lib/opensc/opensc-pkcs11.so
Loaded: (pkcs11) pkcs11 engine
OpenSSL> req -engine pkcs11 -new -key id_45 -keyform engine -out zadost.csr

První příkaz naloaduje modul OpenSC, aby se OpenSSL mohlo s tokenem bavit. Pokud výpis končí hláškami Success, je vše v pořádku. Cesty ke knihovnám můžou být v různých distribucích jiné (tenhle příklad byl zkoušen na Ubuntu). Druhý příkaz pak již jen řiká, že se má vygenerovat žádost pomocí klíče s ID 45 na tokenu. ID 45 je defaultní, může být jiné - je vidět ve výpisu objektů na tokenu (viz dále). Po tomto kroku je uživatel dotázán na svůj PIN k tokenu a následně se spustí klasický průvodce OpenSSL pro zadání parametrů certifikátu. Výstupem pak bude soubor zadost.csr, což je hotová žádost pro předání certifikační autoritě.

Poté, co již vlastníme náš certifikát, můžeme jej uložit do tokenu. Lze toho docílit příkazem pkcs15-init -X certifikát -a 01 -i 45. Za parametrem -X následuje cesta k souboru s certifikátem ve formátu PEM, -a ukazuje na uživatele, -i je ID klíče, kterému certifikát patří.

Výpis obsahu tokenu

Pokud vás zajímá, co na tokenu je vše uložené, můžete spustit příkaz pkcs15-tool -D. Následně se do terminálu vypíše obsah celého tokenu. Měl by být viděny uživatelské PINy, privátní a veřejné klíče (zvlášť) a uložené certifikáty k daným klíčům. U objektů jsou také vidět různé parametry - jako jejich ID nebo třeba přístupová práva (zde je například vidět, že veřejný klíč z tokenu vyexportovat lze, privátní nikoliv).

Vypnutí blokování zařízení

OpenSC ve výchozím nastavení má jednu bezpečnostní vlastnost - povoluje přístup k tokenu/kartě pouze jedné aplikaci a tedy zařízení blokuje do doby, dokud jej aplikace neuvolní. To může být příčina několika nepříjemných situací. Například mějme na tokenu dva certifikáty - jeden slouží pro přihlašování do webových aplikací (například do internetového bankovnictví) a druhý pro náš elektronický podpis. Pro použití tedy token musí používat jednak náš internetový prohlížeč a jednak náš e-mailový klient. Nicméně přistupovat na token může jen jedna aplikace, takže pokud se z prohlížeče příhlásíme na web požadující certifikát, nemůžeme už podepsat e-mail (tedy alespoň do doby, než prohlížeč zavřeme nebo ho donutíme "odhlásit" se z tokenu).

Jak jsem zmínil, je to pouze výchozí nastavení OpenSC, které se dá změnit. Nicméně než řeknu jak, rád bych podotknul, že toto nastavení má jeden dobrý bezpečnostní důvod. Pokud se blokování přístupu vypne, může k tokenu přistupovat kdokoliv s uživatelským účtem na počítači, kam je token fyzicky připojen. Tedy alespoň kdokoliv, kdo má uživatele členem skupiny scard nebo právo roota. V zásadě pokud je možné, že daný počítač používá i někdo jiný než vy (i s možností, že se do něj někdo vlámal), může token použít, aniž byste o tom věděli (se zapnutým blokováním na to přijdete rychle - daná aplikace token neuvidí, ač by měla). Pro nějaké podepsání/zašifrování dat je stále nutné zadat PIN, takže ani tak útočník nemůže svévolně si vaším klíčem něco podepsat. Nicméně počet možných pokusů na zadání PINu je omezený (na zmíněných iKey 3000 jsou to zrovna 3 pokusy) a po jejich vyčerpání se token zablokuje. Útočník má tedy přinejmenším dobrou šanci vás o přístup na token připravit.

Pokud svému počítači i tak dále věříte, zde je postup, jak blokování vypnout. V souboru /etc/opensc/opensc.conf najděte řádek lock_login = false - s nejvyšší pravděpodobností bude zakomentovaný (bude před ním znak #). Výchozí hodnota je totiž true. Řádek tedy odkomentujte (odstraňte #) a zavřete všechny aplikace, které PKCS#11 knihovnu používají, aby změny vešly v platnost.

Alternativní middlewary

Ačkoliv OpenSC je kvalitní software, který je navíc opensource a nachází se v repozitářích běžných distribucí, podporuje jenom menší část zařízení, které jsou na trhu. Samotný fakt, že některá karta/token není podporována v OpenSC ještě neznamená, že ji nelze v Linuxu použít. Spousta výrobců dodává svůj oficiální middleware i pro Linux (byť to jsou často takové zbastlené rovnáky na ohýbáky, tak to alespoň funguje). Jako příklad jsou například tokeny Aladdin eToken PRO (starší verze fungují i s OpenSC, ale novější model 72k Java bohužel už ne).

Ovšem i tyto binární, oficiální middlewary poskytují PKCS#11 API přes dodávanou knihovnu (v návodu bude napsáno, která to je). Z hlediska konfigurace aplikací to vyjde úplně nastejno (jen se místo opensc-pkcs11.so zadá jiná knihovna). Trochu odlišně se zachází s inicializací a importem objektů do tokenu - k tomu obvykle s middlewarem je další aplikace. Nicméně i zde má smysl balík opensc nainstalovat, stále může poskytnout následující:

  • nástroj pkcs11-tool - tedy nástroj pro manipulaci s tokenem přes standarní PKCS#11 API. Přes parametr se mu předá daná knihovna (která nemusí být OpenSC) a umožňuje dělat některé zajímavé věci - například vypisovat obsah tokenu, měnit jej, změnit PIN a další (prakticky tím z většiny půjde nahradit i originální nástroj pro správu)
  • PKCS#11 PAM modul - součástí OpenSC je i PAM modul, který umožní přihlášení k danému počítači - buď pomocí X509 certifikátu nebo RSA klíčem (v počítači je uložen povolený certifikát (nebo veřejný klíč) a během přihlašování se pak prokazuje vlastnictví privátního klíče, který je v tokenu).

Nastavení aplikací

Nastavení samotných aplikací nebývá složité - stačí jim předhodit vhodnou PKCS#11 knihovnu. V rychlosti bych chtěl ukázat ještě postup pro produkty od Mozilly, kde se patrně těchto funkcí využije nejčastěji.

Mozilla Firefox/Thunderbird

Postup je následující:

  1. Otevřete si nastavení (dialogy jsou pro Firefox i Thunderbird stejné, návod se shoduje)
  2. Přejděte na kartu rozšířené, záložku šifrování a stiskněte tlačítko bezpečnostní zařízení
  3. V dialogu co se objeví, stiskněte vpravo tlačítko načíst
  4. Do jména modulu napište například OpenSC a do názvu souboru modulu pak cestu k PKCS#11 knihovně - pro OpenSC instalované z balíku to nejčastěji bude /usr/lib/opensc-pkcs11.so
  5. Po potvrzení se v levém seznamu objeví nově načtený modul, pokud máte navíc token nyní vložen, měl by být viděn jako podpoložka (je to vidět na předchozích screenshotech)
  6. Co se týče Firefoxu, pokud nyní vejdete na stránku vyžadující autorizaci certifikátem, vyskočí dialogové okno žádající o PIN k tokenu. Po jeho zadání budete dotázáni na výběr dostupného certifikátu na tokenu a dále již autorizace proběhne sama. U thunderbirdu je to podobné - zapnete podepisování/šifrování S/MIME a při jeho použití budete dotázáni na PIN k tokenu (navíc CN uloženého certifikátu by se mělo shodovat s použitou e-mailovou adresou).