Yubikey Standard
Yubikey je token generující one-time-pad (OTP). Yubikey tokeny jsou navrženy tak, aby byly uživatelsky co nejpříjemnější. Ve výchozím módu nejsou potřeba ovladače, na klientské straně fungují jako USB HID klávesnice, tudíže není nutné řešit platformní kompatibilita. OTP kód se jednoduše vypíše stisknutím tlačítka na tokenu a operačnímu systému se to jeví, jako by byl zadán ze skutečné klávesnice.
Velká většina software k Yubikey je open source s dobrou dokumentací. Je to znát v porovnání s bizarními chybami, vyskytujícími se u proprietárních smartkaret. Předpřipravené balíčky můžeme docela často nalézt v různých linuxových distribucích. Např. podpora v Debianu wheezy je docela bohatá:
libapache2-mod-authn-yubikey - Yubikey authentication provider for Apache libauth-yubikey-decrypter-perl - yubikey token output decryptor libauth-yubikey-webclient-perl - Perl module to authenticate Yubikey against the Yubico Web API libyubikey-dev - Yubikey OTP library development files libyubikey0 - Yubikey OTP handling library runtime python-pyhsm - Python code for talking to a Yubico YubiHSM hardware yhsm-tools - Common files for YubiHSM applications yhsm-validation-server - Validation server using YubiHSM yhsm-yubikey-ksm - Yubikey Key Storage Module using YubiHSM python-yubico - Python code for talking to Yubico YubiKeys python-yubico-tools - Tools for Yubico YubiKeys libykclient-dev - Yubikey client library development files libykclient3 - Yubikey client library runtime libpam-yubico - two-factor password and YubiKey OTP PAM module libykpers-1-1 - Personalization tool for Yubikey OTP tokens libykpers-1-dev - Personalization tool for Yubikey OTP tokens yubikey-personalization - Personalization tool for Yubikey OTP tokens yubikey-personalization-gui - Graphical personalization tool for YubiKey tokens yubikey-server-c - Yubikey validation server yubiserver - Yubikey OTP and HOTP/OATH Validation Server
Dvoufaktorová autentizace
Typický příklad použití je dvoufaktorová autentizace – jako druhý faktor k heslu. Pokud nechcete z nějakého důvodu používat SSH klíč, ale zároveň se bránit proti jednoduchému odposlechu keyloggerem nebo útoku hrubou sílou, je Yubikey ideální. Návod k použití se SSH a PAM naleznete ve fóru.
PAM modul k Yubikey je verzatilní a díky konfigurovatelnosti PAM stacku ho lze použít třeba na sudo. Další výskyty jsme „v divočině“ viděli u fór Yubico a přihlášení na MtGox.
Yubikey funguje tak, že má uvnitř uložen neextrahovatelný AES klíč, který se využívá ke generování OTP. Algoritmus je popsán v manuálu k Yubikey, sekce 6. AES klíč je předpogramován z výroby a lze si ho přepsat vlastním AES klíčem. Ověřování OTP je vykonáváno na serveru, buď si lze spustit vlastní yubiradius server nebo použít oveřovací server od Yubico (pokud jste si nepřeprogramovali AES klíč).
Předpogramovaný AES klíč je pro osobní použití v pořádku, ale v principu by mohlo Yubico generovat stejný OTP řetězec. Pro vysokoprofilové služby se tedy hodí klíč přeprogramovat.
Zajímavou perličkou je způsob mapování binárního výstupu OTP na znaky klávesnice. Protože scankódy z klávesnice se mění na znaky až operačním systémem, některé znaky se kvůli rozložení qwerty/qwertz/azerty vynechávají (dost starý historický artefakt). Pro rozložení dvorak tím pádem token nebude v režimu HID klávesnice fungovat.
Personalizace a módy operace
Yubikey má dva „sloty“, což znamená, že je možné v tokenu mít dva klíče, respektive dvě konfigurace. Druhá konfigurace se aktivuje delším podržením tlačítka na tokenu.
Kromě defaultního OTP módu lze token nakonfigurovat na generování OATH-HOTP a HMAC-SHA1 challenge-response módu. HMAC-SHA1 se neaktivuje tlačítkem, ale zápisem „challenge“ do tokenu přes USB HID protokol, na který token odpoví.
Posledním módem je zápis statického hesla – při každém stisku tokenu se jednoduše zopakuje jakoby napsání hesla na klávesnici. Ze zřejmých důvodů není mód statického hesla příliš bezpečný.
Detaily a další konfigurační možnosti viz dokumentace. K Yubikey existuje kromě command-line konfiguračních utilit i přehledný klikací nástroj:
Yubikey Neo
Yubikey Neo má všechny vymoženosti předchůdce Yubikey Standard a navíc:
- bezkontaktní NFC Type 4 tag interface
- předinstalována OpenPGP aplikace (beta)
- je to javacard s možností doinstalace vlastních aplikací
Primárním účelem NFC interface je možnost použít OTP jako dvoufaktorovou autentizaci s mobilním NFC-podporujícím zařízením. Výmluvnější příklad než video na Yubico stránkách zobrazuje přihlašování k službě LastPass.
NDEF zpráva, generovaná tokenem, má tvar URL prefix + vygenerované OTP. URL prefix lze nakonfigurovat libovolně personalizačními utilitami. Sérii APDU na přečtení NDEF zprávy jsme si ukázali na začátku v sekci o APDU.
V případě Androidu bývá výchozí reakce na NDEF intent obsahující URL otevřít dané URL v prohlížeči (pokud vím, nevyžaduje se potvrzení).
Yubikey Neo umí kromě módu USB HID i CCID mód, tj. lze ho překonfigurovat, aby se choval jako smartkarta. V CCID módu je možné přistupovat k dalším aplikacím jako je předinstalované OpenPGPcard, instalovat javacard aplikace nebo přistupovat přímo k funkcem nakonfigurovaných na slotech (OTP, HMAC…).
Důležitá poznámka: APDU příkazy, které lze tokenu poslat přes USB CCID interface, mu lze stejně poslat i přes NFC interface.
OpenPGPcard aplikace
Rozběhání podle návodu je celkem rychlé, spočívá v povolení CCID interface a vygenerování PGP klíčů na kartě. Celkově se podle OpenPGPcard specifikace vygenerují 3 (pod)klíče – šifrovací, podpisovací a autentizační. Existující PGP/GPG klíče importovat nelze.
Aplikace je zatím v beta fázi, tokeny vyrobené před určitým datem mají bug, že nelze správně odblokovat PIN, pokud překročíte počet možných zadání nesprávného PINu. PIN je alfanumerický a může být celkem dlouhý – 127 znaků.
Opravit zmíněný bug lze nahráním nové verze OpenPGPcard aplikace, ale postup je netriviální. K OpenPGPcard aplikaci existují zdrojáky, jako k většině Yubico software. Je tedy teoreticky možné si aplikaci upravit tak, aby bylo možné importovat existující klíče.
GnuPG má mimochodem zvláštní vlastnost, gpg-agent –enable-ssh-support dokáže emulovat SSH agenta a mělo by tak jít použít token na přihlašování k SSH.
OpenPGP interface funguje také přes NFC, dokonce lze přes NFC i generovat klíče. Trochu „magická“ je možná skutečnost, že na to dostane přes NFC dost energie. Ovšem prakticky používat OpenPGP via NFC není nejlepší nápad – i když klíče neopustí token, zadaný PIN v APDU letí vzduchem nešifrovaně.
GlobalPlatform „balíčkovač“
GlobalPlatform je další smartcard specifikace rozsahu větší bichle. Její užitečnost spočívá ve standardizaci způsobu instalace a manipulace s aplikacemi na javacard smartkartách.
Přes GlobalPlatform jsme v předchozí sekci nahráli opravenou verzi OpenPGPcard aplikace. Podobně lze kupříkladu odinstalovat NFC NDEF aplikaci nebo přidat úplně vlastní aplikaci. Pro ostré používání se hodí možnost přeprogramování zamknout (aby vám někdo přes NFC nevyměnil aplikace u tokenu v kapse).
Samotné OTP jádro (to, co bylo i v původním Yubikey standard), pokud vím, přeprogramovat nelze.
Přístup HMAC/OTP k funkcím tokenu přes APDU
Předinstalovaná aplikace s AID A0000005272001 slouží k „lowlevel“ přístupu k funkcím tokenu. Například, pokud se nastaví slot 2 na funkci HMAC-SHA1 a s klíčem 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f 40 41 42 43, můžeme zkusit testovací vektor pro HMAC-SHA posláním challenge „Sample #2“ (hexa 53 61 6D 70 6C 65 20 23 32):
% opensc-tool -s "00 A4 04 00 07 A0 00 00 05 27 20 01" -s "00 01 38 00 09 53 61 6D 70 6C 65 20 23 32" Using reader with a card: OMNIKEY CardMan 5x21 (OKCM0071311121109097785172570995) 00 01 Sending: 00 A4 04 00 07 A0 00 00 05 27 20 01 Received (SW1=0x90, SW2=0x00): 03 01 00 03 87 07 02 00 00 00 .......... Sending: 00 01 38 00 09 53 61 6D 70 6C 65 20 23 32 Received (SW1=0x90, SW2=0x00): 09 22 D3 40 5F AA 3D 19 4F 82 A4 58 30 73 7D 5C .".@_.=.O..X0s}\ C6 C7 5D 24 ..]$
První APDU s INS 0×A4 vybere aplikaci, druhé APDU s INS 0×01 už volá interní funkci tokenu. Výběr funkce se provede parametrem P1, zde 0×38 značí HMAC-SHA1 ze slotu 2, 0×30 by byl HMAC-SHA1 ze slotu 1. Tyto „magické konstanty“ pochází z hlavičkového souboru ykdef.h, kde se nacházejí i další funkce.
Tato část ještě není oficiálně zdokumentována, dokumentace se postupně ještě dopisuje.