Používání programů PuTTY ------------------------ Na cvičení věnovaném SSH mají studenti následující úkoly: - Přihlásit se na server bis.vse.cz pomocí SSH a hesla. - Vytvořit osobní dvojici soukromý/veřejný klíč, veřejný klíč nakopírovat na server a přihlásit se pomocí klíče. - Načíst soukromý klíč do paměti (pageant či ssh-agent) a přihlásit se pomocí klíče bez zadávání hesla. Zkopírovat soubory pomocí WinSCP. - Vyzkoušet tunely (lokální, vzdálený a dynamický). Studenti, kteří mají již se SSH předchozí zkušenosti, mají následující doplňkové úkoly: - Spuštění příkazu na serveru a uložení výsledku do souboru na lokálním počítači. - Vytvořit Jump host – přihlásit se z jednoho serveru na další server. V první části bude popsán postup řešení těchto úkolů za použití programů ``PuTTY`` pro operační systém Windows. Stručné řešení stejných úkolů z UNIXu či macOS, tj. používání programů ``ssh`` či ``ssh-keygen``, bude popsáno v :ref:`následující kapitole`. V příkladech budeme popisovat přístup na server bis.vse.cz s linuxovým operačním systémem Debian verze 9 (Debian Stretch), na kterém je spuštěn OpenSSH server. Principy a postupy zde uvedené jsou stejné i při přihlašování na jiné servery. SSH je k dispozici téměř pro každý unixový systém. SSH servery existují i pro další operační systémy včetně OS Windows. Konfigurační okno programu putty.exe ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ``PuTTY`` je skupina bezplatných aplikací pro emulaci terminálu, komunikaci přes síť (protokol SSH a nezabezpečené protokoly telnet či rlogin) či přes sériovou linku a pro přenos souborů. Autorem programu je Simon Tatham, softwarový inženýr z Anglie. Aktuální verzi si můžete stáhnout ze `http://www.chiark.greenend.org.uk/~sgtatham/putty/ `__. S verzí 0.62 a staršími se nemusíte přihlásit na servery, neboť chybí podpora delších prvočísel pro algoritmus Diffie-Hellman. Distribuce obsahuje šest programů: - ``PuTTY`` [18]_ (``putty.exe``) – hlavní program, SSH a Telnet klient s emulací terminálu. - ``PSCP`` (``pscp.exe``) – přenos souborů pomocí příkazové řádky. - ``PSFTP`` (``psft.exe``) – přenos souborů s ovládáním podobným jako mají FTP klienti. - ``Plink`` (``plink.exe``) – řádkový SSH klient, obvykle pro provedení jednoho příkazu na vzdáleném serveru. - ``Pageant`` (``pageant.exe``) – uchovává SSH klíče v paměti, ostatní programy poté využijí pro autentizaci. - ``PuTTYgen`` (``puttygen.exe``) – generování a správa SSH klíčů. Nejčastěji se používá terminálová emulace přes SSH protokol, pro program ``putty.exe`` je typické okno s černým pozadím a bílým písmem [19]_. Je to nejčastěji používaný SSH klient pro operační systém Windows, existuje i unixová verze. Po spuštění programu ``putty.exe`` se objeví konfigurační okno, ve kterém lze zadat parametry pro připojení k serveru. |image7| Okno se skládá z několika částí. Vlevo je panel *„Category“* pro konfiguraci parametrů budoucího připojení. V hlavní části nahoře se zadává cíl budoucího spojení (*Specify the destination you want to connect to*). Pod ní je správa sezení (sessions) – parametry spojení si můžete uložit (tlačítko *„Save“*) a příště je rychle použít pomocí dvojkliku na jméno sezení. Dole jsou čtyři tlačítka – nejdůležitější z nich je *„Open“*, které otvírá (dává příkaz k zahájení) komunikaci dle nastavených parametrů. Ve specifikaci cíle se do okénka *„Host Name“* zadává IP adresa, nebo doménové jméno serveru, ke kterému se chcete připojit. V okénku *„Port“* je již předpřipraveno číslo **22**, to je výchozí port SSH. Nicméně lze se setkat i se servery, které využívají jiný port. Nabídka *„Connection Type“* umožňuje vybrat způsob připojení, v našem případě použijeme předvolené SSH. První přihlášení na server bis.vse.cz, autentizace heslem ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Do okénka *„Host Name“* vyplníme jméno serveru **bis.vse.cz** a pomocí tlačítka *„Open“* zahájíme komunikaci. Po zahájení komunikace se autentizuje server – pokud jste se serverem ještě nekomunikovali, zobrazí se Vám otisk (fingerprint) veřejného klíče serveru a výzva na jeho ověření. |image9| Pokud klíči (otisku klíče) věříte, stiskněte tlačítko „Ano“ (či „Yes“) a putty si klíč uloží do registru mezi důvěryhodné klíče. Při dalších připojeních putty ověřuje, zda se klíč serveru nezměnil – pokud ne, tak se připojí bez dodatečných dotazů. Následně můžete získat dodatečné informace od serveru a jste vyzváni k zadání jména a hesla. |image8| Heslo můžete zadat třikrát, pokud se Vám ani jednou nepodaří zadat správné přihlašovací údaje, tak se SSH spojení ukončí. Pokud se úspěšně přihlásíte na server bis.vse.cz, uvítá vás příkazový řádek (shell) *bash*. |image10| Pokud vše proběhlo správně, ovládáte přihlášení na server pomocí hesla. Základy používání programu PuTTY, doporučená nastavení ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *Používání schránky pro kopírování textu z/do okna putty*. Program putty.exe podporuje v terminálovém okně kopírování do schránky a vkládání ze schránky. Ovládání se ale liší od běžných programů ve Windows. Kombinaci kláves ``Ctrl+C`` **nelze použít**, neboť tato kombinace se v UNIXu používá pro ukončení (kill) procesu. Ovládání z unixové grafické nadstavby X-Windows nebylo možné dlouhou dobu používat, neboť vyžaduje tři tlačítka na myši. Ve výchozím nastavení používá putty.exe v \ **terminálovém okně** následující kompromis: - Označení textu pomocí myši automaticky vloží text do schránky. - Obsah schránky se vloží do terminálového okna po stisknutí druhého (obvykle pravého) tlačítka myši. *Kontextové menu z horní lišty.* Po zobrazení terminálového okna klikněte druhým tlačítkem myši na horní lištu a zobrazí se Vám následující menu. |image11| Z nabízených možností nyní zdůrazním dvě nejčastěji používané: **Event Log** – log z navazování a změny parametrů SSH spojení. **Change Settings…** – můžete měnit parametry již vytvořeného spojení, např. volby pro terminálovou emulaci či přidávat/ubírat SSH kanály (viz kapitola 1.3.4). **Log** Vám pomůže při hledání problémů. Následuje log při úspěšném připojení pomocí klíče uloženého v pageant (viz kapitola 1.4.5): .. code-block:: none 2016-07-24 12:50:58 Looking up host "bis.vse.cz" 2016-07-24 12:50:58 Connecting to 2001:718:1e02:18::87 port 22 2016-07-24 12:50:58 We claim version: SSH-2.0-PuTTY_Release_0.67 2016-07-24 12:50:58 Server version: SSH-2.0-OpenSSH_6.7p1 Debian-5+deb8u2 2016-07-24 12:50:58 Using SSH protocol version 2 2016-07-24 12:50:58 Doing Diffie-Hellman group exchange 2016-07-24 12:50:58 Doing Diffie-Hellman key exchange with hash SHA-256 2016-07-24 12:50:58 Host key fingerprint is: 2016-07-24 12:50:58 ssh-rsa 2048 30:14:af:4b:64:89:4f:42:86:aa:92:63:.... 2016-07-24 12:50:59 Initialised AES-256 SDCTR client->server encryption 2016-07-24 12:50:59 Initialised HMAC-SHA-256 client->server MAC algorithm 2016-07-24 12:50:59 Initialised AES-256 SDCTR server->client encryption 2016-07-24 12:50:59 Initialised HMAC-SHA-256 server->client MAC algorithm 2016-07-24 12:50:59 Pageant is running. Requesting keys. 2016-07-24 12:50:59 Pageant has 1 SSH-2 keys 2016-07-24 12:50:59 Trying Pageant key #0 2016-07-24 12:50:59 Sending Pageant's response 2016-07-24 12:51:00 Access granted 2016-07-24 12:51:00 Opening session as main channel 2016-07-24 12:51:00 Opened main channel 2016-07-24 12:51:00 Allocated pty (ospeed 38400bps, ispeed 38400bps) 2016-07-24 12:51:00 Started a shell/command *Emulace terminálu* UNIX historicky podporuje různé terminály, které používají různé sekvence pro nastavení pozice kurzoru, pro volbu barvy textu či posílají různé sekvence na server při stisknutí funkčních kláves. Při vytvoření kanálu typu session s emulací terminálu putty posílá na server typ terminálu, a server dle tohoto typu interpretuje obdržené sekvence znaků a odesílá sekvence pro zobrazení v terminálovém okně programu putty.exe. **Typ emulovaného terminálu.** Program putty posílá typ *xterm* s podporou 16 barev. Pro připojení na linuxové servery doporučuji typ **putty-256color** či **xterm-256color**. Odesílaný typ terminálu se nastavuje v \ *Connection* -> *Data* -> *Terminal-type string*. Některé aplikace budou automaticky používat 256 barev, u jiných musíte upravit nastavení. **Změna barvy.** Text v modré barvě občas nebývá v černém okně putty k přečtení. Ve *Window* -> *Colours* měním odstín pro barvu *ANSI Blue*. **Klávesnice.** Pokud Vám v aplikaci nefungují správně některé funkční klávesy, zkuste v \ *Terminal* -> *Keyboard* změnit emulaci funkčních kláves na *Linux*. Panel s číslicemi a šipkami vpravo na klávesnici se používal jako aplikační panel – aplikace ke klávesám může přiřadit speciální význam a poté nelze vkládat číslice. To je v současnosti většinou matoucí a proto doporučuji v \ *Terminal* -> *Features* zatrhnout volbu **„Disable application keypad mode“.** Ve *Window* -> *Appearance* si můžete změnit font a velikost písma. **UTF-8.** Pokud se Vám chybně zobrazují české znaky či čáry, zkontrolujte ve *Window* -> *Translation*, že máte zvolenu znakovou sadu *UTF-8* a zatrženu volbu „\ *Use Unicode lie drawing code points”*. *Sezení (sessions) - uložení parametrů spojení.* Nastavené parametry spojení můžete uložit jako sezení (session) a příště dvojklikem na název snadno vytvořit spojení. Před stisknutí tlačítka **Save** pro uložení zadejte jméno sezení do políčka *Saved Sessions*. V sezení si můžete přednastavit i uživatelské jméno – vložte ho do adresy v poli *Host Name* ve formě: **login@bis.vse.cz.** Vygenerování klíčů v programu PuTTYgen ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Přihlašování pomocí hesla umožňuje jejich hádání útočníky. V logách serveru se často setkáte s velkým počtem neúspěšných přihlášení z různých částí světa. Nejčastěji se snaží uhádnout heslo pro uživatele ``root`` (administrátorský účet v UNIXu), z toho důvodu bývá přihlašování přes SSH na účet ``root`` zakázáno či omezeno na přihlášení pomocí klíče. Přihlašování pomocí klíče je **bezpečnější**, neboť: - Entropie hesel se pohybuje mezi 30 a 50, u klíčů se entropie odhaduje na 120 a výše. Útočníci nemají reálnou šanci uhodnout klíč. - Klíče jsou bezpečné vůči některým útokům obvyklým u hesel. Uživatel si klíče neopisuje na papír, není schopen je někomu sdělit na potkání, samotné sledování klávesnice kamerou nevede ke kompromitaci klíčů. - Na serveru je uložen pouze veřejný klíč. Kompromitace serveru nevede k prozrazení soukromého klíče. Privátní klíč neopouští klientský počítač – nehrozí zcizení při přenosu po síti. Přihlašování pomocí klíče podporuje většina SSH aplikací a SSH serverů [20]_. SSH klíč se obvykle využívá *pouze* pro přihlašování (autentizaci) [21]_. Uživatel si musí nejdříve vygenerovat dvojici soukromý/veřejný klíč. vytvořit. Pro generování a správu klíčů je součástí PuTTY program ``PuTTYgen``. |image12| Po spuštění programu PuTTYgen si můžete zvolit typ klíče a jeho délku. Nejvhodnější je použít předvolenou možnost – generovat RSA klíče pro verzi 2 protokolu SSH o délce 2048 bitů. Následují pravidla pro výběr klíčů. - **RSA / SSH-2 RSA** – nejvhodnější. Lze zadat i jinou délku klíče – volte hodnoty 2048 či 4096. Kratší či delší nemusí být na některých serverech podporovány. - **ECDSA** - některé starší servery nemusí podporovat. - **ED25519** - některé starší servery nemusí podporovat. - **DSA** NEPOUŽÍVAT – od verze 7 programu OpenSSH přestávají být podporovány [22]_. - **SHA-1 (RSA)** NEPOUŽÍVAT – první verze protokolu SSH není bezpečná a prakticky se s ní již nesetkáte. Po stisknutí tlačítka „\ *Generate“* se vygeneruje pár klíčů. Pro generování jsou potřeba náhodné hodnoty – jedním ze vstupu je pohyb kurzoru myši nad aplikací ``PuttyGEN``. |image13| Po vygenerování je vhodné upravit komentář (Key comment), neboť při používání více klíčů Vám datum vygenerování příliš nepomůže. Doporučuji uvést vlastní e-mailovou adresu a účel, např. ``pavlicek@vse.cz github``. Soukromý klíč je silně doporučeno chránit heslovou frází [23]_, neboť jinak může nezvaný návštěvník Vašeho počítače snadno zneužít Váš soukromý klíč. Heslová fráze se zadává do polí „\ *Key passphrase*\ “ a „\ *Confirm passphrase*\ “. Pomocí tlačítka „\ *Save private key*\ “ uložíte soukromý i veřejný klíč do souboru s koncovkou ``.ppk``. Samotné uložení veřejného klíče je zbytečné a spíše matoucí, neboť vytvořený soubor nemá smysluplné využití. V programu PuTTYgen můžete též otevřít existující soubor se soukromým klíčem a poté např. změnit heslovou frázi. Lze též importovat soukromý klíč vygenerovaný v UNIXu či exportovat soukromý klíč z PuTTY do formátu používaném v UNIXu. Přihlašování pomocí klíčů ~~~~~~~~~~~~~~~~~~~~~~~~~ Uživatel musí svůj veřejný klíč umístit na server, v UNIXu se obvykle zapisuje do souboru ``authorized_keys`` v podadresáři ``.ssh`` domovského adresáře uživatele (cesta k souboru se zapisuje jako ``~/.ssh/authorized_keys``). Veřejný klíč ve formátu pro server je zobrazen v programu ``PuTTYgen`` v okénku nahoře, odkud jej lze zkopírovat do schránky. Před přihlášením musíte programu putty.exe zpřístupnit soukromý klíč. Existují dvě možnosti: - Do konfigurace spojení napíšete jméno souboru se soukromým klíčem. Při každém připojení musíte zadat heslo k soukromému klíči. |image14|\ |image15|\ - Soukromý **klíč nahrajete do paměti do programu pageant**. Program putty.exe poté automaticky vyzkouší přihlášení pomocí všech soukromých klíčů v paměti. Heslo k soukromému klíči zadáváte pouze jednou při jeho nahrání do paměti. .. image:: ./media/ssh_image33.png :width: 2.3125in :height: 1.88125in :align: right Použití programu **pageant.exe** je jednoduché – spustíte ho, přidáte klíč a poté se v putty.exe přihlásíte na server. Spuštění a přidání klíče – *kliknete na soubor s koncovkou .ppk* (při instalaci se program pageant.exe přiřadí k souborům s koncovkou .ppk). Spustí se aplikace a zeptá se na heslo k soukromému klíči. Po spuštění se vytvoří ikona v oznamovací oblasti Windows, kde přes kontextové menu můžete prohlížet a přidávat klíče. .. image:: ./media/ssh_image35.png :width: 1.90625in :height: 2.68681in :align: right V kontextovém menu jsou i volby pro spuštění putty.exe s novou konfiguraci (*New Session*) či s existujícím uloženým sezením (*Saved Sessions*). V uložených sezeních by mělo být uživatelské jméno – jinak ho musíte při přihlašování zadat. Nahrání klíčů do programu pageant je preferovaná a pohodlnější cesta s bezpečnostním rizikem – když opustíte přihlášený počítač, tak si kdokoliv může sednout za Vaši klávesnici a přihlásit se na vzdálený server jako Vy. Opatření je jednoduché – *při každém odchodu od klávesnice počítač uzamknout*. Ve Windows pomocí kombinace ``Win+L`` či pomocí kombinace ``Ctrl+Alt+Del`` a následně vybrat z nabídky volbu ``Uzamknout``. Kopírování souborů přes SSH ~~~~~~~~~~~~~~~~~~~~~~~~~~~ V SSH jsou dva protokoly pro kopírování souborů – protokol **scp** a protokol **sftp**. V PuTTY jsou dva odpovídající řádkové programy: **pscp.exe** a **psftp.exe**. Program **pscp** má podobnou syntaxi jako příkaz ``cp`` pro kopírování souborů v UNIXu – při spuštění musíte zadat zdroj i cíl kopírování, poté se soubor či soubory zkopírují a program skončí. V následujících ukázkách se předpokládá klíč v paměti (pageant). .. code-block:: bash :emphasize-lines: 2,4 # zkopírování soubor seznam ze serveru bis.vse.cz do lokálního adresáře pscp pavlicek@bis.vse.cz:seznam . # zkopírování adresáře obrazky na server bis.vse.cz do domovského adresáře pscp -r obrazky pavlicek@bis.vse.cz: Program **pstfp** emuluje chování programu ftp – vytvoříte spojení se serverem a poté se Vám zobrazí prompt ``psftp>`` pro zadávání příkazů. .. code-block:: bash :emphasize-lines: 1 psftp pavlicek@bis.vse.cz Using username "pavlicek". Remote working directory is /home/pavlicek psftp> help ! run a local command bye finish your SFTP session cd change your remote working directory chmod change file permissions and modes close finish your SFTP session but do not quit PSFTP del delete files on the remote server dir list remote files exit finish your SFTP session get download a file from the server to your local machine help give help lcd change local working directory lpwd print local working directory ls list remote files mget download multiple files at once mkdir create directories on the remote server mput upload multiple files at once mv move or rename file(s) on the remote server open connect to a host put upload a file from your local machine to the server pwd print your remote working directory quit finish your SFTP session reget continue downloading files ren move or rename file(s) on the remote server reput continue uploading files rm delete files on the remote server rmdir remove directories on the remote server psftp> Pohodlnější je pro kopírování souborů používat grafický program **WinSCP**\ [24]_, který má buď dvou panelové ovládání obdobně jako Total Commander (Midnight Commander) či jeden panel podobně jako průzkumník ve Windows. Tvorba tunelů a přesměrování portů ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Protokol SSH není omezen na sezení s terminálovým oknem či na přenos souborů. Lze jej využít ke komunikaci programů prostřednictvím vytvořeného bezpečného kanálu. To se v praxi používá k: - obejití firewallu prostřednictvím bezpečného tunelu, - zašifrování komunikace, která jinak šifrování nepodporuje. Oba případy se vzájemně doplňují, oba používají schopnost **přesměrování portů** (**port forwarding**) SSH. Přesměrování portů lze nastavit při připojení, i v průběhu jíž navázaného spojení. V putty.exe se přesměrování nastavuje v záložce *Connection* -> *SSH* -> *Tunnels* . |image18| Existují čtyři základní druhy přesměrování: - | **Lokální (Local, Forward) tunel** zpřístupní jinak nepřístupný vzdálený TCP server pro lokální klienty. | Např. MySQL databáze není dostupná z Vašeho domácího počítače, tak vytvoříte tunel se vstupem na lokální stanici (např. port 7000) a cílem v MySQL databázi (port 3306) na serveru. A poté na stanici spustíte MySQL klienta, který připojíte na lokální port 7000. SSH tunel TCP rámce přenese na port 3306 MySQL databáze a zpět klientovi doručí TCP odpovědi. | Tunel může končit na jiném interním serveru – spojení ze SSH serveru k internímu serveru není šifrováno. - | **Vzdálený (Remote, Reverse) tunel** zpřístupní informace pro vzdálený server. Vytvoříte SSH spojení na server a v něm tunel, jehož vstupní port bude na serveru a cíl bude na lokální stanici či v síti lokální stanice. | Server bis.vse.cz má blokován přístup na Internet a Vy se z něho chcete přihlásit na server telehack.com na port 23. Ze své stanice vytvoříte tunel, který otevře vstupní port 6000 na serveru bis.vse.cz a cíl bude na serveru telehack.com na portu 23. Poté na serveru bis.vse.cz spustíte program telnet s cílem localhost:6000. - **Dynamický (Dynamic, Proxy)** zobecňuje lokální tunely – aplikace si sama může určit cílový server a port. Pro zadání cíle musí aplikace podporovat protokol SOCKS 5. Ve webových prohlížečích podpora většinou je, v mnoha jiných aplikacích chybí. - **X11 (X11 forwarding)** – na serveru spustíte grafickou aplikaci a vlastní grafické okno se zobrazí na lokálním počítači. Stisky kláves a pohyby myši se přenášejí z lokálního počítače do grafické aplikace na serveru. Na lokálním počítači musíte mít spuštěn tzv. ``X-Server`` – aplikaci, která umí zobrazovat grafiku z grafických unixových aplikací. Příkladem takové aplikace může být VcXsrv Windows X Server [25]_, která využívá X11 tunely vytvořené pomoci PuTTY. Jinou možností je aplikace MobaXterm [26]_, která v sobě integruje X-Server se SSH klientem. Lokální tunel +++++++++++++ V obou příkladech na lokální tunel budeme přistupovat na databázi MySQL (TCP port 3306). V prvním případě poběží na serveru bis.vse.cz, ve druhém případě na serveru kitscm.vse.cz. |image19| Tunel se nastavuje v záložce *Connection* -> *SSH* -> *Tunnels* – zdrojový port (*Source port*) bude 7000, cíl (*Destination*) bude localhost:3306, necháte předvolený lokální (*Local*) tunel a automatickou volbu protokolu. Poté přidáte (*Add*) tunel do seznamu (*Forwarded ports*). Pro připojení k mysql databázi na serveru kitscm.vse.cz bude cíl kitscm.vse.cz:3306. |image20| Jaký volit lokální port? Nesmí být již obsazen [27]_. Nelze vytvořit tunel na obsazené číslo lokálního portu. Obvykle se volí čísla portů nad 1024, vhodné je volit ještě o kus dále, neboť mnohé nižší porty jsou přiřazeny ke známým službám. Jméno cíle se vyhodnocuje na vzdáleném konci tunelu. Většinou to nepředstavuje komplikace, výjimkou je jméno localhost, které se převádí na IPv4 adresu 127.0.0.1. Tato adresa existuje na každém počítači s podporou protokolu IPv4 [28]_, localhost na notebooku je jiný než localhost na serveru bis.vse.cz. Nejčastější chybou je nestisknutí tlačítka **Add** pro přidání návrhu do seznamu tunelů. V logu (``Event Log``) si můžete zkontrolovat, že se tunel vytvořil. |image21| Pokud máte na stanici nainstalovaného řádkového klienta, tak se na mysql server připojíte následujícím příkazem .. code-block:: bash :emphasize-lines: 1 mysql --host localhost --port 7000 --user abcd01 --password V grafických klientech je to podobné [29]_. Na tunelované komunikaci s MySQL serverem si ukážeme, jak se v posílané zprávě mění adresy a porty. MySQL klient spuštěný na notebooku posílá tcp datagram s následujícími parametry: .. code-block:: text Zdrojová IP adresa: 127.0.0.1 Cílová IP adresa: 127.0.0.1 Zdrojový TCP port: náhodný, např. 37256 Cílový TCP port: 7000 Datagram převezme SSH klient, který ve vytvořeném kanálu SSH spojení na druhou stranu pošle data z TCP datagramu. Na druhém konci vytvoří následující TCP datagram: .. code-block:: text Zdrojová IP adresa: 146.102.18.87 (bis.vse.cz) Cílová IP adresa: 146.102.18.2 (kitscm.vse.cz) Zdrojový TCP port: náhodný, např. 56102 Cílový TCP port: 3306 Důsledkem je, že server kitscm.vse.cz si myslí, že spojení na MySQL databázi vzniklo na bis.vse.cz a o SSH tunelování a notebooku nic neví. Vzdálený (remote) tunel +++++++++++++++++++++++ Vzdálené (remote, reverse) přesměrování portů si ukážeme na přístupu z bis.vse.cz ke službě telnet (port 23) na serveru ``telehack.com``. Server bis.vse.cz má blokovaný přístup mimo školu a z toho důvodu příkaz ``telnet telehack.com 23`` nebude úspěšný. |image22| Notebook má přístup na server telehack.com a tak pouze nastavíme vzdálený tunel v putty. V konfiguraci nastavíme zdrojový port ``8000``, cílem bude ``telehack.com:23`` a pod tím vybereme typ ``Remote``. Opět nezapomenout na tlačítko **Add**. .. todo:: Doplnit snímek s konfigurací remote tunelu v putty Po vytvoření tunelu se k portu 8000 mohou připojit všichni uživatelé přihlášení na bis.vse.cz pomocí příkazu .. code-block:: bash :emphasize-lines: 1 telnet localhost 8000 |image24| Komunikace mezi notebookem a serverem telehack.com **šifrována není**. Nutno zdůraznit, že v případě vzdáleného přesměrování musíte zvolit zdrojový port, který není již na serveru použit. Pokud dva uživatelé použijí stejný zdrojový port, tak vznikne kolize [30]_. Zda se tunel vytvořil, zjistíte z logu putty.exe (Event Log). Dynamický tunel +++++++++++++++ V posledním příkladu vytvoříme dynamický tunel na portu 1000. |image25| Stačí vyplnit zdrojový port a typ Dynamic. |image23| Pouze některé aplikace podporují SOCKS proxy verze 5, příkladem mohou být webové prohlížeče [31]_. Obrázek 1‑29 ukazuje nastavení SOCKS proxy verze 5 ve firefoxu. |image26| Plink – připojení z příkazové řádky ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Součástí PuTTY je též program **plink.exe**, který umožňuje z příkazové řádky spustit příkaz na vzdáleném serveru. V následujícím příkladu spustím na serveru příkaz ``ls -l`` a výstup uložím do lokálního souboru pro další zpracování: .. code-block:: bash :emphasize-lines: 1 plink.exe pavlicek@bis.vse.cz "ls -l" > vypis.lst Program ``plink.exe`` též umí vytvořit tunel bez nutnosti otevírat terminálové spojení. Následují příkazy pro tunely z předchozí kapitoly. .. code-block:: bash :emphasize-lines: 1,2,3,4 plink -ssh -L 7000:localhost:3306 -N pavlicek@bis.vse.cz plink -ssh -L 7001:kitscm.vse.cz:3306 -N pavlicek@bis.vse.cz plink -ssh -R 8000:telehack.com:23 -N pavlicek@bis.vse.cz plink -ssh -D 10000 -N pavlicek@bis.vse.cz Hlavní využití programu plink.exe je v dávkových souborech či při spuštění z jiných programů. Např. HeidiSQL grafický program pro správu MySQL databáze vytváří ssh tunely pomocí programu plink.exe. Přihlašování skrz bastion ~~~~~~~~~~~~~~~~~~~~~~~~~ Není vhodné všechny servery vystavovat na Internet. Můžete vystavit pouze jeden server (**bastion**) a z něho se hlásit na ostatní servery. Existují dva základní přístupy – **řetězení** a **tunelování spojení**. V každém přístupu je více variant realizace. Řetězení je méně bezpečné. V logách na interním serveru je zapsáno, že se uživatel přihlásil z bastionu. Je potřeba projít i logy z bastionu, pro zjištění z jaké IP adresy se uživatel přihlásil. Řetězení serverů (SSH chaining) +++++++++++++++++++++++++++++++ Při řetězení serverů se z domova pomocí klíče přihlásíte na bastion a získáte shell (příkazovou řádku). Na bastionu spustíte program ``ssh`` a připojíte se na interní server. |image27| Při řetězení serverů musíte řešit autentizaci pro spojení z bastionu na interní server. Máte několik možností: - **Autentizace heslem**. Musí být povoleno. Při častějším připojování to začne uživatelům vadit. Je zde nebezpečí hádání hesel, byť jen od uživatelů s přístupem dovnitř sítě. - **Druhá dvojice klíčů**. Na bastionu vygenerujete další dvojici soukromý/veřejný klíč a veřejný klíč umístíte na server. Při vytváření spojení z bastionu zadáte heslo k soukromému klíči či nahrajete klíč do ``ssh-agent`` spuštěného na bastionu. - **Soukromý klíč nahrajete na bastion**. Na bastion zkopírujete svůj soukromý klíč z domácího počítače a na server umístíte svůj veřejný klíč. Podobně jako v předchozím případě musíte na bastionu zadat heslo k soukromému klíči. Toto řešení porušuje bezpečnostní pravidlo – jedna dvojice klíčů pro jeden účel. - | **Agent-forwarding**. Na domácím počítači máte soukromý klíč nahraný v agentovi (pagent, ssh-agent), veřejný klíč máte na bastionu. Stejný klíč zkopírujete i na interní server. Před vytvořením spojení na bastion zapnete v klientovi na domácím počítači ``agent-forwarding``. | |image32| | Součástí spojení na bastion poté bude vytvoření *virtuálního ssh agenta* na bastionu, který všechny požadavky na klíč přepošle agentovi na domácím počítači. Při vytvoření spojení z bastionu na interní server se díky forwardingu uživatel ověří na domácím počítači. | *Výhodou* je, že soukromý klíč nikdy neopustí domácí počítač. | *Nevýhodou* je, že správce bastionu (či útočník, který kompromituje bastion) může zneužít agent-forwarding konkrétního uživatele a prostřednictvím jeho klíčů na domácím počítači se připojit na další server. *Obrana* je jednoduchá – ssh-agent na domácím počítači si při každém použití soukromého klíče vyžádá od uživatele potvrzení. Pageant bohužel tuto funkcionalitu nemá. Všechny varianty řetězení mají několik bezpečnostních nedostatků. Pokud útočník kompromituje bastion, tak se může hlásit na interní servery pod cizí identitou. Útočník též může sledovat celou komunikaci, neboť při řetězení se na bastionu údaje předávají z jednoho zašifrovaného spojení do druhého. Postup útočníka je poměrně jednoduchý - upraví ssh klienta či ssh server a přenášené údaje loguje (stačí zapnout ladící volby v konfiguraci). Dalším problémem je, že uživatel má plnohodnotný přístup k shellu bastionu. Díky tomu může na bastionu spouštět různé programy, může si na něm uschovávat soubory – tím se zvyšuje nebezpečí úspěšného útoku na bastion i zvyšují nároky na správu bastionu. Tunelování ssh spojení ++++++++++++++++++++++ Alternativou k řetězení je **tunelování**, které umožňuje bezpečné připojení na server i v případě kompromitovaného bastionu. |image28| Při tunelování vytvoříte ssh spojení na bastion a v něm tunel. Druhé ssh spojení bude ze stanice do tunelu a z bastionu bude pokračovat dál na server. U tohoto typu spojení se bastion označuje pojmem **Jump host** či **ssh proxy server**. Na bastionu není potřeba vytvářet spojení s emulací terminálu, uživatel nemusí mít možnost spouštění programů [32]_. Na bastionu i na serveru musí mít uživatel uložen svůj veřejný klíč. Existuje opět několik variant realizace tohoto principu. - **Klasický lokální tunel**. Připojíte se na bastion a vytvoříte klasický lokální tunel. Ve druhém ssh spojení se připojíte na lokální konec tunelu. V případě většího počtu interních serverů je správa tunelů obtížná. - | **Dynamická proxy**. Opět máte dvě spojení. V prvním se připojíte na bastion a vytvoříte dynamický tunel (SOCKS proxy) např. na portu 1000. Ve konfiguraci spojení na server nastavíte v \ *Connection* -> *Proxy* typ proxy na Socks 5, hostname na localhost a port na 1000. | |image29|\ - **Proxy command**. V obou předchozích způsobech uživatel musí spustit dva programy (dvakrát Putty). Vytvoření tunelu a navázání spojení lze zapsat do jedné konfigurace (sezení), viz následující příklad. Proxy command v Putty +++++++++++++++++++++ Ze svého počítače se chci připojit na server ``bis144.vse.cz``, který je dostupný pouze přes server ``bis.vse.cz`` (tj. bastion). Na obou serverech mám již veřejný klíč, je uložen v ``.ssh/authorized_keys``. Na stanici používám ``pageant`` a mám v něm nahrán příslušný klíč (či klíče pokud se liší). |image30| V putty do *Host Name* zadám jméno cílového serveru včetně přihlašovacího jména na tomto serveru, tj. zadám ``pavlicek@bis144.vse.cz`` Poté v \ *Connection* -> *Proxy* nastavím typ proxy na ``local`` a dále do *local proxy command* dole doplním příkaz: .. code-block:: bash plink pavlicek@bis.vse.cz -agent -nc %host:%port\n |image31| Před navázáním spojení na server bis144.vse.cz se spustí program plink, který vytvoří spojení na ``bis.vse.cz`` s uživatelským jménem pavlicek a vytvoří potřebný proxy tunel (parametr ``-nc``) na ``bis144.vse.cz`` a port 22 (zadáno odkazem na hodnoty vyplněné v položce *Host Name* a port na úvodní stránce konfigurace). Parametr ``-agent`` u programu plink určuje způsob autentizace – bude číst klíč z programu pageant. V poslední verzi PuTTY není nutné tento parametr zadávat. Další informace o proxy najdete v dokumentaci putty [33]_. .. [18] Autor používá název PuTTY jak pro celou sadu programů, tak pro hlavní program. Já se to budu snažit odlišit a pro označení programu používat název putty či putty.exe. .. [19] Od studentů jsem zaslechl slangové označení „černé okénečko“. .. [20] Přihlašování pomocí klíče je dle RFC 4252 povinná autentizační metoda. Ověření uživatele pomocí hesla nemusí být implementováno. V případě některých specializovaných zařízení, jako síťové prvky, autentizace pomocí klíče často chybí. .. [21] Vygenerovanou dvojici klíčů lze použít i k dalším účelům, např. jako osobní certifikát pro S/MIME. Musíte ale překonat praktickou překážku v obtížné dostupnosti vhodného nástroje pro konverzi mezi formáty. Je to i proti bezpečnostním doporučením – pro každý účel by se měly používat odlišné klíče. Jiná situace je v případě vygenerování soukromého klíče na čipové kartě – zde není neobvyklé použití stejné dvojice klíčů pro různé účely. .. [22] Důvody ukončení podpory DSA klíčů – viz http://security.stackexchange.com/questions/112802/why-openssh-deprecated-dsa-keys. .. [23] Zabezpečení souboru .ppk se soukromým klíčem pro program PuTTY je zastaralé – pokud útočník získá soubor se soukromým klíčem, tak je schopen zkoušet stovky tisíc hesel za vteřinu, viz kapitola 1.5.8 TODO ověřit po spojení dokumentů dohromady .. [24] http://winscp.net/ .. [25] https://sourceforge.net/projects/vcxsrv/ .. [26] http://mobaxterm.mobatek.net .. [27] Ve Windows vypíšete seznam obsazených TCP portů na příkazové řádce pomocí ``netstat -a -p TCP`` .. [28] Jméno localhost se též překládá na IPv6 adresu ::1 – ta je též na každém počítači a používá se stejně jako 127.0.0.1 v IPv4. .. [29] Připojování přes SSH tunel k databázi je tak rozšířené, že mnohé grafické nástroje integrovali vytvoření SSH tunelů. Často využívají řádkový program plink.exe z PuTTY. .. [30] V Linuxu zjistíte obsazené TCP porty pomocí příkazu netstat -ltn .. [31] Pokud v aplikaci chybí podpora pro SOCKS 5 proxy, můžete zkusit proxy programy typu proxifier (`https://en.wikipedia.org/wiki/Comparison_of_proxifiers `__). .. [32] Omezení účtu pouze na tunelování je popsáno v manuálových stránkách „man sshd“, v sekci věnované souboru authorized_keys. .. [33] http://tartarus.org/~simon/putty-snapshots/htmldoc/Chapter4.html#config-proxy. .. |image0| image:: ./media/ssh_image1.png :width: 5.91667in :height: 3.32292in .. |image1| image:: ./media/ssh_image3.png :width: 5.91667in :height: 2.98958in .. |image2| image:: ./media/ssh_image5.png :width: 6.3in :height: 3.27083in .. |image3| image:: ./media/ssh_image7.png :width: 6.1875in :height: 5.01042in .. |image4| image:: ./media/ssh_image9.png :width: 2.94861in :height: 2.15278in .. |image5| image:: ./media/ssh_image11.png :width: 5.65625in :height: 2.75in .. |image6| image:: ./media/ssh_image13.png :width: 4.72778in :height: 3.97153in .. |image7| image:: ./media/ssh_image15.png :width: 4.82292in :height: 5.01042in .. |image8| image:: ./media/ssh_image17.png :width: 6.29861in :height: 2.29861in .. |image9| image:: ./media/ssh_image19.png :width: 4.61389in :height: 3.50694in .. |image10| image:: ./media/ssh_image21.png :width: 6.3in :height: 2.90972in .. |image11| image:: ./media/ssh_image23.png :width: 2.54097in :height: 5.32917in .. |image12| image:: ./media/ssh_image25.png :width: 5.09444in :height: 5.3125in .. |image13| image:: ./media/ssh_image27.png :width: 5.08403in :height: 5.29861in .. |image14| image:: ./media/ssh_image29.png :width: 4.83264in :height: 5.00694in .. |image15| image:: ./media/ssh_image31.png :width: 5.55139in :height: 1.50625in .. |image16| image:: ./media/ssh_image33.png :width: 2.3125in :height: 1.88125in .. |image17| image:: ./media/ssh_image35.png :width: 1.90625in :height: 2.68681in .. |image18| image:: ./media/ssh_image37.png :width: 4.67708in :height: 4.86533in .. |image19| image:: ./media/ssh_image39.png :width: 5.82222in :height: 3.84375in .. |image20| image:: ./media/ssh_image41.png :width: 3.03889in :height: 2.90278in .. |image21| image:: ./media/ssh_image43.png :width: 4.70069in :height: 2.68056in .. |image22| image:: ./media/ssh_image45.png :width: 6.3in :height: 1.86389in .. |image23| image:: ./media/ssh_image47.png :width: 3.03543in :height: 2.97161in .. |image24| image:: ./media/ssh_image49.png :width: 6.3in :height: 2.21528in .. |image25| image:: ./media/ssh_image51.png :width: 6.18889in :height: 2.29167in .. |image26| image:: ./media/ssh_image53.png :width: 4.775in :height: 3.32917in .. |image27| image:: ./media/ssh_image55.png :width: 5.23958in :height: 1.94792in .. |image28| image:: ./media/ssh_image57.png :width: 5.23958in :height: 2.26042in .. |image29| image:: ./media/ssh_image59.png :width: 4.85347in :height: 2.75in .. |image30| image:: ./media/ssh_image61.png :width: 4.68504in :height: 4.5in .. |image31| image:: ./media/ssh_image63.png :width: 4.70069in :height: 4.91667in .. |image32| image:: ./media/ssh_putty_agent_forwarding.png :width: 452px :height: 437px