Dept. of mathematics Různé
Použití ssh/scp bez hesla


Popíšu možnost přístupu ze stroje A do stroje B pomocí ssh bez hesla

Princip

Na stroji A vygenerujeme dvojici tajný-veřejný klíč (např. RSA nebo DSA). Tajný klíč ponecháme na stroji A a veřejný přemístíme na stroj B. Jakmile tyto klíče uložíme do správných souborů (viz níže odstavec "technická realizace"), program ssh je začne přednostně používat, namísto implicitní autorizace heslem na stroji B. Příkaz "ssh strojB" provedený na stroji A shledá, že na stroji B je připraven veřejný klíč. Program tedy zkontroluje, zda na stroji A není odpovídající tajný klíč (podrobněji viz dodatek). Pokud na stroji A je správný tajný klíč, program ssh (resp. scp) pustí uživatele do stroje B bez dalších kontrol.

Problém

Bezpečnost závisí na zabezpečení tajného klíče proti zneužití. Při generování dvojice klíčů program nabízí krýt tajný klíč heslem. Pak je na disku v souboru uložena šifra tajného klíče "skrz heslo" a kdo nezná heslo, nemůže ze souboru tajný klíč rekonstruovat. No jo, ale pak si nepomůžeme, neboť program ssh se nyní sice nebude ptát na heslo na stroji B, ale bude se ptát na heslo k dešifrování tajného klíče. Z pohledu uživatele není tedy žádný rozdíl, z pohledu strojů je rozdíl značný: kontrola heslem probíhá kompletně na stroji A. Stroj B žádnou kontrolu heslem neprovádí. Pokud tedy stroj A bude mít nějakého přechodného "pamatováka tajných klíčů", stačí, aby uživatel použil své heslo jednou a klíč uložil do toho "pamatováka" a může se pak opakovaně přihlašovat do stroje B bez použití dalšího hesla. Tímto "pamatovákem klíčů" je program ssh-agent (viz man ssh-agent). Tento program ukládá dešifrovaný tajný klíč jen v paměti počítače (nikoli na disk) a kryje jej vlastní šifrou. Klíč si pamatuje např. na dobu jednoho sezení uživatele u počítače A nebo na dobu zapnutí počítače A (na heslo ze zeptá při každém bootu). Míra konfrotu je zřejmě nepřímo úměrná míře zabezpečení.

Chci-li napořád přistupovat do stroje B bez hesla, je potřeba při generování klíčů nekrýt tajný klíč heslem. To je popsáno níže v ostavci "technická realizace". Musím si být ale vědom rizika s tím spojeného. Jakmile totiž veřejnou část klíče nakopíruji do stroje B, pak kdokoli, kdo vlastní tajnou část mého klíče, se dotane do mého účtu na stroji B. A já o tom ani nemusím vědět. Tajný klíč totiž musím mít uložen na stroji A. Příklad: superuživatel stroje A je někdo jiný naž já. Ten může snadno ukradnout můj tajný klíč a uložit si jej na notebook N. Pak může přistupovat k serveru B do mého účtu z notebooku N a já o tom vůbec nevím. Samozřejmě, superuživatel musí vědět, do jakého serveru B pod jakým účtem je potřeba jít, aby byl využit ukradený tajný klíč. Ale ani to pro superuživatele není problém, protože z historie příkazů je schopen zjistit, co vše na stroji A dělám a najde tam i příkaz, kterým se loguji do stroje B.

Pokud mi zmíněné bezpečnostní omezení nevadí (např. jsem sám superuživatelem stroje A nebo důvěřuji superuživateli stroje A nebo nejsem sice superuživatelem stroje A, ale superuživatel stroje A je zárověň superuživatelem stroje B, tj. nezíská krádeží mého klíče žádnou novou výhodu), mohu zůstat u nejjednodušší možnosti: nekrýt tajný klíč heslem. Tuto možnost nyní popíšu.

Technická realizace

Na stroji A vygeneruji dvojici klíčů. Mohu použít protokol RSA nebo DSA. V příkladu je použit RSA.

strojA$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/user/.ssh/id_rsa.
Your public key has been saved in /home/user/.ssh/id_rsa.pub.
The key fingerprint is:
62:d2:e3:f7:d3:ba:6a:1a:94:65:08:09:e7:b9:56:08 user@strojA

Kdykoli se program ssh-keygen na něco zeptá, zmáčknu jen Enter. Tj. potvrdím uložení tajného klíče do souboru .ssh/id_rsa a veřejného klíče do souboru .ssh/id_rsa.pub a dále zadám prázdné heslo. Tajný klíč nebude krytý heslem. Dále veřejný klíč zkopíruji do stroje B:

strojA$ scp /home/user/.ssh/id_rsa.pub user@strojB:
user@strojB's password:

zatím musím použít heslo, které mám na stroji B. Toto heslo použiji ještě jednou a naposled, abych získal prompt stroje B a mohl klíč přidat tam, kam patří:

strojA$ ssh user@strojB
user@strojB's password:
strojB$ cat id_rsa.pub >> .ssh/authorized_keys
strojB$ rm id_rsa.pub
strojB$ logout
strojA$

Tj. do souboru .ssh/authorized_keys na stroji B přidám veřejný klíč. Tento soubor může obsahovat celou sbírku veřejných klíčů. Například se do stroje B dostávám kromě stroje A ještě ze strojů X a Y.

Nyní už půjde přistupovat ze stroje A do stroje B bez hesla, vyzkouším:

strojA$ scp neco user@strojB:nekam
strojA$ ssh user@strojB
strojB$ 

Pokud chci ze stroje A podobně vstupovat do strojů C, D a dalších, do každého nakopíruji stejným způsobem stejný veřejný klíč, jako do stroje B. Není nutné generovat nové dvojice klíčů.

Dodatek -- princip asymetrické šifry

Tato šifra pracuje se dvěma klíči. Text lze jedním z dvojice klíčů zašifrovat a jen tím druhým dešifrovat. Tím prvním klíčem dešifrovat nelze. Je jedno, v jakém pořadí se klíče použijí. Jeden klíč je označen jako tajný a druhý jako veřejný. Veřejný klíč dávám uživateli, který chce se mnou tajně komunikovat (uživatel U) a tajný klíč si ponechám. Uživatel U širuje pro mě zprávu mým veřejným klíčem. V tomto okamžiku je šifra dekryptovatelná jen mým tajným klíčem, takže pouze já ji mohu dešifrovat. Pokud já chci zpětně psát šifrované zprávy uživateli U, musím použít jeho veřejný klíč a on to dešifruje svým tajným klíčem. Pro oboustrannou šifrovanou komunikaci jsou tedy potřeba dvě dvojice veřejný-tajný klíč.

Elektronický podpis se opírá rovněž o asymetrickou šifru. Zde naopak já šifruji kontrolní součet mnou podepisovaného dokumentu mým tajným klíčem a tím vzniká můj podpis. Kdo si chce zkontrolovat, že jsem to podepsal já, dešifruje můj podpis pomocí mého veřejného klíče a výsledný kontrolní součet srovná se skutečným kontrolním součtem dokumentu.

K šifrování a podepisování popsanou metodou slouží program gpg, viz man gpg. Tento text se ovšem věnuje programu ssh, takže považujte předchozí dva odstavce jen jako nezbytný úvod k pochopení problematiky.

Kontrola autentity programem ssh se také opírá o dvojici klíčů, tedy o asymetrickou šifru. Stroj B vygeneruje náhodný text (který zná jen on sám, tzv. oplatek) a zašifruje jej veřejným klíčem uživatele (klíč je v souboru $HOME/.ssh/authorized_keys na stroji B). Tajný klíč je na stroji A v souboru $HOME/.ssh/id_rsa resp. $HOME/.ssh/id_dsa. Zašifrovaný oplatek pošle stroj B stroji A. Stroj A dešifruje oplatek tajným klíčem uživatele a pošle zpět stroji B. Stroj B jej zkontroluje s originálem a pokud to sedí, má jistotu, že stroj A je pro něj důvěryhodný, neboť je majitelem tajného klíče. Samozřejmě oplatek je na jedno použití a při novém spojení program generuje jiný oplatek.

Matematické pozadí asymetrické šifry, jmenovitě protokolu RSA, je například popsáno v textu k přednášce Velebil: Diskrétní matematika v odstavci 3.5.

Program ssh používá symetrickou šifru na mnoha úrovních. Jinou dvojicí veřejný-tajný klíč kontroluje, zda server B je skutečně serverem B, tj. zda nedošlo k podvržení serveru na cestě internetem od A do B (zda nedošlo k tzv. middle-man útoku). Při každém spojení ssh pro tyto účely udělá toto: na stroji A generuje oplatek a šifruje jej veřejným klíčem stroje B, který je uložen v $HOME/.ssh/known_hosts a šifru pošle stroji B. Stroj B má za ukol dešifrovat oplatek svým tajným klíčem (stroje, ne uživatele). Ten je uložen v /etc/ssh/ssh_host_protokol_key. Stroj B tedy oplatek dešifruje a pošle zpět. Stroj A tím zjistí, zda komunikuje skutečně se strojem B a ne s něčím podvrženým.

Kontrolní otázka: mohou všichni uživatelé stroje B číst soubory /etc/ssh/ssh_host_protokol_key? Odpovězte si sami a pak se podívejte, jak je to uděláno např. na newtonovi.

Další úroveň použití symetrické šifry v ssh je pro šifrování veškeré komunikace. Oba stroje si pro každé spojení vygenerují přechodné dvojice veřejný-tajný klíč, které používají k šifrovaní (veřejným klíčem druhé strany) a dešifrování (tajným klíčem po přijetí zprávy). Veřejné části těchto klíčů si stroje mezi sebou na začátku spojení vymění. Pro jistotu je při výměně šifrují. Čím je šifrují uhodne asi už čtenář sám.

K dalšímu studiu doporučuji man ssh, man sshd, man ssh-keygen, man ssh-agent, google a dokumentace k ssh na internetu.


Hlavní stránka