Certifikáty v OpenSSH

22. 6. 2011
Doba čtení: 7 minut

Sdílet

V minulém díle seriálu o zajímavých vlastnostech OpenSSH jsme si představili prokazování identity serverů a použili systém DNSSEC pro bezpečné uložení otisků serverových klíčů. Dnes u podobného tématu zůstaneme a ke stejnému účelu použijeme certifikáty, které jsou v OpenSSH poměrně horkou novinkou.

Od verze 5.4, která vyšla v březnu 2010, podporuje OpenSSH používání certifikátů pro ověřování platnosti serverových i uživatelských SSH klíčů. Nejedná se o plnohodnotné X.509 certifikáty, které známe například z protokolu SSL/TLS, i když základní myšlenka je stejná – namísto přímého ověřování jednotlivých entit svěříme svou důvěru certifikační autoritě. Jejím úkolem je ověřit, že entita vlastnící daný klíč je tou, za kterou se vydává a toto stvrdit svým podpisem na certifikátu. Takový certifikát může ještě obsahovat omezení, za jakých okolností je platný, tak aby například certifikát serveru server.example.com nebyl platný, pokud ho použije server jiného jména.

Vytvoření certifikační autority (CA)

I přes vznešený název není certifikační autorita nic jiného, než běžná dvojice veřejného a soukromého SSH klíče:

$ ssh-keygen -t rsa -b 4096 -C exampleCA -f key-exampleCA

Důvěryhodnost celého systému závisí na zabezpečení privátního klíče certifikační autority. Měli bychom tedy volit opravdu silné heslo k šifrování privátního klíče. Nebo ještě lépe privátní klíč vůbec nemít na disku, bude totiž potřeba jen při vystavování certifikátů, což se neděje příliš často.

Vytvoření serverových certifikátů

K vytvoření certifikátu je třeba bezpečně dopravit na společný počítač zároveň privátní klíč certifikační autority i veřejný klíč, který má být podepsán. Vlastní podepsání serverových klíčů provedeme takto:

$ ssh-keygen -s key-exampleCA -I server.example.com -h \
             -n server.example.com,1.2.3.4,2001::1:2:3 \
         ssh_host*.pub
Enter passphrase:
Signed host key ssh_host_dsa_key-cert.pub: id "server.example.com"
  serial 0 for server.example.com,1.2.3.4,2001::1:2:3 valid forever
Signed host key ssh_host_ecdsa_key-cert.pub: id "server.example.com"
  serial 0 for server.example.com,1.2.3.4,2001::1:2:3 valid forever
Signed host key ssh_host_rsa_key-cert.pub: id "server.example.com"
  serial 0 for server.example.com,1.2.3.4,2001::1:2:3 valid forever

Pro vystavování serverových certifikátů je klíčové použití přepínače -h, jinak je vystaven uživatelský certifikát, který SSH server odmítne. Přepínač -I označuje identifikátor klíče, to je řetězec, který se mimo jiné vypíše do logu při pokusu o přihlášení. Nepovinný přepínač -n omezuje použití certifikátu na uvedená jména serverů (v originále principals). Pokud jej neuvedeme, bude certifikát platný globálně. Manuálová stránka programu ssh-keygen uvádí další možná omezení, včetně například omezení doby platnosti certifikátu.

Vygenerované certifikáty nyní přeneseme na server, preferovaně do adresáře /etc/ssh. Na rozdíl od serverových klíčů, které jsou SSH serverem automaticky načteny, musíme u certifikátů explictně vyžádat jejich načtení přidáním následujících řádků do souboru  sshd_config:

HostCertificate /etc/ssh/ssh_host_rsa_key-cert.pub
HostCertificate /etc/ssh/ssh_host_dsa_key-cert.pub
# Vynechte následující řádek, pokud ECDSA klíče nepoužíváte
HostCertificate /etc/ssh/ssh_host_ecdsa_key-cert.pub

Po reloadu nebo restartu by měl být server připraven. Může se ale stát, že server odmítne certifikáty načíst. Mně se to stalo v případě, kdy jsem se pokoušel nahrát certifikát z nové verze balíku OpenSSH do staršího serveru. Ve vydání OpenSSH 5.6 byl totiž zaveden nový formát certifikátu, který je se starými servery nekompatibilní. Řešení problému je dvojí, buď vygenerovat certifikát použitím utilitky ssh-keygen ze starší verze OpenSSH, nebo pomocí nedokumentované funkce vynutit generování staršího formátu certifikátu v nové verzi:

$ ssh-keygen -s … -t ssh-rsa-cert-v00@openssh.com ssh_host_rsa_key.pub
$ ssh-keygen -s … -t ssh-dss-cert-v00@openssh.com ssh_host_dsa_key.pub

Ověřování serverových certifikátů

Server máme nakonfigurován, zbývá nastavit klienta. V souboru known_hosts odstraňte nebo zakomentujte všechny záznamy se starými klíči serveru, které už nebudou potřeba. Dále do souboru vložte, preferovaně na začátek, veřejný klíč certifikační autority:

@cert-authority * ssh-rsa AAAAB3…NN exampleCA

Před klíč, získaný ze souboru key-exampleCA.pub připíšeme atribut @cert-authority a hvězdičku. Ta zde nahrazuje jméno konkrétního serveru a znamená tedy, že klíč CA platí pro jakýkoli server, který se prokáže platným certifikátem.

Na tomto místě je dobré se zmínit, že existuje také globální seznam známých serverů. Ten se nachází v souboru /etc/ssh/ssh_known_hosts. Umístíme-li klíč CA tam, bude CA důvěryhodná pro všechny místní uživatele.

Pokud jste podle minulého dílu nastavili proměnnou klienta HostKeyAlgorithms na ssh-rsa a ssh-dss, toto nastavení znemožňuje přijetí certifikátu. Volbu tedy buď zakomentujte, nebo doplňte formáty SSH certifikátů, které najdete v manuálové stránce ssh_config(5), například takto:

HostKeyAlgorithms ssh-rsa-cert-v01@openssh.com,ssh-rsa-cert-v00@openssh.com,ssh-rsa,ssh-dss

Nyní se zkuste přihlásit. Přidejte přepínač -v a sledujte, jak ověření serveru probíhá:

$ ssh -v server.example.com
…
debug1: Server host key: RSA-CERT 33:74:2d:3b:12:79:a4:bc:69:b4:62:9b:ee:8d:19:c4
debug1: Host 'server.example.com' is known and matches the RSA-CERT host certificate.
debug1: Found CA key in /home/user/.ssh/known_hosts:1
…

Uživatelské certifikáty

Princip certifikátů funguje stejně dobře i s uživatelskými klíči. Také uživatelský klíč můžeme podepsat certifikační autoritou. Nepovinný přepínač -n tentokrát určuje uživatelské jméno, pro které je daný certifikát platný.

$ ssh-keygen -s key-exampleCA -I user@example.com \
             -n user,root id_dsa.pub
Enter passphrase:
Signed user key id_dsa-cert.pub: id "user@example.com" serial 0 for user,root valid forever

Ponecháme-li certifikátu výchozí jméno, OpenSSH ho automaticky najde a načte:

$ ssh-add id_dsa
Identity added: id_dsa (id_dsa)
Certificate added: id_dsa-cert.pub (user@example.com)

Akceptaci certifikátů na straně serveru zajistíme tak, že do souboru ~/.ssh/authorized_keys vložíme veřejný klíč CA, opatřený značkou  cert-authority:

cert-authority ssh-rsa AAAAB3…NN exampleCA

Centralizujeme

Uživatelské certifikáty můžeme využít i jiným, zajímavějším způsobem. Klíč certifikační autority je možné zadat globálně SSH serveru. Server pak automaticky povolí přihlášení platnému certifikátu, jehož pole principals odpovídá požadovanému uživatelskému účtu, aniž by vůbec musel existovat soubor ~/.ssh/authorized_keys. Stačí k tomu veřejný klíč CA někam nakopírovat, například do /etc/ssh/key-exampleCA.pub, a do konfiguračního souboru serveru přidat volbu:

TrustedUserCAKeys /etc/ssh/key-exampleCA.pub

Nemá-li uživatelský certifikát vyplněno jméno principals, nemůže se pomocí centrální autority přihlásit. Seznam principálů, kteří se mohou přihlásit, může být dále omezen v souboru, na který ukazuje konfigurační direktiva  AuthorizedPrincipalsFile.

Revokujeme

Nedílnou součástí vydávání jakýchkoli certifikátů je i jejich zneplatnění – revokace. K té by mělo dojít, kdykoli klíč opatřený příslušným certifikátem pozbyl svého významu, nebo byl kompromitován.

Poměrně snadná je revokace serverového certifikátu. Stačí revokovat příslušný serverový klíč tak, jak jsme si ukázali už v minulém díle. Revokovaný klíč vložíme do souboru známých serverů a opatříme tagem @revoked, popřípadě i hvězdičkou na místě jména serveru. Revokací klíče pozbude platnosti i certifikát, který byl pro klíč vystaven a při pokusu o jeho použití vyhlásí SSH klient poplach:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@       WARNING: REVOKED HOST KEY DETECTED!               @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
The RSA-CERT host key for server.example.com is marked as revoked.
This could mean that a stolen key is being used to impersonate this host.
RSA-CERT host key for server.example.com was revoked and you have requested strict checking.
Host key verification failed.

U uživatelských certifikátů je situace složitější. Zatímco nevhodné uživatelské klíče stačí odstranit ze souboru ~/.ssh/authorized_keys, při použití certifikátů můžeme takto zneplatnit pouze všechny certifikáty vydané příslušnou CA najednou. Jediná možnost selektivní revokace konkrétních uživatelských klíčů, které mají vystaven důvěryhodný certifikát, spočívá v konfigurační volbě serveru zvané RevokedKeys. Ta ukazuje na soubor obsahující revokované uživatelské klíče. Tento soubor je čten při každém pokusu o přihlášení a obsahuje-li klíč, kterým se uživatel snaží hlásit, server přihlášení odmítne a do syslogu poznamená:

sshd: error: WARNING: authentication attempt with a revoked RSA key e9:…:87

K dobrým praktikám při vydávání certifikátů patří také časové omezení jejich platnosti. Po uplynutí časové platnosti certifikátu se stane nepoužitelným a k němu příslušející klíč tedy můžeme bez obav odstranit z revokačního seznamu. Příliš krátké časové omezení certifikátů ale zase naopak zvyšuje nároky na distribuci aktuálních certifikátů, jejich podepisování a tím také ochranu privátního klíče CA. Je tedy vždy potřeba najít rozumný kompromis.

Závěr

V používání SSH certifikátů osobně vidím velký přínos. Především serverové certifikáty představují zvýšení bezpečnosti a usnadnění správy seznamů známých serverů v podstatě bez negativních aspektů. Na rozdíl od uložení klíče v systému DNSSEC není celý systém závislý na poměrně komplexní hierarchii podpisů DNS zón. Není ale žádný problém provozovat oba systémy současně a vytěžit z každého jeho pozitiva.

ict ve školství 24

I uživatelské certifikáty si jistě své místo na slunci najdou, především v cetralizované variantě. Před jejich nasazením a používáním je ale třeba nějakým způsobem vyřešit distribuci seznamu revokovaných klíčů. Masivnímu rozšíření uživatelských certifikátů také jistě brání nepodpora v alternativních klientech, zejména PuTTY.

V příštím, nejspíše závěrečném díle seriálu o zajímavých vlastnostech OpenSSH si rozebereme různé scénáře použití OpenSSH, včetně těch méně tradičních. Pokusíme se omezit množinu akcí, které může klient provádět, a jistě dojde i na nějaké tipy a triky.

Autor článku

Ondřej Caletka vystudoval obor Telekomunikační technika na ČVUT a dnes pracuje ve vzdělávacím oddělení RIPE NCC, mezinárodní asociaci koordinující internetové sítě.