3.7. Různé

Tato část obsahuje rozšiřující témata. Začneme modelem důvěry nazvaným TOFU, ukážeme si jak pomocí gpg šifrovat hesla pro jiné aplikace, popíšeme fungování programů gpg-agent. A též si ukážeme použíti gpg klíčů pro autentizaci pomocí ssh.

3.7.1. Důvěřuj při prvním styku (TOFU)

V kapitole TODO byl popsán klasický model důvěry obsažený v OpenPGP – platné jsou klíče podepsané Vámi nebo důvěryhodnými osobami (pavučina důvěry). V roce 2015 byl program gpg rozšířen o model Trust On First Use (TOFU) – důvěřuj při prvním užití 17.

Princip je jednoduchý – když přijde první podepsaná zpráva z nějaké e-mailové adresy, tak se z veřejného klíčového serveru stáhne klíč a označí jako částečně platný – je přidána nová úroveň platnosti. U několika následných použití uvedeného klíče (ověření podpisu či zašifrování pro dotyčného) se zobrazuje upozornění There is limited assurance this key belongs to the named user. Poté se stane plně platným.

U všech dalších zpráv se kontroluje, zda se pro danou e-mailovou adresu klíč nezměnil – pokud ano, tak se zobrazí upozornění na možné podvržení klíče.

Je též možný MitM útok při prvním použití klíče. Útočník ale potom musí podvrhávat klíč i při následující komunikaci, jinak je velmi pravděpodobné odhalení útoku.

Model TOFU se používá při ověřování důvěryhodnost serveru v SSH. U OpenPGP chybí dotaz na ověření otisku serveru při prvním výskytu 18. TOFU je méně bezpečný než klasický model – ověřuje se pouze přiřazení stejného klíče k e-mailové adrese, neověřuje se identita držitele privátního klíče.

Model TOFU vyžaduje minimální aktivitu uživatelů, což paradoxně může vést k lepšímu zabezpečení než klasický model, ve kterém uživatelé neověřují uživatele a podepisují cizí klíče automaticky. Bezpečnost TOFU se zvyšuje se zvětšujícím se počtem vyměněných podepsaných zpráv. Výhodou je i prodlužování platnosti klíčů vlastníky – pokud někdo stejným klíčem podepisuje většinu zpráv více let, tak zpráva podepsaná jiným klíčem pro stejnou identitu je automaticky podezřelá a gpg na ni upozorní.

3.7.2. Šifrování hesel pro další aplikace

Gpg umožňuje bezpečné uložení hesel pro další aplikace a jejich zpřístupnění pomocí hesla k privátnímu klíči. Příkladem může být poštovní program mutt, který umí číst zprávy na IMAP serveru a odesílat je přes autentizované spojení vůči SMTP serveru. Hesla jsou uloženy v souboru .mutt/passwords:

set imap_pass="heslo_k_imap_serveru"
set smtp_pass="heslo_k_smtp_serveru"

a v souboru .mutt/muttrc bude řádek:

source ~/.mutt/passwords

Toto není bezpečné uložení hesel. Může si je přečíst administrátor, budou uloženy na zálohách systému. Pokud není zašifrován disk, tak si je může přečíst i případný zloděj počítače.

Řešením je soubor s hesly zašifrovat pro sebe pomocí gpg a původní soubor následně smazat:

gpg --recipient vaše_keyid --encrypt ~/.mutt/passwords
rm ~/.mutt/passwords

V souboru .mutt/muttrc se konfigurace upraví následovně:

source "gpg --no-tty -qd ~/.mutt/passwords.gpg \|"

Při spuštění programu mutt se program gpg zeptá na heslo k privátnímu klíči (pokud není v gpg-agent), dešifruje soubor s hesly a přes rouru předá obsah programu mutt. Z gpg se tak stává správce ostatních hesel.

Podrobnější popis včetně dalších bezpečnostních doporučení najdete v článku https://wiki.xmission.com/Hosted_Email:Mutt. Ne všechny programy popisované řešení umožňují.

3.7.3. gpg-agent – správa privátních klíčů a hesel pro aplikace

Program gpg-agent běží na pozadí (daemon) a spravuje privátní klíče a hesla pro aplikace. Od verze 2.0 se tento uživatelský daemon spouští automaticky.

Pokud program gpg potřebuje privátní klíč, tak kontaktuje proces gpg-agent. Pokud je klíč již v paměti, tak ho poskytne žádající aplikaci. Pokud v paměti není, tak se ho pokusí načíst z klíčenky. Přitom se zeptá na heslo k privátnímu klíči. Pro dotazy na heslo se používá některá z aplikací pinentry. Existují verze pro textové i pro grafické rozhraní.

Gpg-agent při spuštění čte konfigurační souboru ~/.gnupg/gpg-agent.conf. Můžete nastavit např. následující parametry (další možnosti jsou popsány v manuálových stránkách):

default-cache-ttl 1800
max-cache-ttl 43200

Parametr default-cache-ttl udává čas neaktivity ve vteřinách. Přednastaveno je 600 vteřin – pokud se 600 vteřin konkrétní klíč či konkrétní heslo nepoužije, tak se vymaže z paměti. Druhý parametr max-cache-ttl má přednastaveno 7200 vteřin (2 hodiny) – klíč se smaže z paměti po dvou hodinách od nahrání i když se průběžně používá. Uživatel poté musí znovu zadat heslo ke klíči.

3.7.4. Klíče pro autentizaci

Napadla Vás někdy otázka, zda by nebylo možné použít RSA klíče z OpenSSH též v OpenPGP či obráceně?

Nejdříve je potřeba si uvědomit, že v SSH je jedna dvojice klíčů, kdežto v OpenPGP je hierarchie klíčů – hlavní dvojice je pro podepisování klíčů a případně dokumentů. Pro další užití jsou podklíče. Je definováno i užití Authentication – pro autentizaci uživatele. A SSH klíče se používají pro autentizaci.

gpg-agent umí simulovat chování programu ssh-agent. Tj. nahraje autentizační klíče do paměti a programu ssh je poskytuje stejným způsobem, jako to dělá ssh-agent. V tomto případě ale nesmí být spuštěn program ssh-agent. gpg-agent nabídne k autentizaci podklíče s užitím pro autentizaci, je schopen nabídnou i ssh klíče vygenerované mimo gpg.

Klíče pro autentizaci můžete vytvořit při expertní úrovní editace klíče:

gpg --expert --edit-key keyId

Další klíč přidáte pomocí povelu addkey – na expertní úrovni se Vám nabídnou volby s možností nastavení užití vytvářeného klíče (set your own capabilities). V dalším kroku nastavíte vytvářené dvojici klíčů užití na autentizaci.

Do konfiguračního souboru ~/.gnupg/gpg-agent.conf je potřeba doplnit řádek:

enable-ssh-support

Otisk (tzv. keygrip) konkrétního klíče pro SSH autentizaci je potřeba zapsat do souboru ~/.gnupg/sshcontrol:

Výpis 3.30 Zjištění „keygrip“ autentizačního klíče a zapsání do souboru .gnupg/sshcontrol.
gpg -k --with-keygrip
/home/pavlicek/.gnupg/pubring.kbx
---------------------------------
pub   rsa2048 2018-03-14 [SC] [expires: 2020-03-13]
      AB96794BC38AC89538F5DB0DDEAF94B63E7B49C5
      Keygrip = 7C9D19B7815151B91E7DAD85BABC003CBFA8E581
uid           [ultimate] Lubos Pavlicek <pavlicek@bis.vse.cz>
sub   rsa2048 2018-03-14 [E] [expires: 2020-03-13]
      Keygrip = A8BE3E60570B41FE19E3101AB2EE0A5174F99CAB
sub   ed25519 2018-03-14 [A]
      Keygrip = 541E8E50D76897CB55227B66CF237194498661E0

echo 541E8E50D76897CB55227B66CF237194498661E0 > ~/.gnupg/sshcontrol

Dále je potřeba

export SSH_AUTH_SOCK=$(gpgconf --list-dirs agent-ssh-socket)

Poslední krok je zjistit veřejný klíč ve formátu použitelném do souboru .ssh/authorized_keys pomocí programu ssh-add -l. V následující ukázce se vypíše klíče vygenerovaný algoritmem ed25519 (Curver 25519).

ssh-add -l
256 SHA256:fHPpI2b21jsBlV14X7i6zP4/3fPntday3laXiLO9OsY (none) (ED25519)

Podrobný popis nastavení najdete v článku Using a GPG key for SSH Authentication Ve Windows může program gpg-agent nahradit aplikaci pagent z PuTTY. Výhodou je řádově bezpečnější uložení klíčů i možnost nastavení dotazu na heslo ke klíči při delší době nepoužití klíče.

V článku How to use a GPG key for SSH authentication je popsáno využití hardarového tokenu pro uložení privátního klíče.

Neexistuje snadný způsob, jak do klíčenky naimportovat dvojici klíčů vytvořenou pro ssh. Problematický je i export soukromého klíče pro autentizaci z klíčenky do formátu, který používá ssh.

17

WALFIELD, Neal H.; KOCH, Werner. TOFU for OpenPGP. In: Proceedings of the 9th European Workshop on System Security. ACM, 2016. p. 2.

18

Pomocí přepínače či parametru konfiguračního souboru lze nastavit, že se program gpg bude při prvním výskytu ptát podobně jako ssh.