Před dvěma lety jsem psal článek o schopnostech tehdy nového hardwarového tokenu Yubikey Neo. Yubico s vývojem nepřestalo a novinky na čerstvě doručeném Neo tokenu jsou příjemné.
První rozdíl je, že Neo je zamčen proti doinstalování dalších javacard appletů nebo modifikaci existujících. Pro běžného uživatele to není až taková změna, je to spíše pozitivní bezpečnostní vlastnost. Pro potencionálního vývojáře javacard appletů je už ale velmi těžké sehnat odemknutý Yubikey, musí to řešit rovnou s NXP Semiconductors, kteří jsou dodavateli samotného čipu.
Druhý a hlavní rozdíl jsou nové aplikace nainstalované na Yubikey: U2F (Universal 2-Factor) a PIV (Personal Identity Verification) applet.
Universal 2-Factor (U2F)
U2F je relativně nový standard uskupení FIDO, který má pravděpodobně nejlepší šanci stát se nejrozšířenějším standardem na hardwarovou dvoufaktorovou autentizaci. Před ním jsou už jen mobilní aplikace typu Google Authenticator, které ale ukládají klíč do obyčejného filesystému – malware ho může zkopírovat.
Z uživatelského pohledu Neo U2F funguje tak, že zadáte heslo, vložíte Neo do USB slotu a zmáčknete tlačítko (kapacitní senzor) až vás aplikace vyzve. Důležitá vlastnost je, že fyzický dotek malware vyvolat nemůže.
Neo U2F autentizace je realizována eliptickou křivkou secp256r1 (neboli NIST-P256). Standard U2F specifikuje ještě vícero možností, takovou perličkou je biometrické U2F zařízení.
Z největších hráčů nabízí zatím možnost použít U2F pro autentizaci Google a Github, vyčerpávající seznam je potom zde. Samozřejmě můžete použít U2F ve vlastních aplikacích, webových i newebových – Yubico nabízí knihovny a klienty na Githubu. Dočasná nevýhoda je, že nativně U2F podporuje Chrome od verze 41, Firefox jen s doplňkem, i když U2F se už dostalo do Firefoxu Nightly.
Neo U2F interně komunikuje přes USB hidraw protokol, který je sice jednoduchý, ale z hlediska browserů dost nestandardní. To je zároveň důvod, proč implementace v browseru vyžaduje nativní kód. Přes NFC by U2F mělo být možné používat také na telefonu s NFC čtečkou, ale neměl jsem to možnost vyzkoušet.
Autentizace s Neo U2F funguje téměř „out-of-the-box“, jediný extra krok je instalace udev pravidel, aby běžný uživatel systému mohl přistupovat k tokenu přes hidraw protokol.
Trochu škoda je, že U2F nespecifikuje šifrování, ale jen autentizaci, takže například nepůjde použít na šifrování celého disku (třeba s LUKS).
Personal Identity Verification (PIV)
PIV standard má už 10 let, jeho autorem je NIST. Vzhledem k jeho stáří nepřekvapí, že jeho použití je spojeno s PKCS#11 interfacem. Má to tu výhodu, že aplikace podporující PKCS#11 podporují také PIV applet – třeba SSH nebo Firefox. Na druhou stranu má některá historická omezení.
PIV applet umí uložit čtyři klíče, podporuje algoritmy RSA-2048 a eliptickou křivku secp256r1. Klíče lze použít na autentizaci, podepisování nebo šifrování. Z praktických důvodů je asi RSA užitečnější, protože ho bude podporovat více serverových protistran. V následovném výpisu je jeden slot ze čtyř obsazen klíčem:
Slot 9a: Algorithm: RSA2048 Subject DN: CN=SSH key Issuer DN: CN=SSH key Fingerprint: d113880b642fded57193a0e3dd29790bd19df0cff9c611ab9af52ca4408df252 Not Before: Nov 15 13:21:44 2015 GMT Not After: Nov 14 13:21:44 2016 GMT Slot 9c: No data available. Slot 9d: No data available. Slot 9e: No data available. PIN tries left: 8
Sloty mají přiřazený význam:
- 9a – PIV autentizace
- 9c – digitální podpis (vždy se kontroluje PIN)
- 9d – správa klíčů
- 9e – autentizace kartou (PIN se nikdy nekontroluje)
Díky podpoře standardu PIV lze přes PKCS#11 použít knihovnu OpenSC k autentizaci přes SSH. Zkoušel jsem také použití PIV appletu ve Firefoxu pro autentizaci klientským TLS certifikátem.
Výhoda použití PIV appletu pro SSH oproti použití OpenPGP appletu pro SSH je ta, že nemusíte nahrazovat ssh-agent gpg-agentem. Program gpg-agent sice funguje ve většině případů jako náhrada správně, ale má několik bugů – když ještě používáte klasické klíče ze souboru spolu s ssh-add, tak ten klíč ze souboru nelze z agenta odebrat.
Z historických omezení je patrné jedno – délka PIN a PUK je 4-8 ASCII znaků (přesněji bajtů). Vzhledem k omezení počtu pokusů na PIN a PUK nejdou všechny možnosti vyzkoušet hrubou silou. Stejně z toho má ale člověk takový divný pocit.
Druhý historický artefakt je spíše kosmetický – k SSH klíči si musíte vygenerovat certifikát, i když SSH potřebuje jen ten klíč a už ne certifikát. Ten ale jednou při inicializaci PIV klíče vygenerujete a pak se o to už nemusíte starat. Proto ve výpisu nahoře se uvádí not before a not after, i když to SSH vůbec nekontroluje.
Kromě PIN a PUK má PIV applet ještě třetí management key, ten je něčím jako hlavním klíčem, vždy je to 3DES klíč. Pokud se vyčerpají pokusy na PIN, lze jej odblokovat přes PUK. Pokud se vyčerpají pokusy na PUK, musí se PIV applet úplně resetovat, nebo použít právě management key na znovunastavení PIN a PUK. Je možné použít PIV applet i v módu, kde se používá jenom PIN, pokud vám to vyhovuje více. Na první pohled je to trocha komplikované, ale je to spíše otázka zvyku.
Asi největší námahu představuje nastavení. Naštěstí Yubico se s nástroji dost snaží a tak je k dispozici jak grafický yubikey-piv-manager, tak yubico-piv-tool pro příkazovou řádku.