YubiKey aj GnuPG sú schopné robiť veľa vecí. Rozdiel, ktorý by niekto mohol poukázať, je, že GnuPG pravdepodobne nerobí ani jedno z nich obzvlášť dobre, a podobá sa tak trochu na švajčiarsky nožík. Bez ohľadu na to, ako dobre každý z týchto nástrojov zvláda úlohy, ktoré je schopný vykonávať, oba sa stali de-facto štandardom vo svojich oblastiach.
Keďže sféry vplyvu oboch nástrojov sa prekrývajú na viacerých frontoch a pre komplexnosť GnuPG, je nevyhnutné, že existujú tak nesprávne, ako aj správne spôsoby ich spoločného použitia.
Začnime od bezpečnejšej stránky tohto spektra — existuje naozaj pekný sprievodca YubiKey, ktorý pokrýva väčšinu prípadov použitia, ktoré výkonný YubiKey ponúka, pričom väčšinu dĺžky sprievodcu venuje špecificky funkcionalite GnuPG. Pre YubiKey sprievodca sotva vynechá čokoľvek naozaj dôležité, s čím by sa človek mohol stretnúť.
Príbeh je bohužiaľ celkom iný pre OpenPGP smartcard — bezpečnostný token vo forme karty, ktorý sa zmestí do mojej peňaženky. YubiKey v skutočnosti pohltil tento smartcard úplne, pričom ponúka každú jednotlivú časť jeho funkcionality ako náhradu, pričom navyše pridáva množstvo ďalších funkcií. Ak ignorujeme všetky ostatné bezpečnostné funkcie, samotné pridanie NFC je plus. Skutočnosť, že YubiKey dokáže všetko, čo OpenPGP smartcard, je dôvodom, prečo je možné postupovať podľa sprievodcu pre YubiKey pri práci s OpenPGP smartcard. Aspoň som si to myslel.
Key Derivation Function #
Skôr ako pôjdeme ďalej, musím stručne vysvetliť jeden kľúčový koncept: Key Derivation Function. Zjednodušene povedané, KDF je funkcia, ktorá transformuje jeden kľúč na iný reprodukovateľným spôsobom. Ak ste sa niekedy zamýšľali nad tým, odkiaľ pochádza hashovanie hesiel, KDF je ten vinník. Existujú dve ďalšie dôležité vlastnosti tohto procesu.
Po prvé, obrátenie funkcie (získanie pôvodného kľúča z odvodeného) by malo byť prakticky nemožné. Táto podmienka je neustále napádaná novším a lepším hardvérom a obrovským množstvom dostupných dát. Preto je napríklad používanie MD5 aktívne odrádzané.
Druhá dôležitá vlastnosť pre podmnožinu Key Derivation Functions je, že poskytnutie výsledku by malo trvať nejaký čas. Pre KDF, kde je takáto vlastnosť žiaduca, je poskytnutý vstupný parameter nazývaný iterácie. Čím vyšší počet iterácií, tým dlhšie musí používateľ čakať pri legitímnom použití KDF (toto by malo byť sotva postrehnuteľné), ale zároveň exponenciálne dlhší čas by útočník potreboval na generovanie hashovacích tabuliek s touto funkciou, čím sa znižuje určitá útočná plocha.
KDF a štandard OpenPGP #
Na pochopenie toho, prečo je KDF dôležité pre OpenPGP smartcard aj YubiKey zároveň, je potrebné vedieť, že štandard OpenPGP definuje viacero PIN hesiel pre prevádzku, najdôležitejšie sú normálny PIN a admin PIN. Tieto PINy boli uložené v zariadení ako plaintext až do OpenPGP smartcard verzie 3.3 a YubiKey verzie 5.2.
Ukladanie hesla v plaintexte nie je dobrý nápad. Posielanie plaintext hesla cez akýkoľvek komunikačný kanál tiež nie je dobrý nápad. Páni definujúci štandard OpenPGP to pochopili a prišli s riešením, ktoré je bežnou praxou inde. Zjednodušene povedané, namiesto plaintextu uložiť hashe PINov na zariadení a nechať klienta — v tomto prípade softvér GnuPG — vypočítať hashovaný PIN pred jeho odoslaním do zariadenia, kde sa porovná. Páni sa rozhodli tento proces pomenovať jeho vedeckým názvom, teda KDF.
Existujú aspoň dva dobré dôvody na povolenie tejto funkcie na všetkých vašich OpenPGP smartcardoch a YubiKeyoch pri práci s GnuPG. Znižuje možnosť MITM útokov a ešte sťažuje útočníkovi urobiť niečo škodlivé s vaším zariadením pred tým, než zrušíte svoje certifikáty.
Rýchlosť adopcie #
Povolenie KDF sa teda zdá byť samozrejmosťou. Ako to zvyčajne býva s akýmkoľvek softvérom, viac funkcií vedie k viac chybám. Tento prípad nie je výnimkou. Existuje mnoho zmienok o tom, že povolenie nielen vyriešilo niektoré problémy, ale vytvorilo aj niekoľko ďalších. Niektoré boli vyriešené a prijaté v priebehu času.
Iné problémy boli vyriešené, ale neboli široko prijaté, ako je tomu v prípade vetvy GnuPG 2.3, ktorá je označená ako vývojová vetva, pripravujúca cestu pre stabilnú vetvu 2.4. Kvôli zmenám zavedeným v GnuPG 2.3, do ktorých sa teraz nebudem púšťať, mnohé distribúcie zostávajú pri vetve 2.2.
Balík gnupg Debianu aktuálne je na verzii 2.2.27. Arch nakrátko prešiel na 2.3.1, ale potom sa vrátil späť. Komunita Artix si to všimla a bola zmätená počas tohto procesu.
OpenPGP smartcard a GnuPG 2.2 #
Stále si nie som úplne istý, ako to, že povolenie KDF ako úplne prvého kroku hneď po factory resete funguje na YubiKey dokonca aj s GnuPG tak nízkej verzie ako 2.2.27 a zároveň zlyháva na GnuPG smartcard 3.4 s nasledujúcou chybou:
gpg/card> passwd
gpg: OpenPGP card no. XXXX detected
1 - change PIN
2 - unblock PIN
3 - change Admin PIN
4 - set the Reset Code
Q - quit
Your selection? 1
Error changing the PIN: Bad PIN
Výber možnosti 3 na zmenu admin pinu zlyhá s rovnakou správou:
Error changing the PIN: Bad PIN
Dôvodom je, že hoci sa KDF povolí pomocou admin príkazu kdf-setup, heslá
sa nerehashujú, takže porovnanie je rozbitné — teraz sa hash porovnáva s
plaintextom, alebo niečo podobné. Jediný spôsob, ako sa z toho dostať,
ktorý som našiel, je factory reset smartcard.
KDF s GnuPG 2.3.1 #
Dobrá správa je, že vyššie uvedený problém je vyriešený v GnuPG 2.3.0. Zlá správa je, ako už bolo povedané, táto verzia nie je príliš dostupná z oficiálnych repozitárov distribúcií, s ktorými bežne pracujem.
Ďalšia dobrá správa je, že keď je KDF povolené na GnuPG smartcard s GnuPG 2.3.1 (možno aj s 2.3.0, ale to som netestoval), môže interagovať s GnuPG 2.2.27 a vyššou verziou bez problému Bad PIN.
Takže jediná vec, ktorú treba urobiť, je spustiť GnuPG 2.3.1 a povoliť na ňom KDF. Našiel som spoľahlivý spôsob, ako to urobiť na Arch — zostavením a inštaláciou balíka GnuPG 2.3.1 z tohto commitu, pretože v určitom momente bol aj v oficiálnych repozitároch, pred stiahnutím, ako bolo opísané skôr.
V prípade konfliktu s gpgme, ktorý závisí od gnupg>=2, môžete upraviť
PKGBUILD nasledovne:
- provides=(${pkgname%-git})
+ provides=(${pkgname%-git}=2)
Mne to fungovalo.
Spustenie GnuPG 2.3.1 na Arch #
S nainštalovaným GnuPG 2.3.1 (alebo novším) pokračujte úpravou nastavení karty:
gpg --edit-card
Mali by ste však dostať nasledujúce upozornenie:
gpg: WARNING: server 'gpg-agent' is older than us (2.2.32 < 2.3.1)
gpg: Note: Outdated servers may lack important security fixes.
gpg: Note: Use the command "gpgconf --kill all" to restart them.
gpg: WARNING: server 'scdaemon' is older than us (2.2.32 < 2.3.1)
gpg: Note: Outdated servers may lack important security fixes.
gpg: Note: Use the command "gpgconf --kill all" to restart them.
Práve preto si myslím, že nie je triviálne používať verziu GnuPG, ktorá nie
je bežne dostupná z repozitárov — pokiaľ naozaj neviete, čo robíte. Keby
stačilo aktualizovať len gpg, veci by boli len o málo ťažšie ako spustiť
make a potom ./bin/gpg --edit-card. Aby to celé skutočne fungovalo,
musíme aktualizovať aj scdaemon a samozrejme gpg-agent. Iné distribúcie
než Arch by možno vystačili s
buildovaním gnupg zo zdroja
a úpravou parametrov ./configure pred spustením make install.
S nainštalovaným balíkom Arch sú však potrebné spustiteľné súbory už na mieste, stačí ich len načítať do pamäte — a práve to nám ukazuje vyššie uvedená správa:
gpgconf --kill all
Bohužiaľ, pri pokuse o editáciu karty teraz narazíme na problém:
gpg: selecting card failed: No such device
gpg: OpenPGP card not available: No such device
gpg/card>
Riešenie je oficiálne zdokumentované a potvrdené inde:
echo "disable-ccid" >> ~/.gnupg/scdaemon.conf
Zvyšok je jednoduchý. Povolte KDF na smartcard a potvrďte zmenou PINu.
Zmena PINu by teraz mala fungovať. Obnovte súbor scdaemon.conf a vráťte
sa späť na oficiálnu verziu GnuPG, aby ste si nerozbili proces overovania
balíkov správcu balíkov:
sudo pacman -S gnupg
Teraz môžete postupovať podľa
sprievodcu YubiKey aj s vetvou
GnuPG 2.2 presne tak, ako je — len preskočíte časť kdf-setup, keďže KDF
je už správne aktivované na smartcard. Užívajte!