Cvičení v 9. týdnu

Secure shell, vzdálené připojení, tunelování portů


Secure shell (SSH), vzdálené připojení
Secure shell je systém pro interaktivní (login) i neinteraktivní (vzdálené spouštění procesů) připojování ke vzdáleným počítačům. Slouží jako náhrada programů telnet, rlogin a rsh. Navíc poskytuje plně zabezpečenou komunikaci mezi počítači přes potenciálně nebezpečnou síť. Také umožňuje zabezpečení X11 spojení aplikací X-Windows (X-tunel) i libovolných jiných TCP/IP spojení. Secure shell (SSH) pracuje na principu klient-server. Serverovou část zajišťuje neustále běžící démon sshd, klientem je program ssh. Součástí instalace systému SSH je také program scp, který využívá SSH spojení ke vzdálenému kopírování souborů s využitím všech bezpečnostních principů SSH.

SSH ke své činnosti používá šifrovací metodu s asymetrickým šifrovacím klíčem - tzn. že k zašifrování zprávy je třeba jiná informace (šifrovací klíč) než ke zpětnému dešifrování (dešifrovací klíč). Dále platí, že ze znalosti šifrovacího klíče nelze snadno určit dešifrovací klíč. Šifrovací klíč se obvykle označuje jako veřejný, zatímco dešifrovací se nazývá privátní. Veřejný klíč, na rozdíl od privátního, bývá obecně veřejně přístupný, sdílen po síti a není předmětem tajemství. Nesymetrické šifrování se používá ke dvěma základním účelům:

Asymetrické šifry se v SSH většinou nepoužívají přímo k přenosu dat, ale slouží jednak k ověření identity a jednak k tomu aby si oba počítače bezpečně vyměnily šifrovací klíče "obyčejné", tj. symetrické šifrovací metody, kterou budou používat pro šifrování dat. Dohodnutý klíč je většinou hodně dlouhý, symetrická šifrovací metoda je výpočetně rychlá a bezpečná. Oba počítače si dokáží bezpečně dohodnout klíč symetrické šifry, ikdyž o sobě nic nevědí a neustále je někdo odposlouchává. Problém by mohl způsobit jen útočník, který jejich vzájemnou komunikaci průběžně pozměňuje. Takový útok lze detekovat jen pomocí asymetrické šifrovací metody a jen v tom případě, pokud oba počítače vzájemně znají své veřejné šifrovací klíče. Autentizace:

Po připojení na vzdálený počítač pomocí SSH si oba komunikující procesy nejprve dohodnou společnou šifrovací metodu, pomocí asymetrických klíčů si vymění pracovní symetrické klíče a těmi pak zašifrují veškerou další komunikaci.

V této fázi porovnává klient veřejný klíč serveru s jemu známou databází veřejných klíčů (soubor ~/.ssh/known_hosts) a tím ověřuje identitu serveru - vyloučí možnost, že se za server vydává někdo jiný.

Následně server ověřuje totožnost přihlašovaného uživatele. K dispozici má několik způsobů ověření, nejčastěji se používá RSA klíč uživatele nebo uživatelské heslo.

Pokud má uživatel (klient) svůj vlastní pár (veřejný+privátní) klíčů (tj. privátní ~/.ssh/id_rsa a veřejný ~/.ssh/id_rsa.pub) a takto označený uživatel je pro server nastaven jako důvěryhodný (tím, že tento veřejný klíč byl zkopírován na server do souboru ~/.ssh/authorized_keys), pak server použije uložený klíč k ověření, že jde skutečně o daného důvěryhodného uživatele a přístup okamžitě povolí.

Pokud nelze ověřit totožnost uživatele klíčem, ani jiným způsobem (viz man ssh), zeptá se server na heslo, podobně jako to dělá program telnet, jen s tím rozdílem, že heslo nikdy necestuje sítí nezašifrované, neboť server s klientem již tou dobou komunikují zašifrovaným kanálem.

Generování klíčového páru (ať už pro počítač či pro uživatele) se provádí utilitou ssh-keygen, která uloží privátní klíč do souboru ~/.ssh/id_dsa a veřejný klíč do souboru ~/.ssh/id_dsa.pub v uživatelově domovském adresáři. K dosažení bezpečnosti je třeba vždy dodržet ochranu privátního klíče, tak aby nebyl přístupný cizím osobám/uživatelům ani důvěryhodným administrátorům jiných serverů. Novější verze 2 SSH umí použít nejen asymetrickou šifrovací metodu RSA jako verze 1, ale volitelně i další metody (DSA).

Jak "připravit" SSH pro RSA autentizaci
Uživatel nejprve zvolí šifrovací metodu (dopor. DSA) a na svém klientském počítači pomocí programu ssh-keygen -t dsa vytvoří pár klíčů.

	$ ssh-keygen -t dsa
Tento příkaz vygeneruje klíčový pár o délce 1024 bitů. Délka klíče se pro program ssh-keygen definuje přepínačem -b. Minimální délka je stanovena na 512 bitů, za bezpečnou se dnes považuje délka minimálně 1024 bitů.

Poté je potřeba veřejnou část (~/.ssh/id_dsa.pub) přenést na server, např. pomocí SSH s ručním zadáním hesla. Obsah souboru (jediná dlouhá řádka) se přidá na konec souboru ~/.ssh/authorized_keys v domovském adresáři uživatele na serveru. Pozor, soubory v .ssh adresáři musí mít taková práva, aby je nebylo možné zneužít.

	client$ scp .ssh/id_dsa.pub server:mujklic.pub
	password: zadá heslo
	client$ ssh server
	password: zadá heslo
	server$ cat mujklic.pub >> .ssh/authorized_keys
        server$ exit
	client$ ssh server					# test přístupu bez hesla
	server$							# podařilo se...

Úkol 1: Na vašem hostitelském počítači si vytvořte si vlastní pár šifrovacích klíčů. Přeneste veřejný klíč na virtuální počítač FC4 a přidejte na konec souboru /root/.ssh/authorized_keys. Ověřte, zda je možné se přihlašet bez hesla jako uživatel root.

Úkol 2: Vytvořte jiný pár klíčů na virtuálním stroji. Přeneste klíče na hostitelský počítač a vložte na konec souboru ~/.ssh/authorized_keys. Ověřte, že se můžete přihlašet z virtuálního stroje na váš počítač bez zadávání hesla.

Úkol 3: Zjistěte, zda-li se můžete přihlašet bez dalšího nastavování z vašeho virtuálního stroje bez zadání hesla na počítač sunray1. Výsledek promyslete a zdůvodněte!

Úkol 4: Povolte RSA přihlašování z vašeho hostitelského počítače zpět na váš hostitelský počítač. Mezi jakou skupinou počítačů je nyní možné se vzájemně hlásit bez hesla?

Tunelování protokolu X11
Pokud při přihlašování na vzdálený počítač použijete přepínač -X, pak SSH démon na protější straně provede autentizaci a kromě spuštění vašeho login shellu začne poslouchat na portu 6010 a současně nastaví proměnnou DISPLAY na hodnotu localhost:10. Grafické aplikace spuštěné na vzdáleném počítači pak ke zobrazování svých oken používají X-server s adresou localhost a pořadovým číslem 10. Jednotlivé X-servery normálně poslouchají na TCP portu 6000 + pořadové číslo serveru. V tomto případě navazují spojení na otevřený port SSH démona, který spojení přijme a všechna data transportuje šifrovaným kanálem k lokálnímu X-serveru, kde se SSH klient chová jako X-klient zobrazující svá okna.

Úkol 5: Spusťte grafický program /usr/openwin/demo/xeyes z počítače sunray1. Seznam otevřených datových kanálů jdoucích skrz vaše SSH spojení získáte klávesovou zkratkou ~#. Všiměte si rozdílu v nastavení proměnné DISPLAY na lokálním a na vzdáleném počítači.

Úkol 6: Připojte se postupně na počítač sunray1 a z něho na sunray2. Předávání X-protokolu lze řetězit. Nyní, grafická aplikace (dtpad) spuštěná na počítači sunray2 předává žádosti o grafické vykreslování skrz druhé SSH spojení na počítač surnay1, kde se žádosti dešifrují, aby se hned zase zašifrovaly a prvním SSH kanálem se předaly na lokální počítač. Zobrazte si nastavení proměnných DISPLAY podél celé cesty. Otevřená síťová spojení na počítačích sunray můžete vypisovat příkazem netstat -n.

Tunelování portů
SSH umožňuje provádět tunelování (forwarding) TCP/IP portů. To znamená, že spojení, které by jinak bylo provedeno nechráněně, je přesměrováno do zabezpečeného SSH kanálu a na druhé straně SSH serverem předáno na požadovaný port.

Experiment I - zpřístupnění vzdáleného zdroje
Použijeme techniku forwardování portů k vytvoření bezpečného kanálu mezi prohlížečem a webovským serverm, který přijímá pouze požadavky z hostitelského počítače, na kterém běží jeho virtuální stroj.
Pracujte ve dvojicích. Na vzdáleném virtuálním stroji (tj. u vašeho kolegy) spusťte web server. Z vašeho počítače nemáte přístup na web server virtuálního stroje vašeho kolegy, protože celý vyrtuální stroj je za firewallem blokujícím přístup překladem adres.
Web server si zpřístupníte, pokud se na vzdálený hostitelský počítač přihlásíte příkazem:
ssh -L 8000:10.0.6.1:80 vzdalenePC
Pro každé TCP spojení navazované na váš počítač na port 8000 se vytvoří nový datový tok šifrovaným kanálem na protější počítač, odkud budou data pokračovat jako obyčejné TCP spojení na IP adresu 10.0.6.1 port 80, což je adresa webového serveru na virtuálním stroji vzdáleného počítače. Pokud ve vašem prohlížeči vypnete proxy a zadáte adresu http://localhost:8000, získáte obsah web serveru běžícího na virtuálním stroji vzdáleného počítače. Ověřte!

Zobecnění:
$ ssh -L local_port:dest_host:dest_port servername
Příkaz znamená, že veškerá příchozí spojení na lokální port local_port jsou bezpečně přenášena na SSH server servername a z něho předávána pomocí odchozího TCP spojení na počítač dest_host port dest_port.

Experiment II - zpřístupnění lokálního zdroje
Ten samý zdroj (web server) lze zpřístupnit témuž klientovi i tehdy, pokud se hlásíte SSH spojením jdoucím ze vzdáleného stroje směrem k vám. Nejprve ukončete SSH spojení s parametrem -L. Váš spolupracující kolega pak provede přihlášení z jeho počítače na váš počítač, příkazem:
ssh -R 8000:10.0.6.1:80 vasePC
Váš web prohlížeč by měl opět fungovat.

Zobecnění:
$ ssh -R remote_port:dest_host:dest_port servername
Příkaz znamená, že veškerá příchozí spojení na port remote_port vzdáleného počítače servername jsou bezpečně přenášena na SSH klienta a z něho předávána pomocí odchozího TCP spojení na počítač dest_host port dest_port.

Experiment III - využití tunelování ke zpřístupnění webu
Pokud jste na síti, kde nemáte přístup na web, ale můžete navázat SSH spojení na školní počítače, můžete si web zpřístupnit příkazem:
ssh -L 3128:147.32.80.9:80 sunray1
Ve vašem prohlížeči si pak nastavíte server PROXY na adresu localhost port 3128. Zdůvodněte, proč lze pak prohlížeč použít bez jakéhokoli omezení.

Pokud si chcete pro účely experimentování vytvořit stroj se zablokovaným web přístupem, použijte virtuální stroj FC4, na kterém provedete příkaz
iptables -I OUTPUT -p tcp --dport 80 -j REJECT
který zablokuje odchozí web spojení. SSH port forwarding zákaz obejde.