Bezpečné připojení ke vzdáleným serverům

SSH je populární protokol pro bezpečné přihlašování do vzdálených systémů. Stejnojmenný program byl prvním širo...


SSH je populární protokol pro bezpečné přihlašování do vzdálených systémů.
Stejnojmenný program byl prvním široce dostupným produktem, který pro tento
účel implementoval "silné" šifrovací a ověřovací algoritmy. V následujícím
textu se věnujeme fenoménu SSH především s ohledem na operační systémy
unixového typu.
Program SSH (nebo přesněji řečeno protokol, který implementuje) se skládá ze
dvou základních funkčních částí. První se stará o ověření totožnosti uživatele
předtím, než je vpuštěn na vzdálený systém. Druhá potom provádí šifrování dat
přenášených mezi místním a vzdáleným počítačem a zajišťuje tak uživatelovo
soukromí a ochranu dat. Tato druhá součást je pro uživatele vcelku
transparentní a málokdy je třeba ji nějak konfigurovat či jinak ovlivňovat.
Autentizační část SSH je ovšem mnohem složitější a pro skutečnou bezpečnost
mnohem podstatnější část. Řada uživatelů z neznalosti skončí u autentizace
prostým heslem, čímž nijak nevyužije možnosti, které SSH v tomto směru nabízí.
Řekněme si proto o ověřování (autentizaci) v SSH něco více.

Architektura protokolu SSH
Protokol SSH pracuje v režimu klient--server. Počítač, který zahajuje SSH
spojení, se stává klientem, zatímco serverem je počítač, na který se chceme
bezpečně připojit. Toto rozdělení existuje i ve vlastním programu SSH, který
uvedený protokol implementuje: klientem je program ssh(1), zatímco server se
jmenuje sshd(8) a běží jako démon.

Ověřování algoritmem RSA
Nejsilnější ověřovací metodou, kterou SSH nabízí, je RSA šifrovací algoritmus
spadající do skupiny algoritmů s veřejným klíčem (nebo, jinými slovy, náleží
mezi asymetrické šifrovací systémy). Jeho činnost spočívá v existenci dvou
vzájemně komplementárních klíčů, tajného a veřejného, které dokáží rozšifrovat
šifru vyprodukovanou pomocí svého příslušného protějšku.
Máme-li tedy k dispozici RSA pro šifrování, můžeme ověřit svého partnera pomocí
metody challenge-response (česky "výzva-odpověď"). Potřebujeme k tomu mít jeho
veřejný klíč pokud ho máme, postup vypadá následovně:
Vygenerujeme náhodný řetězec nebo číslo. Tento řetězec zašifrujeme pomocí
veřejného klíče svého partnera, jehož totožnost chceme ověřit, a získaný
zašifrovaný řetězec mu předáme.
Ověřovaný partner pomocí svého tajného klíče zašifrovaný řetězec rozšifruje a
získaný otevřený text nám zašle zpět.
Řetězec získaný od ověřovaného partnera porovnáme s tím, který jsme mu sami
odesílali a který jsme generovali v bodě 1. Pokud se tyto dva řetězce shodují,
znamená to, že veřejný klíč, který jsme použili, je skutečně příslušný tajnému
klíči partnera.
Popsaný postup je jádrem vysoce bezpečného ověřování, které protokol SSH
umožňuje. Je zajímavé, že ačkoliv je RSA šifrovací algoritmus, v SSH se používá
pouze pro autentizaci a výměnu klíčů pro konvenční šifrovací algoritmy, které
se používají k vlastnímu šifrování komunikace (např. IDEA, TripleDES,
Blowfish). Bylo by sice možné použít ho i pro vlastní šifrování RSA, ale
ukazuje se, že to není příliš výhodné a že výše uvedené algoritmy jsou pro
tento účel vhodnější a často i bezpečnější.

Ověření serveru
Mohlo by se zdát, že totožnost bude ověřovat jenom server, na který se klient
připojuje, předtím, než mu spojení umožní. Vždyť přece nebezpečí neoprávněného
přístupu hrozí jemu! To ale není tak docela pravda ohrožen může být i klient.
Představme si útočníka, který chce zjistit naše heslo: ten může udělat to, že
připraví falešný server, který se bude tvářit stejně jako pravý a nějakým
způsobem na něj přesměruje naše spojení. My, nic zlého netušíce, odešleme
falešnému serveru naše heslo a to je právě to, o co útočníkovi šlo. S naším
heslem v rukou se nyní může připojit na původní, pravý server a přihlásit se na
něj.
Tato možnost podstrčení falešného cíle (v praxi uskutečnitelná např. metodami
IP spoofingu) znamená jediné než se klient pokusí autentizovat, je nutné, aby
nejdříve on ověřil pravost serveru, na který se snaží připojit. V protokolu SSH
je k tomuto ověření použit algoritmus RSA ve spojení s challenge-response, jak
jsme si obojí popisovali výše. Každý SSH server má proto pár tajný/veřejný klíč
(obvykle v souborech /etc/sshd/ssh_host _key a ssh_host_key pub). Z tohoto
způsobu ověřování ovšem vyplývá potřeba, aby klient měl k dispozici veřejný
klíč serveru. V praxi se tento problém řeší tak, že SSH klient si veřejný klíč
sám stáhne ze serveru uživatel mu to ovšem musí výslovně dovolit. Tato fáze je
z hlediska bezpečnosti kritická pokud by útočník v tento okamžik stál mezi
klientem a serverem a dokázal zachytit stahovaný klíč a klientovi místo něj
poslat vlastní, mohl by provést již zmíněný útok typu "man-in-the-middle". Na
druhé straně, tento krok se děje pouze jednou při prvním navazování spojení s
daným serverem. Přesto, pokud chceme mít opravdu jistotu, musíme klientům
veřejné klíče distribuovat jinou cestou. To platí především při připojování se
na server, který je mimo náš dosah (přes Internet apod.).
A ještě poznámka pro úplnost: ve skutečnosti má server ještě jeden další klíč
server key, který posílá klientovi a ten jej používá zároveň s host key. Tento
server key je pravidelně automaticky přegenerováván, je udržován pouze v paměti
a je svázán s každou instancí SSH serveru sshd.

Ověření klienta
Když již nyní klient ví, že server, se kterým navázal spojení, je pravý,
nastává okamžik, kdy musí sám prokázat svoji totožnost serveru. SSH nabízí
několik způsobů:
Ověření pomocí hesla. Uživatel se prokazuje běžným heslem, jak je to zvykem u
rsh nebo Telnetu. Tato hesla jsou (na unixových platformách) ověřena způsobem
běžným na platformě serveru (obvykle soubor /etc/ passwd apod.). Tato hesla
jsou přes síť předávána v šifrované podobě nehrozí tedy jejich zachycení na
mezilehlé síti. Tento způsob je tedy velmi obdobný konvenčním programům jako je
Telnet, takže uživatelé ho snadno pochopí a použijí, přesto oproti nim nabízí
podstatné zlepšení bezpečnosti zabráněním posílání nešifrovaných hesel. Přesto
však běžná hesla mají své slabší stránky, kterými jsou hlavně uživatelé ti si
dávají hesla krátká, snadno odhadnutelná nebo odvoditelná. SSH proto jde dále.
Ověření pomocí RSA. Stejný způsob, jakým si klient ověří server, lze využít i
pro ověření opačné, tj. autentizaci klienta. Uživatel si pomocí programu
ssh-keygen vygeneruje pár tajný/veřejný klíč. Tajný klíč je uložen na klientské
straně v souboru ~/.ssh/ identity (standardně lze používat i více tajných klíčů
uložených ve více souborech, které je potom potřeba explicitně uvést jako
parametr). Veřejný klíč si uživatel uloží na serveru, na který se chce
připojovat do souboru ~/.ssh/authorized_keys). Při ověřování klienta potom
server provádí postup, který je analogický již dříve uvedenému ověřování
serveru klientem a je popsán výše.
Tento způsob ověřování je velmi robustní a pokud je správně použit, nabízí
vysokou míru zabezpečení. RSA klíče jsou totiž poměrně dlouhé (běžně 1 024
bitů) a protože jsou to náhodně generovaná čísla, nejsou zapamatovatelná a
snadno zcizitelná opsáním z obrazovky, odkoukáním z klávesnice apod. Další
výhoda RSA autentizace je spojená se souborem authorized_keys. V něm je totiž
možné určit některé další parametry spojení, jako je omezení na určité IP
adresy či doménová jména, omezení na spuštění přesně určeného programu atd.
Nevýhodou RSA autentizace je tajný klíč uložený na klientském systému. Tento je
totiž nezbytné zajistit před zcizením. Buď zajistíme jeho fyzickou
nepřístupnost (tj. k našemu počítači se nikdo jiný nedostane), nebo je potřeba
ochránit klíč pomocí hesla (v dokumentaci SSH se z psychologických důvodů
používá termín pass-phrase, který vede uživatele k používání delších hesel).
Tento způsob zajištění je naprosto nezbytný na sdílených systémech, kde (z
principu) existuje superuživatel, který má přístup ke všem datům na něm
uloženým, tedy i k našemu tajnému klíči.
Ověření pomocí souborů .rhosts nebo .shosts. Tento způsob využívá mechanismu
zavedeného programem rsh. Ten totiž umožňuje definovat ekvivalenci uživatelů
mezi systémy (servery). Tato ekvivalence se definuje na systému, na který se
připojujeme v souboru ~/.rhosts. Do něj se píší řádky ve tvaru počítač login.
Takový řádek určuje, že vypsaný uživatel uvedeného vzdáleného systému je shodný
s uživatelem, v jehož domácím adresáři se soubor .rhosts nachází. Takový
uživatel potom není ověřován pomocí hesla předpokládá se, že toto ověření již
provedl počítač, ze kterého se uživatel hlásí. Tento způsob ověření u rsh se
však nepovažuje za příliš bezpečný nabízí příliš mnoho možností pro
potenciálního útočníka.
U SSH však lze vzájemně ověřit identitu obou zúčastněných počítačů pomocí RSA
klíčů a tím odstranit problémy, které jinak s použitím principu ekvivalence
uživatelů souvisejí. Všimněte si ale, že ověření serveru v tomto případě
probíhá ve směru ke klientovi tj. opačně než v případě, kdy se klient ujišťuje
o identitě serveru. K tomuto ověření klient používá opět veřejný klíč serveru.
Uživatel, se kterým má na cílovém systému nastavenu ekvivalenci, není SSH
serverem dále žádným z výše uvedených způsobů ověřován. SSH používá stejný
soubor (.rhosts) jako rsh. To ovšem nemusí vyhovovat v případě, že chceme
zachovat službu rsh povolením .rhosts pro SSH bychom je zároveň povolili i pro
rsh, kde je ekvivalence uživatelů z podstaty nebezpečná. Proto SSH dovoluje
definovat ekvivalenci uživatelů i v souboru .shosts, který nekoliduje s rsh.
Pro úplnost dodávám, že ekvivalenci uživatelů lze definovat i globálně v
souborech /etc/hosts.equiv a /etc/ssh/ shosts.equiv). Tento způsob není tak
bezpečný jako ověřovaní pomocí uživatelského RSA klíče, nicméně může být
užitečný v uzavřených sítích, kde jsou bezpečnostní rizika menší.

Závěr
To byl tedy stručný přehled prostředků ověřování. Vynechali jsme řadu detailů,
ty lze snadno zjistit v dokumentaci SSH (především v manuálových stránkách pro
ssh(1) a sshd(8)). Výše uvedené principy platí pro původní implementaci SSH od
Tatu Ylonena, tj. SSH protokol verze 1. SSH protokol verze 2 obsahuje některé
menší změny. Tato nová verze protokolu byla navržena pro program SSH 2.x, který
ale není zcela volně šiřitelný. Proto byla skupinou vývojářů z okruhu okolo
projektu OpenBSD napsána volně šiřitelná verze s názvem OpenSSH. Tento program
implementuje obě verze protokolu a byl portován na většinu běžných operačních
systémů.
0 3360 / pen









Komentáře
K tomuto článku není připojena žádná diskuze, nebo byla zakázána.