Portál AbcLinuxu, 31. října 2024 23:50
Koupil jsem si Yubikey 4. Po popisu, jak ho zprovoznit na Linuxu, pokračujeme tím, co všechno Yubikey umí, co mě k jeho pořízení vedlo a kolik to stálo.
Předchozí kroky najdete v závěru minulého dílu a v dílu druhém.
Nakonec už zbývá jen nahrát klíč do Yubikey. Než se do toho pustíme, je potřeba opět umravnit GPG:
$ killall gpg-agent $ eval $(gpg-agent --daemon --enable-ssh-support > /tmp/gpg-agent.env); $ . /tmp/gpg-agent.env
Použijeme k tomu opět parametr „--edit-key“. Nezapomeňte použít gpg2, jinak to nebude fungovat:
$ gpg2 --edit-key 3F6F3D1B gpg (GnuPG) 2.0.22; Copyright (C) 2013 Free Software Foundation, Inc. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Tajný klíč je dostupný. pub 2048R/3F6F3D1B vytvořen: 2016-01-11 platnost skončí: nikdy použití: SC důvěra: absolutní platnost: absolutní sub 2048R/EF4ADF82 vytvořen: 2016-01-11 platnost skončí: nikdy použití: E sub 2048R/8F8041DC vytvořen: 2016-01-11 platnost skončí: nikdy použití: A [ absolutní ] (1). Bystroushaak <bystrousak@kitakitsune.org> gpg>
Přehled můžeme zkrátit pomocí příkazu „toggle“:
gpg> toggle sec 2048R/3F6F3D1B vytvořen: 2016-01-11 platnost skončí: nikdy ssb 2048R/EF4ADF82 vytvořen: 2016-01-11 platnost skončí: nikdy ssb 2048R/8F8041DC vytvořen: 2016-01-11 platnost skončí: nikdy (1) Bystroushaak <bystrousak@kitakitsune.org>
Klíč poté nahrajeme do Yubikey příkazem „keytocard“:
gpg> keytocard Opravdu přesunout primární klíč? (a/N) a Signature key ....: [none] Encryption key....: [none] Authentication key: [none] Prosím vyberte místo pro uchování klíče: (1) Podepisovací klíč (3) Autentizační klíč Váš výběr?
Program se nás zeptá, zda klíč chceme používat pro podepisování, či autentizaci. Chceme podepisování, proto vybereme 1:
Váš výběr? 1 Musíte znát heslo, abyste odemkl(a) tajný klíč pro uživatele: „Bystroushaak <bystrousak@kitakitsune.org>“ délka 2048 bitů, typ RSA, klíč 3F6F3D1B, vytvořený 2016-01-11
GPG nyní bude chtít dvě hesla:
Poté již klíč nahraje do karty.
sec 2048R/3F6F3D1B vytvořen: 2016-01-11 platnost skončí: nikdy číslo karty: 0006 04131447 ssb 2048R/EF4ADF82 vytvořen: 2016-01-11 platnost skončí: nikdy ssb 2048R/8F8041DC vytvořen: 2016-01-11 platnost skončí: nikdy (1) Bystroushaak <bystrousak@kitakitsune.org> gpg>
To samé pak chceme zopakovat s podklíčem používaným pro šifrování, který vybereme příkazem „key 1“:
gpg> key 1 sec 2048R/3F6F3D1B vytvořen: 2016-01-11 platnost skončí: nikdy číslo karty: 0006 04131447 ssb* 2048R/EF4ADF82 vytvořen: 2016-01-11 platnost skončí: nikdy ssb 2048R/8F8041DC vytvořen: 2016-01-11 platnost skončí: nikdy (1) Bystroushaak <bystrousak@kitakitsune.org> gpg> keytocard Signature key ....: 9F87 EECF CDAA 263C AC00 A5A0 3F92 841C 3F6F 3D1B Encryption key....: [none] Authentication key: [none] Prosím vyberte místo pro uchování klíče: (2) Šifrovací klíč Váš výběr? 2 Musíte znát heslo, abyste odemkl(a) tajný klíč pro uživatele: „Bystroushaak <bystrousak@kitakitsune.org>“ délka 2048 bitů, typ RSA, klíč EF4ADF82, vytvořený 2016-01-11 sec 2048R/3F6F3D1B vytvořen: 2016-01-11 platnost skončí: nikdy číslo karty: 0006 04131447 ssb* 2048R/EF4ADF82 vytvořen: 2016-01-11 platnost skončí: nikdy číslo karty: 0006 04131447 ssb 2048R/8F8041DC vytvořen: 2016-01-11 platnost skončí: nikdy (1) Bystroushaak <bystrousak@kitakitsune.org> gpg>
A pak ještě jednou pro třetí klíč s příkazem „key 2“ (počítáno od nuly):
gpg> key 2 sec 2048R/3F6F3D1B vytvořen: 2016-01-11 platnost skončí: nikdy číslo karty: 0006 04131447 ssb 2048R/EF4ADF82 vytvořen: 2016-01-11 platnost skončí: nikdy číslo karty: 0006 04131447 ssb 2048R/8F8041DC vytvořen: 2016-01-11 platnost skončí: nikdy (1) Bystroushaak <bystrousak@kitakitsune.org> gpg> keytocard Opravdu přesunout primární klíč? (a/N) a Signature key ....: 9F87 EECF CDAA 263C AC00 A5A0 3F92 841C 3F6F 3D1B Encryption key....: DA79 B9A1 F403 2515 D167 12DC 64D4 BDA4 EF4A DF82 Authentication key: [none] Prosím vyberte místo pro uchování klíče: (1) Podepisovací klíč (3) Autentizační klíč Váš výběr?
První klíč byl Podepisovací, druhý Šifrovací. Teď nám zbývá už jen Autentizační, proto vybereme „3“:
Váš výběr? 3 Musíte znát heslo, abyste odemkl(a) tajný klíč pro uživatele: „Bystroushaak <bystrousak@kitakitsune.org>“ délka 2048 bitů, typ RSA, klíč 8F8041DC, vytvořený 2016-01-11 sec 2048R/3F6F3D1B vytvořen: 2016-01-11 platnost skončí: nikdy číslo karty: 0006 04131447 ssb 2048R/EF4ADF82 vytvořen: 2016-01-11 platnost skončí: nikdy číslo karty: 0006 04131447 ssb* 2048R/8F8041DC vytvořen: 2016-01-11 platnost skončí: nikdy číslo karty: 0006 04131447 (1) Bystroushaak <bystrousak@kitakitsune.org> gpg>
GPG poté ukončíme příkazem „quit“ s uložením změn:
gpg> quit Uložit změny? (a/N) a
Nově už v klíčence GPG v počítači nejsou uloženy privátní klíče, pouze ukazatele na kartu. To ovšem nestačí, protože v základní módu požaduje Yubikey pouze PIN, nikoliv ověření dotykem.
Nyní to chce přesvědčit Yubikey, aby vyžadoval dotek na ploše před uvolněním klíče. K tomu slouží skript na adrese https://gist.github.com/a-dma/797e4fa2ac4b5c9024cc (webarchive) (to jsem si nevymyslel, je to z oficiální dokumentace (webarchive) :(). Stáhnout se dá kliknutím na tlačítko RAW vpravo v rohu.
Postupně je možné zapnout PIN pro…
$ bash yubitouch.sh dec on 12345678 All done!
$ bash yubitouch.sh aut on 12345678 All done!
$ bash yubitouch.sh sig on 12345678 All done!
PIN zde zadáváte jako potvrzení, ne k nastavení jeho hodnoty. Skript má docela problém s nenumerickými administrátorskými hesly (tzn. použijte jen čísla), proto doporučuji tento krok před posledním, což je…
Ke změně PIN použijeme příkaz „gpg2 --card-edit“. Pokud vám nebude chtít navázat komunikaci opět proveďte „. /tmp/gpg-agent.env“ (tečka je na začátku schválně).
$ gpg2 --card-edit Application ID ...: D2760001240102010006041314470000 Version ..........: 2.1 Manufacturer .....: unknown Serial number ....: 04131447 Name of cardholder: [není nastaven] Language prefs ...: [není nastaven] Sex ..............: neuvedeno URL of public key : [není nastaven] Login data .......: [není nastaven] Signature PIN ....: není vyžadováno Key attributes ...: 2048R 2048R 2048R Max. PIN lengths .: 127 127 127 PIN retry counter : 3 0 3 Signature counter : 0 Signature key ....: 9F87 EECF CDAA 263C AC00 A5A0 3F92 841C 3F6F 3D1B created ....: 2016-01-11 10:04:02 Encryption key....: DA79 B9A1 F403 2515 D167 12DC 64D4 BDA4 EF4A DF82 created ....: 2016-01-11 10:04:02 Authentication key: 13D3 290C 3FFE EC20 ED3B 4AD2 72A8 96C0 8F80 41DC created ....: 2016-01-11 10:11:32 General key info..: pub 2048R/3F6F3D1B 2016-01-11 Bystroushaak <bystrousak@kitakitsune.org> sec> 2048R/3F6F3D1B vytvořen: 2016-01-11 platnost skončí: nikdy číslo karty: 0006 04131447 ssb> 2048R/EF4ADF82 vytvořen: 2016-01-11 platnost skončí: nikdy číslo karty: 0006 04131447 ssb> 2048R/8F8041DC vytvořen: 2016-01-11 platnost skončí: nikdy číslo karty: 0006 04131447 gpg/karta>
V GPG shellu se do správné konfigurace dostaneme sekvencí příkazů „admin“ a „passwd“:
gpg/karta> admin administrátorské příkazy jsou povoleny gpg/karta> passwd gpg: Nalezena OpenPGP karta číslo D2760001240102010006041314470000 1 - change PIN 2 - unblock PIN 3 - change Admin PIN 4 - set the Reset Code Q - quit Váš výběr?
Zde je možné jednoduše změnit jak PIN (menu „1“), tak Admin PIN (menu „3“). GPG zde slovo PIN používá poněkud zavádějícím způsobem, protože se rozhodně nejedná o číselné sekvence, ale můžete s klidem v duši použít poměrně komplikovaná a dlouhá hesla.
Váš výběr? 1 PIN changed. 1 - change PIN 2 - unblock PIN 3 - change Admin PIN 4 - set the Reset Code Q - quit Váš výběr? 3 PIN changed. 1 - change PIN 2 - unblock PIN 3 - change Admin PIN 4 - set the Reset Code Q - quit Váš výběr? q gpg/karta> quit
Zbývá ještě ověřit, jestli vše funguje, jak má. Zkusíme třeba něco podepsat. Vytvoříme testovací soubor obsahující jen řetězec „test“:
$ echo test > test.txt
Tento soubor podepíšeme:
$ gpg --clearsign test.txt
GPG se přitom zasekne a Yubikey by měl začít problikávat, čímž indikuje, že očekává dotek. Jakmile se ho dotkneme, je vytvořen soubor „test.txt.asc“ s následujícím obsahem:
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 test -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQEcBAEBAgAGBQJWk5ElAAoJED+ShBw/bz0b6Z0IALz/6H2pge00EuvWsy/3TjG/ dubGRJjJGstyi1G/AdkumHoqp11ON89PgVGuL6d4B2losFtlhlu4lO8NBMWfGdPv w4uD2BckvRxsIclJxUiIkPgTuXirIjr0EdHZIHFy2KlcGNKKhD9CXkxYNgwPUhEJ H/i9getLo3G2evtZ6aG1tsCMar4tA/ETaehQwIZ6Hge48nzC3t1DW+S2krQ9WrIE jkXUw+gQFgim3iTccIBab5gnXqISVcZA30rigKauN+yKs069r6hwodMIaMK7bby1 Ihh8NHcub+oP+tqiFliccpuvJ9AupoOtObdJ5fpaFcw2zcxkEXhVP6BmKC9E9IA= =kDpk -----END PGP SIGNATURE-----
Několikrát jsme byli nuceni použít hack GPG, který sestřelil běžící proces gpg-agent a nastavil pár proměnných.
Nejjednodušší způsob, jak zabránit opakování před každým použitím Yubikey, pochází z blogu Derka Kozla (webarchive) a spočívá v přidání následujících řádek do „.bashrc“:
if [ ! -f /tmp/.gpg-agent.env ]; then killall gpg-agent; eval $(gpg-agent --daemon --enable-ssh-support > /tmp/.gpg-agent.env); fi . /tmp/.gpg-agent.env
Co dělat, pokud přijdete k jinému počítači a chcete Yubikey používat i tam?
Většinou je nutné nainstalovat všechny závislosti, udev pravidlo a resetovat GPG agent, jak už bylo ukázáno na začátku této kapitoly. Časem možná budou distribuce doplněny natolik, že to již nutné nebude.
K tomu, aby Yubikey začal s GPG fungovat, stačí už jen importovat předtím exportovaný veřejný klíč:
$ gpg2 --import < yubikey.pub
Poslední možností je použití Yubikey pro SSH autorizaci. Toho je docíleno spoluprací s GPG, které k tomuto má standardní mechanismy výměny informace s SSH klientem.
K čemu to? Například tím získáte odolnost proti chybám vývojářů SSH a možnosti, že by vám někdo exploitací chyby ukradl klíč. Pokud si myslíte, že je to nepravděpodobné, doporučuji k přečtení: OpenSSH obsahuje chybu umožňující ukrást klientské klíče (webarchive).
Ze všeho nejdřív si najdeme Autentizační klíč:
$ gpg --card-status can't connect to `/tmp/gpg-oTFIub/S.gpg-agent': Adresář nebo soubor neexistuje gpg: detected reader `Yubico Yubikey 4 OTP+CCID 00 00' Application ID ...: D2760001240102010006041314470000 Version ..........: 2.1 Manufacturer .....: unknown Serial number ....: 04131447 Name of cardholder: [není nastaven] Language prefs ...: [není nastaven] Sex ..............: neuvedeno URL of public key : [není nastaven] Login data .......: [není nastaven] Private DO 1 .....: [není nastaven] Private DO 2 .....: [není nastaven] Signature PIN ....: není vyžadováno Key attributes ...: 2048R 2048R 2048R Max. PIN lengths .: 127 127 127 PIN retry counter : 3 0 3 Signature counter : 7 Signature key ....: 9F87 EECF CDAA 263C AC00 A5A0 3F92 841C 3F6F 3D1B created ....: 2016-01-11 10:04:02 Encryption key....: DA79 B9A1 F403 2515 D167 12DC 64D4 BDA4 EF4A DF82 created ....: 2016-01-11 10:04:02 Authentication key: 13D3 290C 3FFE EC20 ED3B 4AD2 72A8 96C0 8F80 41DC created ....: 2016-01-11 10:11:32 General key info..: pub 2048R/3F6F3D1B 2016-01-11 Bystroushaak <bystrousak@kitakitsune.org> sec> 2048R/3F6F3D1B vytvořen: 2016-01-11 platnost skončí: nikdy číslo karty: 0006 04131447 ssb> 2048R/EF4ADF82 vytvořen: 2016-01-11 platnost skončí: nikdy číslo karty: 0006 04131447 ssb> 2048R/8F8041DC vytvořen: 2016-01-11 platnost skončí: nikdy číslo karty: 0006 04131447
Autentizační klíč je v tomto případě ten poslední:
Authentication key: 13D3 290C 3FFE EC20 ED3B 4AD2 72A8 96C0 8F80 41DC created ....: 2016-01-11 10:11:32
Jeho krátké ID získáme z přehledu klíčů příkazem:
$ gpg --fingerprint --fingerprint /home/bystrousak/.gnupg/pubring.gpg ----------------------------------- pub 2048R/3F6F3D1B 2016-01-11 Fingerprint klíče = 9F87 EECF CDAA 263C AC00 A5A0 3F92 841C 3F6F 3D1B uid Bystroushaak <bystrousak@kitakitsune.org> sub 2048R/EF4ADF82 2016-01-11 Fingerprint klíče = DA79 B9A1 F403 2515 D167 12DC 64D4 BDA4 EF4A DF82 sub 2048R/8F8041DC 2016-01-11 Fingerprint klíče = 13D3 290C 3FFE EC20 ED3B 4AD2 72A8 96C0 8F80 41DC
Zde je možné vidět, že k fingerprintu 13D3 290C 3FFE EC20 ED3B 4AD2 72A8 96C0 8F80 41DC náleží ID 2048R/8F8041DC. Použít je také možné příkaz:
$ gpg --fingerprint --fingerprint | grep -B 1 "`gpg --card-status | grep Authentication | cut -d ":" -f 2`"
Jakmile máte ID klíče pro autentizaci, je možné postoupit k generování veřejného klíče:
$ gpgkey2ssh 8F8041DC ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCXM63qLDM/AxUdotf46xQ5lkWiNnztgQEAPXu3maXt Z4U+ZYEarPLG9sF/5Vc7pMH5TuBV/6+l3835hGOYcelYw1l8VMYGWIUjzALo8zxEpyfUf50m8C2lfJKJ Q9o/AeU3GmWrA2zkkUnqLHJih0Rj1lCcS5CGYZ6yAhsCFB5SC/I7bTByP7KOhISTLQkb3kRz7zTxOw4+ lOOlmTcbd5vHfuZvoYkU8I9o4GmbC1ofZ/dr0WxVVm0ZcBZ7R56sh53d/hDJoB0AMJH7MRrVgkGZqPdr d2uGKTqn1aaP5fbr53mZLLotbWbx40VmUi9O2FnytACQIOYSJlurOx/sORjF COMMENT
Což vygeneruje nový veřejný klíč, který je možné přidat na serveru do souboru .ssh/authorized_keys. Jakmile se na server přihlásíte, SSH vás prostřednictvím GPG požádá o PIN (pokud jste si ho nastavili) a autorizaci dotekem kapacitního snímače Yubikey. Pokud není Yubikey vložen, je zobrazena žádost o heslo (pokud je k přihlášení heslo povoleno).
Yubikey mě vyšel přesně na 1699,85 Kč, což je kapku víc než uváděných $40 (~958 Kč).
Důvodů je několik…
Pokud ho budete objednávat, počítejte že v praxi vás to vyjde na podobnou částku, ± 200kč.
Zbývá ještě odpovědět jednu otázku: Opravdu je to užitečné, nebo se jedná o bazmek?
Jak si možná někteří všimli z data u generování klíčů, tento článek jsem začal psát v lednu a v době vydání je přelom dubna a května. Měl jsem tedy více než tři měsíce na otestování praktické použitelnosti Yubikey.
Musím říct, že jsem s ním docela spokojený. Ideální by asi bylo, kdyby se místo PIN používal otisk prstu, ale člověk nemůže mít všechno. Pokud chcete zlepšit zabezpečení ať již ve firmě, či v rámci zdravé „domácí paranoie“, určitě je to dobrá volba.
Další zdroje informací a články, ze kterých jsem vycházel při psaní:
Šílená cena, proč ne http://yubikeys.cz/product/yubikey-4/ ?Protože jsem to v té době nenašel. Ve whois mají:
domain: yubikeys.cz registrant: FORPSI-PSX-S509086 nsset: FORPSI keyset: FORPSI-KS-0DHATNFC registrar: REG-INTERNET-CZ registered: 13.03.2016 19:56:11 changed: 13.03.2016 20:00:52 expire: 13.03.2017Takže to nejspíš ani neexistovalo.
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.