Linux E X P R E S

Facebook

Tokeny Yubikey

Yubikey100.png

Snad každý správce linuxového serveru používá pro vzdálený přístup SSH. Kromě přihlašování pomocí jména a hesla je možné přihlašovat se pomocí klíče, což je bezpečnější a doporučovaný způsob. Pokud chceme bezpečnost ještě zvýšit, můžeme pro přihlašování použít hardwarový token. Jedním z velmi oblíbených tokenů na našem trhu byl Yubikey NEO od firmy Yubico. Pro jeho konfiguraci jsem sepsal následující návod, který beze zbytku platí i pro token Yubikey 5, který je aktuálně v prodeji.


Hardwarový token Yubikey NEO nabízí několik funkcí, které lze použít pro lepší zabezpečení práce s počítačem. Je to funkce Smart Card (PIV kompatibilní), kterou budeme používat, dále generování jednorázového hesla, vypsání statického hesla, uložení OpenPGP klíče, FIDO U2F, atd. Tento token se zapojuje do USB-A nebo jej lze použít přes NFC.

Velkou výhodou tokenů od firmy Yubico je open source obslužný software, ať už utility pro nastavení tokenu, tak i např. moduly PAM pro použití tokenu při přihlašovaní. Dokumentace pro vývojáře je rovněž na vysoké úrovni.

Software pro správu tokenu

Pro zdárné nastavení tokenu z konzole budeme potřebovat software yubico-piv-tool, který se nachází v repozitáři většiny distribucí. V našem případě budeme instalovat yubico-piv-tool na Xubuntu 18.04. Zároveň nainstalujeme i knihovnu opensc-pkcs11 pro pro použití tokenu s SSH. To vše pomocí příkazu

apt install yubico-piv-tool opensc-pkcs11

Zda je token správně připojen zjistíme příkazem yubico-piv-tool -a status, který by měl vypsat něco podobného (v závislosti na verzi programu).

yubikey01.png

Pokud dostanete chybovou hlášku Failed to connect to reader zkontrolujte správné zapojení Yubikey do USB a případně také výstup z dmesg, kde musí být o připojení tokenu Yubikey zmínka.

yubikey02.png

PIN, PUK a reset tokenu

Pro použití tokenu k přihlášení přes SSH a k některým dalším úkonům při nastavování budete potřebovat PIN. Ten je ve výchozím stavu nastaven na 123456 a lze jej samozřejmě změnit (bude ukázáno dále). Než se pustíme do dalšího nastavení, ukážeme si, jak postupovat v případě zapomenutí PINu nebo PUKu.

Pokud dojde třikrát za sebou (lze nastavit) ke špatnému zadání PINu, PIN se zablokuje a nelze jej použít. Je to podobné, jako u SIM karty a stejně tak je podobné i řešení v případě zablokovaného PINu.

Pokud potřebujeme odblokovat PIN a nastavit nový, budeme potřebovat PUK. Ten je ve výchozím stavu nastaven na 12345678. Odblokování PINu a nastavení nového provedeme příkazem yubico-piv-tool -a unblock-pin, zadáním PUKu a dvakrát nového PINu, který musí být min. 6 znaků.

yubikey03.png

Pokud se stane, že zapomenete i PUK nebo ho zadáte třikrát špatně, tak žádná možnost obnovy neexistuje. V takovém případě musíme resetovat celý token, resp. jeho část (applet) mající na starost funkci Smart Card a klíč vygenerovat znovu. Z hlediska bezpečnosti je to rozumné řešení, neboť pokud dojde ke ztrátě tokenu, tak se případný nálezce k vašemu klíči nedostane a v případě resetu mu zůstane pouze prázdný (avšak stále použitelný) hardware.

Než přistoupíme k resetování tokenu, ať už z důvodu zapomenutí PUKu nebo jen uvedení do výchozího nastavení, musí být zablokován jak PIN, tak i PUK. Pokud tedy některý z kodů nemá vyčerpán max. počet pokusů o zadání, musíme je vyčerpat buď příkazem yubico-piv-tool -a verify-pin a následným stisknutím Enter (prázdný PIN) pro PIN nebo yubico-piv-tool -a unblock-pin kde stisknutím Enter zadáme prázdný PUK a pak dvakrát libovolný PIN pro vyčerpání PUK.

yubikey04.png

Když už jsme vyčerpali všechny možnosti pro zadání PIN i PUK, resetujeme token příkazem yubico-piv-tool -a reset. Tím uvedeme token do výchozího nastavení, tj. bez klíčů, certifikátů a s PIN nastaveným na 123456 a PUK na 12345678.

yubikey05.png

Změna PIN a PUK

Výchozí nastaveni PIN a PUK jsou snadná na zapamatovaní, ale dají se dohledat na stránkách výrobce a pokud by snad došlo ke ztrátě tokenu, jeho zneužití by nic nebránilo. Abychom tomu zabránili, změníme si nejen PIN, ale také PUK. Změnu PINu provedeme příkazem yubico-piv-tool -a change-pin, kde zadáme nejprve starý PIN a následně dvakrát nový. Jako PIN lze zadat 6‒8 znaků, které ovšem nemusí být pouze číslice, ale i malá nebo velká písmena anglické abecedy.

Lze použít i neinteraktivní variantu, ale s ohledem na ukládání historie příkazů ji nelze doporučit, protože původní i nový PIN jsou uvedeny jako parametry příkazu yubico-piv-tool.

yubikey06.png

Změna PUK se provede obdobně a to příkazem yubico-piv-tool -a change-puk. Parametry PUK jsou stejné jako u PINu. I zde je možná neinteraktivní varianta.

yubikey07.png

Management key a jeho změna

Pro autorizaci některých operací s tokenem (generování klíčů, import klíčů, ...) slouží tzv. management key. Jedná se o klíč (3DES), který je 24 bajtů dlouhý a používá se pro operace, které na první pohled nevyžadují autorizaci (PIN). Znalost management key neumožní zneužití tokenu jako v případě PINu, ale např. nepozorovanou změnu konfigurace už ano.

Výchozí hodnota managenent key je 010203040506070801020304050607080102030405060708 a stejně jako PIN je vhodné jej změnit. K tomu slouží příkaz yubico-piv-tool -a set-mgm-key --new-key=_nový klíč_ --key=010203040506070801020304050607080102030405060708, kde první klíč je nově nastavovaný a druhý klíč je starý management key.

Klíč lze nastavit i interaktivně, kdy vynecháme parametr --new-key. Výhodou je, že nový klíč nezůstane v historii příkazů.

yubikey08.png

Po nastavení nového management key, bude u většiny operací potřeba nový klíč zadat jako parametr programu yubico-piv-tool nebo interaktivně. Bez zadání klíče program yubico-piv-tool použije výchozí hodnotu nebo skončí s chybou komunikace.

yubikey09.png

Pokud management key zapomenete nebo ztratíte, jediný způsob obnovy je reset tokenu jako v případě zapomenutého PUK. Postup je stejný, tj. nejprve zablokovat PIN, následně zablokvat PUK a nakonec resetovat token i se ztrátou veškerých klíčů a nastavení.

SSH klíč v Yubikey NEO

Často doporučovaným způsobem přihlašování přes SSH je přihlašování pomocí klíče. Odpadne tím riziko, že si uživatel zvolí slabé heslo a protože klíč se generuje náhodně, jeho síla dalece překonává zapamatovatelná hesla. Nicméně stále zůstává riziko, že se útočníkovi podaří zkopírovat uživatelův privátní klíč, ať už např. skrz chybu v prohlížeči nebo jiným způsobem. Privátní klíč lze šifrovat, ale síla klíče je tím zmenšena na sílu hesla použitého k zašifrování. Nadto existuje riziko, že se útočníkovi podaří nainstalovat na počítač oběti keylogger a získat tak i heslo pro dešifrování privátního klíče.

Obranou proti výše uvedenému je uložení privátního a veřejného klíče na hardwarový token, který je konstruován tak, aby neumožnil získání soukromého klíče. Jeho použití je navíc vázáno na zadání PINu, takže ztráta tokenu neznamená jeho zneužití.

Sloty pro klíče

V tokenu Yubikey je možné uložit nikoliv jeden, ale čtyři páry klíčů. Každý slot je určen pro jiný případ použití. V našem případě to bude slot 9a, ve kterém jsou uloženy klíče pro Smart Card. Další sloty slouží k podepisování, k šifrování a k ověřování tokenu.

Vygenerování RSA klíče a uložení certifikátu do tokenu

Pro úspěšné vygenerování klíčů budeme potřebovat PIN k tokenu a management key. Pokud jste si ještě nic z toho nezměnili, tak PIN je 123456 a management key nemusíte řešit, neboť se automaticky použije výchozí. Pokud jste si management key změnili, je potřeba jej předat pomocí parametru --key=_klic_ nebo interaktivně, kdy uvedete pouze samotný přepínač --key a klíč vložíte např. ze schránky.

Nyní se pustíme do samotného vygenerování klíče. Při tom dojde nejen k vytvoření soukromého klíče, ale také klíče veřejného, bez kterého by nám soukromý klíč k ničemu nebyl. Veřejný klíč můžeme nechat vypsat na standardní výstup nebo do souboru. V našem případě použijeme druhou možnost.

Příkazem yubico-piv-tool -s 9a -a generate -o pub.pem vygenerujeme ve slotu 9a soukromý klíč a k němu příslušející veřejný klíč bude uložen do souboru pub.pem. PIN zatím zadávat nemusíme, neboť nám stačí pouze platný management key.

yubikey10.png

Nyní potřebujeme z veřejného klíče udělat certifikát, který následně naimportujeme do tokenu. V našem případě se bude jednat o self-signed certifikát, kde autoritou bude samotný token. Podepsaání provedeme příkazem yubico-piv-tool -s 9a -a verify-pin -a selfsign-certificate -S "/CN=SSH klic/" -i pub.pem -o cert.pem. Tentokrát už PIN zadat musíme. Jeho zadání je vynuceno přepínačem -a verify-pin, protože bez tohoto přepínače bysme sice PIN zadávat nemuseli, ale také by pokus o podepsání selhal. Přepínačem -S "/CN=SSH klic/" nastavíme informace, které budou uvedeny v certifikátu. Jedná se po povinnou položku, ale to co zadáme nemá žádný vliv na používání tokenu k přihlašování přes SSH. Zbývající přepínače určují zdrojový soubor (s veřejným klíčem) a soubor s výsledným certifikátem.

yubikey11.png

Kdo bych chtěl, může v nápovědě nalézt i přepínač pro nastavení doby platnosti certifikátu, ale ani tato položka nemá pro naše použití význam. Přes SSH se lze přihlásit i s prošlým certifikátem.

Posledním krokem je import podepsaného certifikátu do tokenu pomocí příkazu yubico-piv-tool -s 9a -a import-certificate -i cert.pem. Rovněž v tomto případě není nutné zadávat PIN. Význam jednotlivých přepínačů je zřejmý.

yubikey12.png

Nyní si ověříme, že máme v tokenu uložen správný certifikát. Příkaz yubico-piv-tool -a status nám vypíše jak použitý algoritmus klíče, tak i informace o klíči, jeho otisk a dobu platnosti.

yubikey13.png

Uvedený postup generování klíče a certifikátu lze nahradit vygenerování klíče a certifikátu mimo token a soukromý klíč a certifikát pouze importovat. Výhodou tohoto řešení je možnost vytvoření kopie tokenu, např. v případě ztráty. Díky tomu nemusíme aktualizovat důvěryhodné klíče na cílovém SSH serveru. Ovšem bezpečnost takového řešení je menší, než v případě generování klíčů na tokenu, protože soukromý klíč je uložen (byl vygenerován) mimo token.

Použití tokenu pro přihlášení přes SSH

Nyní se blížíme k samotnému použití tokenu pro přihlášení přes SSH. Něž se tak stane, musíme na server nahrát veřejný klíč, který je uložen na tokenu, aby jej server uznal pro přihlášení. Veřejný klíč ve správném formátu získáme příkazem ssh-keygen -D /usr/lib/x86_64-linux-gnu/opensc-pkcs11.so, který zobrazí veřejný klíč ve formátu, který můžeme nahrát na serveru do souboru authorized_keys.

yubikey14.png

Přepínač -D /usr/lib/x86_64-linux-gnu/opensc-pkcs11.so určuje cestu ke knihovně, pomocí které program komunikuje s tokenem. Uvedená cesta platí v distribuci Ubuntu 18.04 a na jiných distribucích může být odlišná. Pokud soubor opensc-pkcs11.so ve svém systému nemáte, zkontrolujte si, zda máte nainstalován balíček opensc-pkcs11 nebo podobný pro jiné distribuce, ve kterém se uvedený soubor nachází.

Nyní tedy máme výstup podobný následujícímu ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCgVarI9B4c4z2FJfm1pwOvxTnLaLDuGlTKyFmTrGLnSy6oDSL7iEWRu7Le9FDopmFzqQCOP+reEg6pw7sZRvAemH52Onj2yrg5DtsMztmBe5juDvB0RBcAYoVNteRRm0EFW/wx9zH1at7UBmBwRwTO7R0Kh1jPTndqJ3jzXLhC+yFB91ZRze2BXCrT3IezRkJXV4XInyGvq4fecqyzgMyUEMR9Gz6zbwSvKx/Zz9swKCedxJdL6e0EuT595toPqj75BqTSIDt702sHitnDrc5DdY6iGdk9WbVbqhOkMyThylAGWbyWTESHCh1lhsEMX0U6B95XtQ4Nu2f2FEnLrQf9. Přihlásíme se nyní na server, na který se budeme chtít přihlašovat tokenem, za použití jména a hesla a do souboru ~/.ssh/authorized_keys vložíme výše uvedený výstup.

Tím zajistíme, že při dalším přihlášení server rozpozná náš klíč jako validní pro daného uživatele. Pokud máte možnost fyzického přístupu k serveru nebo např. k webové konzoli u VPS, lze vložit klíč i bez přihlašování se jménem a heslem.

yubikey15.png

Nyní už máme vše potřebné a posledním krokem je přidání přepínače -I /usr/lib/x86_64-linux-gnu/opensc-pkcs11.so k programu ssh, čím zajistíme použití tokenu k oveření. Celý příkaz potom může být např. ssh user@server_example_com -I /usr/lib/x86_64-linux-gnu/opensc-pkcs11.so. Tímto příkazem se pokusíme přihlásit jako uživatel user na server server.example.com za použití tokenu. Po zadání správného PIN budete přihlášeni bez zadávání hesla.



Diskuze (0) Nahoru