Hlavní navigace

eObčanka jako úložiště SSH klíčů

2. 12. 2019 14:13 (aktualizováno) Josef Dvoracek

Od 1.7.2018 se vydává občanský průkaz s elektronickým čipem, umožňujícím nahrátí kryptografických klíčů spolu s certifikátem, který lze použít k „autentizaci vůči informačním systémům, např. webovým stránkám, internetovým službám“ 01. Pojďme se podívat, jestli je možné využít tuto kartičku jako úložiště pro ssh klíče..

Motivace

Pořídit hardwarový kryptografický token není dnes ani obtížné, ani příliš drahé. Nicméně proč pořizovat další kus plastu, když OP nosí většina z nás u sebe? Cena široce známého tokenu Yubikey 5 se pohybuje mezi jedním a dvěma tisíci korun, poplatek za výměnu OP je v řádu jednotek stovek korun a mít u sebe platný průkaz je celkem běžnou záležitostí.

Občanský průkaz, model s čipem zdroj: MVČR

Technický background

Současný model občanského průkazu umožňuje[02] skrze aplikaci eObčanka uložení kryptografických klíčů a certifikátů. Současně, součástí instalace eObčanky jsou ovladače čipu občanského průkazu pro práci s certifikáty standardu PKCS#11[03].

Úložiště certifikátů implementující rozhraní PKCS#11 je možné využít k uložení ssh klíče[04].

Varování

Zákon hovoří jasnou řečí, dle [05] se občan se dopustí přestupku tím, že:

(16) neoprávněně zapíše, předá, zveřejní, zablokuje, zlikviduje nebo jinak neoprávněně zpracovává údaje vedené v kontaktním elektronickém čipu.

Je tedy nanejvýše vhodné se ujistit, zda naší aktivitou neporušujeme výše citovaná ustanovení. Pro vyloučení všech pochybností, následující návod je primárně určen pro s občanským průkazem kompatibilní čipovou kartu.

Realizace

Vytvoření klíčů a certifikátu

Pomocí utility ssh-keygen vytvoříme ECDSA klíč ve formátu pem.

$ ssh-keygen -t ecdsa -m pem -f /home/jose/projects/key_for_ssh2/key2.key
Generating public/private ecdsa key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/jose/projects/key_for_ssh2/key2.key.
Your public key has been saved in /home/jose/projects/key_for_ssh2/key2.key.pub.
The key fingerprint is:
SHA256:3QDuOXtezo+2d5pTWhqWG7wuQUyWXgPwBQuhS6rfe60 jose@laptop
The key's randomart image is:
+---[ECDSA 256]---+
|        . +oo+.  |
|       . o o+oo  |
|        + .=o. . |
|       + + o+    |
|      . S .... . |
|     .   o  . * o|
|    .   . ...o X |
|     . . o.++.B..|
|      . ooEo=*=+ |
+----[SHA256]-----+
$

Dle dostupné dokumentace obslužná aplikace k čipové kartě podporuje nahrátí certifikátu, nikoliv samotného klíče, vytvoříme si tedy self-signed certifikát, obsahující v předešlém kroku vygenerovaný klíč:

$ openssl req -key ./key2.key -new -nodes -x509 -days 365 -out key2_certificate.pem
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:CZ
State or Province Name (full name) [Some-State]:Czechia
Locality Name (eg, city) []:Prague
Organization Name (eg, company) [Internet Widgits Pty Ltd]:N/A
Organizational Unit Name (eg, section) []:N/A
Common Name (e.g. server FQDN or YOUR name) []:N/A
Email Address []:test@mailinator.com
$

Zde je nutné poznamenat, že i když specifikujeme platnost certifikátu, při ssh autentizaci se tato neověřuje, a tudíž platnost certifikátu v žádném případě nelze považovat jako relevantní pro bezpečnost.

Vytvořený certifikát zabalíme do archivu pkcs12, a pokud plánujeme vzniklý soubor archivovat, zvolíme dostatečně bezpečnou passphrase.

$ openssl pkcs12 -export -inkey key2.key -in key2_certificate.pem -out key2_archive.p12
Enter Export Password:
Verifying - Enter Export Password:
$

Nahrávání certifikátu do čipové karty

Stáhneme a nainstalujeme si aplikaci eObčanka, v současné době dostupné jako „Instalační balíček eObčanka pro Linux“ v podobě deb balíku. Postup jsem vyzkoušel na distribuci (K)ubuntu 19.10.

Zjistíme cestu ke knihovně poskytující PKCS11# rozhraní:

$ dpkg -c ./eObcanka.deb  | grep libeop2v1czep11.so
-rw-r--r-- root/root   2058136 2019-02-19 12:22 ./usr/lib/x86_64-linux-gnu/libeop2v1czep11.so.1.5.19.0218
-rw-r--r-- root/root       256 2019-02-19 12:22 ./usr/local/etc/crplus/sigs/x64/libeop2v1czep11.so.sig
lrwxrwxrwx root/root         0 2019-09-26 13:46 ./usr/lib/x86_64-linux-gnu/libeop2v1czep11.so -> /usr/lib/x86_64-linux-gnu/libeop2v1czep11.so.1.5.19.0218
$

Jak je vidno výše, soubor, resp symlink vedoucí na skutečný soubor je nainstalován zde:

/usr/lib/x86_64-linux-gnu/libeop2v1czep11.so

Čipovou kartu zasuneme do kompatibilní čtečky, použil jsem vestavěnou smart-card čtečku v mém laptopu a spustíme aplikaci „eObčanka – Správce karty“, kde vidíme dostupné kontejnery:

eobčanka – detail čipové karty


Na příkladu výše vidíme, že máme dostupné čtyři kontejnery pro klíč ECC o maximální velikosti 521 bitů.

V souladu s příručkou k aplikaci provedeme „Import klíče“. Aplikace si vyžádá PIN ke kartě, nahraje do karty certifikát, a při pokusu o reload nejspíše spadne. Aplikaci nastartujeme ještě jednou, a měli bychom nově vidět obsazený kontejner:

eObčanka – náš 256b certifikát je v prvním „růžovém“ kontejneru

Ověření provedeme utilitkou ssh-keygen za použití .so knihovny zjištěné výše. Knihovna se nás skrze ssh-keygen zeptá na PIN k čipové kartě, a vypíše jeho veřejnou část:

$ ssh-keygen -D /usr/lib/x86_64-linux-gnu/libeop2v1czep11.so -e
Enter PIN for 'eOP2v1 CZE 123123123':
ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBFPXGcLyE8bWDvSzQ7ah2Lg2vTIQaHtbIp7ODtNN/IAXbGmoCBJyQ+/VvWZ3keccQDWVIyHye6WopreWBvRhX1Q=
$

obsah by měl být identický s *.pub souborem vygenerovaným příkazem ssh-keygen v prvních krocích tohoto návodu. Identifikační řetězec na konci klíče je však oříznut:

$ cat key2.key.pub
ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBFPXGcLyE8bWDvSzQ7ah2Lg2vTIQaHtbIp7ODtNN/IAXbGmoCBJyQ+/VvWZ3keccQDWVIyHye6WopreWBvRhX1Q= xxx@xxxxxxxx
$

Autentizace oproti ssh serveru

Praktické využití je již nejspíše zřejmé, na serveru, ať už v souboru authorized_keys, nebo snad více sofistikovaných řešení např. pomocí LDAP zadefinujeme veřejnou část klíče, a měli bychom být schopní se přihlásit klíčem na čipové kartě:

user@laptop:~$ ssh -I /usr/lib/x86_64-linux-gnu/libeop2v1czep11.so user@server
Enter PIN for 'eOP2v1 CZE 123123123':
Linux server 3.16.0-10-amd64 #1 SMP Debian 3.16.74-1 (2019-09-24) x86_64
user@server:~$

Nechám již na fantazii čtenáře, jak libeop2v1czep11.so použít automaticky.

Jako poslední krok není na škodu bezpečně zničit veškeré privátní klíče, které jsme vytvořili v průběhu tohoto postupu. Budou-li se nám válet na lokálním disku, myšlenka použití čipové karty jako relativně bezpečného úložiště přijde vniveč. Popřípadě, dle Vaší zálohovací politiky, zvažte zašifrování a odzálohování klíčů na bezpečné úložiště.

Changelog

  • 2.12.2019 – přidána zmínka o alternativě k zničení klíčů na výchozím stroji, kredit

Reference

Sdílet