Secure Shell (SSH)

01.06.2008 20:45 | Články | Andrej Eliáš
Secure Shell (SSH), sa stal neodmysliteľnou súčasťou môjho života. Zo začiatku som SSH bral len ako skvelú náhradu nezabezpečeného telnetu. Bol to proste ďalší stupeň evolúcie. Dnes viem že SSH nie je len na rýchle zmeny v príkazovom riadku vzdialeného servera...

Všetky tu uvádzané príklady sú otestované na linuxovej distribúcii Ubuntu. Ak neboli niektoré z funkcií zakázané v konfigurácii ssh daemona, mali by fungovať prakticky na každej distribúcii s OpenSSH serverom. Keď píšem "stroj", myslím tým počítač. Žiadny obrábací, šijací ani stavebný stroj to nebude...

Spustenie príkazu na vzdialenom stroji

Niekedy mi stačí na vzdialenom stroji spustiť jeden jediný príkaz (reštart DHCP, firewallu,...). V takomto prípade sa nemusím prihlasovať do konzoly. SSH v tomto prípade vykoná operáciu a odpojí sa zo servera. Výhodou je, že sa napríklad nemôžem zabudnúť odhlásiť, čo by napríklad v prípade spojenia na firewall predstavovalo veľké bezpečnostné riziko.

Tento príklad ukazuje vytvorenie adresára "skuska" v domovskom adresári užívateľa u2 na PC2

    u1@PC1:~$ ssh u2@PC2 'mkdir skuska'
    u2@PC2's password:
    u1@PC1:~$

V prípade že chcem vykonať operáciu, ktorá vyžaduje rootovské práva, použijem príkaz sudo:

    u1@PC1:~$ ssh u2@PC2 'sudo /etc/init.d/dnsmasq restart'
    u2@PC2's password:
    Password:heslo
    Restarting DNS forwarder and DHCP server: dnsmasq.
    u1@PC1:~$

V tomto prípade však je jeden veľký problém - v treťom riadku si príkaz sudo pýta heslo užívateľa u2, ale nemá vypnuté echo, takže heslo je v konzole viditeľné! Riešenie je v použití parametra -t.

    u1@PC1:~$ ssh -t u2@PC2 'sudo /etc/init.d/dnsmasq restart'
    u2@PC2's password:
    Password:
    Restarting DNS forwarder and DHCP server: dnsmasq.
    u1@PC1:~$

a už je všetko ako má byť.

Prihlásenie bez hesla...

Niekedy je vhodné (prípadne žiadúce), aby nebolo potrebné zadávať heslo pre prihlasovanie cez SSH. Takýto prípad môže nastať ak chcem na jednom počítači zautomatizovať vykonávanie úloh, ktoré vyžadujú pripojenie k ďalšiemu počítaču. Samozrejme, zabezpečenie musí byť. Pre takýto prípad umožňuje SSH autentifikáciu pomocou kľúča.

Predpoklad: Som prihlásený na počítači PC1 ako užívateľ u1. Z tohoto počítača sa chcem pripájať na počítač PC2 ako užívateľ u2.

Najprv vygenerujem tzv. key pair príkazom ssh-keygen -t rsa kde "-t rsa" určí typ použitého algoritmu. Keď sa bude pýtať na passphrase, nezadám nič - inak by to stratilo význam (v tomto prípade).

    u1@PC1:~$ ssh-keygen -t rsa
    Generating public/private rsa key pair.
    Enter file in which to save the key (/home/u1/.ssh/id_rsa):
    Enter passphrase (empty for no passphrase):
    Enter same passphrase again:
    Your identification has been saved in /home/u1/.ssh/id_rsa.
    Your public key has been saved in /home/u1/.ssh/id_rsa.pub.
    The key fingerprint is:
    91:22:a8:f2:a7:26:5a:aa:9f:93:8b:61:83:c1:26:ee u1@PC1
    u1@PC1:~$

Teraz potrebujem verejnú časť kľúča nahrať na druhý počítač (PC2). Pre zjednodušenie použijem priame spustenie príkazov cez ssh:

    u1@PC1:~$ ssh u2@PC2 mkdir -p .ssh
    The authenticity of host 'PC2 (10.0.0.2)' can't be established.
    RSA key fingerprint is ac:4c:1c:48:b4:0b:33:44:0f:61:05:aa:50:15:00:56.
    Are you sure you want to continue connecting (yes/no)? yes
    Warning: Permanently added 'PC2,10.0.0.2' (RSA) to the list of known hosts.
    u2@PC2's password:
    u1@PC1:~$

    u1@PC1:~$ cat .ssh/id_rsa.pub | ssh u2@PC2 'cat >> .ssh/authorized_keys'
    u2@PC2's password:
    u1@PC1:~$

Prvým príkazom vytvorím adresár .ssh v domovskom adresári užívateľa u2 na serveri PC2. Ak som sa ešte z PC1 na PC2 nepripájal, ssh klient ma upozorní že ide o neznámy server. Zadaním "yes" pridám jeho identifikáciu do zoznamu známych serverov a v budúcnosti sa už táto hláška nezobrazí. Druhým príkazom pridám svoj verejný kľúč do zoznamu autorizovaných kľúčov na serveri PC2.

Teraz už stačí keď zadám príkaz:

    u1@PC1:~$ ssh u2@PC2
    u2@PC2:~$

... a som prihlásený bez hesla...
Pri tomto spôsobe prihlasovania je však treba dávať pozor na bezpečnosť. Ktokoľvek, kto sa dostane k PC1, môže bez problémov získať prístup na PC2! Takže odporúčam túto metódu používať veľmi opatrne.

Jeden port to zvláda...

SOCKS proxy

Ak ssh klient umožňuje dynamické presmerovanie portov (Dynamic Port Forwarding), môžeme ssh použiť aj na vytvorenie SOCKS proxy servera.

    u1@PC1:~$ ssh -D 8080 u2@PC2

otvorí sa štandardná ssh konzola, pričom ssh klient vytvorí SOCKS server na lokálnom stroji (PC1). Tento server bude načúvať na zadanom porte - v našom prípade 8080. Jeho existenciu si môžeme ľahko overiť príkazom netstat.

    u1@PC1:~$ netstat -lpn |grep 8080
    (Not all processes could be identified, non-owned process info
     will not be shown, you would have to be root to see it all.)
    tcp       0      0 127.0.0.1:8080          0.0.0.0:*               LISTEN     11357/ssh
    tcp6      0      0 ::1:8080                :::*                    LISTEN     11357/ssh

netstat musíme spustiť v druhej konzole lokálneho PC.

Ak si teraz na PC1 napr. vo Firefoxe nastavíme pripojenie cez SOCKS proxy (SOCKS host: 127.0.0.1 port: 8080), tak všetka komunikácia cez Firefox bude kryptovaným tunelom prenášaná cez PC2 (komunikácia PC2 s ostatnými servermi však už týmto kryptovaná nebude).

Tento spôsob je vhodné použiť napríklad pre pripájanie sa cez nedôveryhodných poskytovateľov (WiFi hotspot a pod.) hlavne v prípade že cieľový www server nepodporuje SSL (https) prístup. Jediné čo poskytovateľ v takomto prípade uvidí je to, že dochádza ku kryptovanému prenosu dát medzi PC1 a PC2.

Lokálne presmerovanie portov

Lokálne presmerovanie portov (Local Port Forwarding) znamená, že sa na lokálnom stroji (PC1) vytvorí socket, ktorý načúva na danom porte a všetku komunikáciu presmerováva na zvolený port druhého stroja (PC2).

    u1@PC1:~$ ssh -L 1234:127.0.0.1:80 u2@PC2

Predpokladám, že na PC2 beží http (www) server na porte 80. Povedzme že je na tomto počítači webová aplikácia, ktorá nemá byť dostupná zo žiadneho iného PC, takže server načúva len na localhost spojenia. S použitím uvedeného príkazu môžem pristupovať na túto aplikáciu aj z PC1. Stačí do prehliadača zadať adresu: http://localhost:1234/

Vzdialené presmerovanie portov

Vzdialené presmerovanie portov (Remote Port Forwarding)

    u2@PC2:~$ ssh -R 10000:127.0.0.1:80 u1@PC1 

Uvažujme situáciu ako v predchádzajúcom prípade (http server na PC2) s tým, že ja sedím pri PC2 a kolega, ktorý pracuje na PC1, potrebuje na chvíľu pracovať s mojou www aplikáciou. Týmto príkazom sa pripojím na jeho počítač a vytvorím presmerovanie. Kolega zadá do prehliadača http://localhost:10000/ a môže pracovať.

Kombináciou local a remote port forwardingu môžeme získať prístup k službám serverov, ktoré sú pre priame spojenie nedostupné (napr. blokované firewallom)...

Spustenie grafickej aplikácie zo vzdialeného stroja

SSH umožňuje aj tzv. X11 forwarding. V tomto prípade si môžem na obrazovke svojho PC zobraziť a používať grafickú aplikáciu, ktorá je reálne nainštalovaná na druhom PC. Stačí použiť parameter -X

    u1@PC1:~$ ssh -X u2@PC2
    u2@PC2's password:
    u2@PC2:~$ gtkterm

Konkrétny prípad: v práci (PC2) mám na sériovom porte pripojenú špeciálnu sondu a potrebujem s ňou testovať komunikáciu. Z domu (PC1) mám prístup na daný počítač len cez SSH. Takto si spustím sériový terminál v grafickom režime a môžem pracovať...

Pri tomto tunelovaní dochádza k pomerne slušným dátovým prenosom - bežne desiatky kB/s no už sa mi stalo že aplikácia využila aj 200kBps. Čím viac sa prekresľuje na obrazovke, tým väčšie dátové prenosy.

VNC cez SSH

Z času na čas sa potrebujem pripojiť na svoj vzdialený desktop v grafickom režime - používam na to VNC. Ako som už spomínal, forwardovanie portov cez ssh je skvelá a veľmi užitočná vec. Tvorcovia VNC klienta vncviewer mysleli aj na túto možnosť a uľahčili nám týmto prácu:

    u1@PC1:~$ vncviewer -via u2@PC2 localhost:0
    VNC viewer version 3.3.7 - built Feb 20 2006 12:04:05
    Copyright (C) 2002-2003 RealVNC Ltd.
    Copyright (C) 1994-2000 AT&T Laboratories Cambridge.
    See http://www.realvnc.com for information on VNC.
    u2@PC2's password:

takto sa pripojím bez potreby predošlého vytvorenia tunelovaného spojenia. vncviewer to v podstate urobí za mňa - spustí príkaz "/usr/bin/ssh -f -L 5599:localhost:5900 u2@PC2" na pozadí - a to je náš starý známy Local Port Forwarding.

Prenos súborov

Pri prenose súborov je dôležité, či chceme súbor nahrať na server (upload), alebo si ho chceme zo servera stiahnuť (download).

Upload

Jeden spôsob prenosu súborov sme si ukázali v časi o prihlasovaní bez hesla. Konkrétne tento:

    u1@PC1:~$ cat .ssh/id_rsa.pub | ssh u2@PC2 'cat >> .ssh/authorized_keys'
    u2@PC2's password:
    u1@PC1:~$ 

lenže v tomto prípade sa jedná o pridanie dát na koniec súboru - to zabezpečí použitie "dvoch šipiek" >>

My však chceme súbor buď vytvoriť alebo prepísať. V tom prípade použijeme len jednu šipku:

    u1@PC1:~$ cat zdrojovy_subor | ssh u2@PC2 'cat > cielovy_subor'
    u2@PC2's password:
    u1@PC1:~$

Samozrejme, môžeme plne využiť všetky možnosti linuxového príkazového riadku.

Download

Pri downloade súboru zo servera je postup opačný:

    u1@PC1:~$ ssh u2@PC2 cat zdrojovy_subor  > cielovy_subor
    u2@PC2's password:
    u1@PC1:~$

Možností uploadu a downloadu je podstatne viac. Je možné napríklad kopírovať adresár zo servera a rovno ho komprimovať do archívu. Pekný prehľad týchto možností je možné nájsť na stránke [5].

Prenos súborov však môže byť aj pohodlnejší a preto spomeniem zopár programov a postupov, ktoré nám umožňujú prenášať súbory cez ssh.

Midnight Commander

mc zaujal u mňa významné miesto na každom linuxovom stroji. Jeho autori nezabudli ani na shell prístup a tak nám stačí v menu (F9) pre konkrétny panel (Left | Right) vybrať položku Shell link. Zobrazí sa dialóg, do ktorého zadáme prihlasovacie údaje - login a IP/meno cieľového PC. Po potvrdení to môže na prvý pohľad vyzerať akoby sa nič nestalo. No presuňme pozornosť smerom dolu... Teraz už stačí zadať heslo a potvrdiť. V jednom paneli máme lokálne adresáre, v druhom štruktúru vzdialeného stroja. A môžeme kopírovať, editovať, mazať,... Lepšie je raz vidieť než...

400x267  400x108  400x267  400x267 

Len pre upresnenie - používa sa tu tzv. FISH protokol (File Transfer Over Shell), ktorý umožňuje prenos súborov cez viacero typov shell pripojení. Nás však momentálne zaujíma len SSH.

GNOME

grafické prostredie GNOME poskytuje pohodlný spôsob kopírovania súborov cez SSH. V menu Places treba vybrať Connect to Server... a zobrazí sa dialóg pripojenia. Ako Service type vyberieme SSH a vyplníme adresu servera, login a meno odkazu (s týmto menom bude vytvorený link na ploche / v menu) Po potvrdení sa vytvorí už spomínaný odkaz na ploche. Stačí naň kliknúť a systém si vyžiada heslo - to si samozrejme môžeme uložiť do keyring-u a hotovo. Otvorí sa nám okno pre prenos súborov medzi serverom a naším PC.

412x440  552x312  552x322  260x154 

Krusader

Mnoho ľudí z môjho okolia používa krusader. Rád by som preto pridal návod na pripojenie na SSH cez krusader, ale :) ja krusader nepoužívam. Teda - nainštalovaný ho mám, ale zatiaľ som nenašiel dôvod prečo prejsť od MC. Okrem toho, štandardne v krusaderi SSH spojenia nefungujú. Samozrejme je možné ich rozbehať a pre tých, čo majú záujem, pripájam odkaz: http://www.krusader.org/phpBB/viewtopic.php?p=8897. Veľa šťastia.

Záver

Nemôžem tvrdiť že som spomenul všetky možnosti SSH - nebola by to pravda. Zameral som sa na tie, ktoré najčastejšie využívam. Ak to niekoho zaujalo, odporúčam pozrieť sa na uvedené stránky. Veľmi prehľadne a zrozumiteľne má problematiku Port Forwardingu vysvetlenú Jaroslav Imrich aka jariq.

Odkazy

[1] http://en.wikipedia.org/wiki/Ssh
[2] http://www.openssh.org/
[3] http://www.jariq.sk/item-15.html
[4] http://www.csua.berkeley.edu/~ranga/notes/ssh_nopass.html
[5] http://ultra.ap.krakow.pl/~bar/DOC/ssh_backup.html
[6] http://en.wikipedia.org/wiki/FISH_protocol
[7] http://cvs.savannah.gnu.org/viewvc/mc/mc/vfs/README.fish?view=markup

    • sshfs 02.06.2008 | 02:04
      Avatar titanik mint  Používateľ
      este pre zaujimavost pridam moznost "mount"u cez ssh ako sshfs. Pekny clanok je na linuxexpres.cz
    • re: 02.06.2008 | 16:37
      Avatar stewe freebsd 7.0  Používateľ
      pekny clanok
    • upload & download 03.06.2008 | 17:19
      tatar   Návštevník
      Hmmm a co spomenut "scp" ? Eh ?
      • Re: upload & download 03.06.2008 | 22:50
        Avatar Andrej Eliáš Ubuntu 10.04, 9.04, 8.04  Používateľ
        jj, scp som zvazoval, ale rozhodol som sa, ze bude lepsie zverejnit co mam a neskor by mohla pribudnut cast s dalsimi nastrojmi. SCP som proste nestihol. Taktiez som rozmyslal nad jednoduchym how-to pre vytvaranie tunelov a prenosy suborov medzi Windows klientom a GNU/Linux serverom. Zoparkrat som to vo firme pouzil a ludia sa tesili z moznosti, ktore im dava jediny otvoreny port. Neda sa dat vsetko do jedneho clanku... Ale priznavam, ze scp som mohol aspon spomenut.
        wtf is wrong with this world...
    • krusader 09.07.2009 | 19:06
      karci   Návštevník
      Cez Krusader sa da spojit so vzdialenym hostom cez fish protokol, podobne ako si to ukazal na priklade mc.