SSH --- Secure shell
                             -=-=-=-=-=-=-=-=-=-=-=

       Nearly every complex solution to a programming problem that I have
                looked at carefully has turned out to be wrong.
                                 -- Brent Welch

                         Jan Pazdziora, 7. března 1998

          Secure  shell slouží k přihlašování na vzdálený  počítač po síti
      a k přenosu  dat. Od počátku je stavěn  tak, aby  umožnil  bezpečnou
      komunikaci  po  nedůvěryhodné  síti  pomocí  šifrování a  zabezpečil
      vzájemnou autentizaci strojů i uživatelů.

                             Možnosti jeho nasazení

          Secure  shell  můžeme  použít  místo  programů  telnet či rlogin
      k interaktivnímu  přihlášení  na  vzdálený  stroj.  Přitom je snadné
      přenášet  vytvořeným  kryptovaným  kanálem i X  protokol  spuštěných
      programů  pro X-Window  System. Je také  možné  spustit na vzdáleném
      počítači  příkaz,  kterému  předáme na standardním  vstupu  data a z
      výstupu převezmeme  výsledek (obdoba rsh). Program scp, Secure copy,
      je pak bezpečnou  variantou  rcp.  Secure  shell má ale mnohem  více
      možností,  jak  zadat,  co  který  uživatel  smí  provést,  a dokáže
      například i kryptovaně forwardovat porty mezi stroji.

          Na  strojích,  na jejichž   bezpečnosti  nám   opravdu   záleží,
      je vhodné všechny  možnosti  vzdáleného  přístupu kromě ssh zakázat,
      donutíme tak uživatele  (včetně  superuživatele)  používat  výhradně
      bezpečné spojení.

          Verze  pro  systémy  UNIX  jsou  free  včetně  zdrojových  textů
      pro   nekomerční   použití  (i   nekomerční   použití  v  komerčních
      firmách).   Domovská   stránka   ssh  s  distribucí   je  na  adrese
      http://www.cs.hut.fi/ssh,  na síti  TEN-34  CZ je mirror  na  adrese
      http://www.fi.muni.cz/ftp/pub/ssh  obsahující mimo jiné i rpm balíky
      od Yenyi  Kasprzaka.  Pro systémy z produkce  společnosti  Microsoft
      existují   komerční  verze,  více  informací   naleznete  na  adrese
      http://www.datafellows.com/

          Stabilní  distribuce v době psaní tohoto  článku má číslo  verze
      1.2.22.

                          Architektura klient--server

          Abychom  se mohli  na  vzdálený  počítač  pomocí  ssh  připojit,
      musí na něm běžet sshd, Secure  shell daemon. Tento  daemon  přijímá
      požadavky,  testuje  jejich  oprávněnost z hlediska  identity stroje
      i  uživatele,  a  v  případě   úspěchu  vytvoří  kryptované  spojení
      požadovaného  typu. Na straně  klientské  pak  potřebujeme  klienta,
      program ssh,  kterému  parametry  zadáme, kam a jaké spojení  chceme
      vytvořit.

          Každý   stroj,   na   kterém   běží   sshd,   má   vygenerovanou
      dvojici  RSA  klíčů,  které  ho  identifikují  (/etc/ssh_host_key  a
      /etc/ssh_host_key.pub). Při startu daemona (typicky z rc skriptů při
      bootu systému)  daemon  vygeneruje ještě klíč serveru, který posléze
      mění každou hodinu.

          Klient,   který  žádá   server o  spojení,   obdrží  od  serveru
      veřejný  klíč  stroje i serveru.  Veřejné  klíče  strojů, se kterými
      jsme  už v  minulosti   komunikovali,   jsou   ukládány  do  souboru
      /.ssh/known_hosts,  případně   správcem  do  /etc/ssh_known_hosts,
      a při  každém  dalším  přihlášení se  ověřuje,  zda se  identifikace
      vzdáleného  stroje  nezměnila.  To by mohlo  znamenat,  že se  někdo
      snaží  spojení  odposlouchávat a vydává se za námi  zamýšlený  stroj
      man-in-the-middle   attack).  V našem  méně  nepřátelském   světě  k
      odmítnutí  spojení z tohoto  důvodu  dochází  typicky po reinstalaci
      počítače -- řešením pak je po ověření situace odstranit veřejný klíč
      vzdáleného stroje z lokální databáze known_hosts.

          Klient po získání  klíčů  vygeneruje 256  bitový  klíč  (session
      key), který bude použit pro šifrování  dalšího  spojení  symetrickým
      šifrovacím   algoritmem.  Tento  klíč  zakryptuje   veřejnými  klíči
      serveru a stroje, na kterém běží server, a pošle  zpět.  Server tedy
      musí nejen  poslat  správný  veřejný  klíč stroje pro ověření  proti
      known_hosts na klientské straně, musí samozřejmě znát i svůj správný
      tajný klíč, aby byl schopen klíč od klienta rozšifrovat.

          Poté,  co  klient  věří, že  komunikuje s tím, s kým  požadoval,
      je na serveru, aby ověřil, že klient má právo se přihlásit, případně
      provést žádanou akci.

          Ssh podporuje z důvodu zpětné kompatibility  autentizaci shodnou
      či podobnou s rsh, pomocí souborů  /etc/hosts.equiv a .rhosts, resp.
      .shosts.  Naštěstí se tento způsob dá v konfiguraci  daemona zakázat
      a je to více než doporučeníhodné.  Použití ssh dává totiž  uživateli
      jistý pocit bezpečí, který je ale při povoleném  přihlašování jen na
      základě .rhosts více než pochybný.

          Nejčastěji  používanou autentizací je autentizace protokolem RSA
      (kryptografie s veřejným  klíčem).  Při něm server zná veřejný  klíč
      uživatele, ten je uveden v souboru /.ssh/authorized_keys v domovském
      adresáři  uživatele na vzdáleném stroji. Kdo se chce přihlásit, musí
      prokázat, že zná tajný klíč k tomuto veřejnému.  Server na požadavek
      ssh klienta vrátí tzv. challenge, náhodné číslo zašifrované veřejným
      klíčem.  Klient se pokusí ho rozšifrovat za použití  tajného  klíče,
      který může být ještě chráněn  dodatečným  heslem,  passphrase. Pokud
      výsledek od klienta  souhlasí,  server  přihlášení  povolí a provede
      požadovanou akci -- spustí interaktivní shell, provede příkaz.

          Jako poslední šance je uživateli nabídnut prompt k zadání hesla;
      pokud ani toto neuspěje, je spojení zrušeno.

                             Instalujeme sshd a ssh

          Při  instalaci si můžeme  zvolit  buď  kompilaci  ze  zdrojových
      textů ( ./configure  &&  make &&  make  install)  nebo  nainstalovat
      předkompilovanou  binární  distribuci či rpm.  Obě  formy  instalace
      zajistí mj. i vygenerování dvojice klíčů stroje. Poté zkontrolujeme,
      jestli nám vyhovuje  standardní  nastavení  konfigurace  ssh daemona
      uvedené v /etc/sshd_config,  zvláště  co se  týče  povolených  forem
      autentizace či způsobu  přihlašování. Pak již můžeme daemon spustit,
      nejlépe z nějakého rc skriptu.

          Od této  chvíle  můžeme se strojem,  na kterém  běží  sshd,  již
      komunikovat  bezpečným  způsobem. I když totiž nemáme  povolenou RSA
      autentizaci, můžeme se přihlásit zadáním hesla.

          Chceme-li  využít RSA autentizaci,  musíme na klientské  straně,
      odkud se budeme přihlašovat, vygenerovat dvojici tajného a veřejného
      klíče. K tomu použijeme  program  ssh-keygen. Jsme vyzváni,  abychom
      zadali  jméno  souboru pro uložení  tajného  klíče,  veřejný klíč je
      uložen  vedle něho s příponou .pub. Při generování  klíče  uživatele
      akceptujeme  nabídnuté /.ssh/identity. Soubor /.ssh/identity.pub pak
      zkopírujeme  do /.ssh/authorized_keys  na straně  serveru a případně
      rozšíříme o požadované podmínky. A nyní již můžeme spustit


 ssh jméno_serveru


          Odpovědí by měl  být  prompt na vzdáleném  stroji.  Ověřit,  zda
      opravdu používáme RSA autentizaci, můžeme spuštěním ssh s volbou -v.
      Správný výpis bude přibližně takovýto:


 faethon: Server refused our rhosts authentication or host key.
 faethon: No agent.
 faethon: Trying RSA authentication with key 'adelton@faethon'
 faethon: Received RSA challenge from server.
 faethon: Sending response to host key RSA challenge.
 faethon: Remote: RSA authentication accepted.
 faethon: RSA authentication accepted by server.


          Pokud  se  přihlašujeme  na  stroj,  jehož  veřejný  klíč  ještě
      neznáme, ssh se nás zeptá

 Host key not found from the list of known hosts.
 Are you sure you want to continue connecting (yes/no)?


          Musíme  odpovědět  celým yes a ssh  pak  přidá  veřejný  klíč do
      našeho lokálního seznamu known_hosts.

          Secure shell daemon můžeme spustit i na stroji, na kterém nemáme
      superuživatelská práva. Musíme ho ale volbou na příkazové řádce nebo
      v lokálním  konfiguračním  souboru spustit na neprivilegovaném portu
      a na tento port pak směrovat klienty.

                      Autorizované klíče a různé identity

          Při  autentizaci  protokolem  RSA  server  testuje,  zda  klient
      zná tajný klíč k veřejnému  klíči ze souboru  /.ssh/authorized_keys.
      Na každém  řádku je uveden  jeden  veřejný  klíč, a s ním i podmínky
      a akce, pro které  platí.  Můžeme  například  klauzulí  from  omezit
      přihlašování  jen  z  určitých   strojů  či  domén,  můžeme  zakázat
      forwardování  portů či  nastavit  dobu  nečinnosti,  po  které  bude
      spojení ukončeno. Pomocí command specifikujeme  příkaz, který se při
      spojení s odpovídajícím  tajným  klíčem  provede. Pokud údaj command
      není uveden, spustí se buď interaktivní shell, nebo příkaz  vyžádaný
      klientem.

          Běžný uživatel bude mít ve svých  authorized_keys  pravděpodobně
      převážně  svoje  klíče pro interaktivní  přihlašování,  naproti tomu
      na superuživatelský účet  můžeme  chtít mít různě  omezené  přístupy
      z  různých  strojů.  Takto  by  mohl  vypadat  řádek,  který  dovolí
      vlastníkovi  tajného klíče provést  backup  části disku na vzdáleném
      stroji:

 from="pinosol",command="tar czf -- /export/data" 1024 37 \
               5867...spousta číslic veřejného klíče

          (vše  uvedeno na jednom  řádku).  Všimněme si, že tento  příkaz,
      stažení  taru s obsahem  adresáře,  může  provést  kdokoli,  kdo  má
      odpovídající tajný  klíč,  nikoli  nutně superuživatel. Při spuštění
      ssh na klientské  straně  volbou -i zadáme jméno souboru se správným
      tajným klíčem:

 ssh -i  /.ssh/backupuj root@bromhexin >> \
 backup.'date +'%y%m%d''.tgz

          Autorizovaný  klíč pro  stažení či zápis  jednoho  pevně  daného
      souboru  či  zatarování  obsahu  adresáře  je  korektním   způsobem,
      jak zajistit  přenos dat mezi  dvěma  běžnými  uživateli,  pokud nám
      nevyhovuje  otevřenost  HTTP  protokolu.  Nesdělujeme  totiž  cizímu
      člověku ani heslo, ani tajný klíč k neomezenému  přihlašování na náš
      účet, zpřístupňujeme mu pouze přesně vymezená data.

          Pokud máme povolený neomezený přístup (například RSA autentizací
      na svůj účet na jiném  stroji),  můžeme  příkaz pro provedení  zadat
      samozřejmě i lokálně:

 ssh bromhexin 'tar cf -- /export/data' >> out.tar


          V tomto případě se použije standardní identity.

                       Forwardování protokolu X11 a portů

          Pokud  se  přihlašujeme  z  klienta  s  X-Window  (je  nastavena
      proměnná  prostředí  DISPLAY) a server tuto vlastnost umožňuje, bude
      spojení od X klientů  spuštěných na serverové  straně  ssh směrováno
      do kryptovaného  kanálu a teprve na klientské  straně  ssh předáno X
      serveru.  Proměnná  DISPLAY bude na vzdálené straně ssh nastavena na
      vzdálený stroj, s číslem displeje vyšším, než na jaké jsme zvyklí (>
      0). Tento displej je právě vzdálený konec ssh spojení.

          Doporučeným  způsobem, jak spustit na vzdáleném  stroji aplikaci
      pro X-Window, je použít na příkazovém řádku volbu -n:

 ssh -n pinosol xterm &

          která zabrání čtení standardního  vstupu a dovolí  spuštění {\tt
      ssh} na pozadí.  Pokud  potřebujeme  při  přihlašování  zadat  heslo
      nebo passphrase,  využijeme volbu {\tt -f}, která  přesune {\tt ssh}
      na pozadí, ale až po úspěšně  proběhnuté  autentizaci a po vytvoření
      spojení.  Tak  budeme  mít  prompt  shellu na lokálním  stroji  opět
      k dispozici:

 ssh -f pinosol xterm


          Forwardování  protokolu  X11  funguje v posledních  verzích  ssh
      (1.2.20 a výše) bez větších  problémů. Ve starších verzích docházelo
      k zatuhnutí, pokud  klient  zažádal o přenos  velkého  množství dat,
      tato  chyba  ale  byla  opravena.  Jediné,  co  v  oblasti  X-Window
      nefunguje, je forwardování rozšíření OpenGL/DGL společnosti SGI.

          Kryptovaný ssh kanál můžeme  využít i pro jiná data, následující
      příklad  ukazuje, jak kryptovaně  namountovat  Samba  disk ze stroje
      bromhexin na stroj pinosol:

 ssh -L 1234:bromhexin:139 bromhexin
 smbmount //pinosol/adelton mnt -p 1234 -c pinosol


          První  příkaz  kryptovaně  propojí  Samba  port 139 na vzdáleném
      stroji s lokálním  portem 1234. Druhý  příkaz pak namountuje  službu
      dostupnou již na lokálním portu.

                             Secure copy, ssh agent

          Příkaz scp je prodloužením  běžného cp na přenosy  souborů  mezi
      stroji:  pokud před jméno souboru  uvedeme  jméno  stroje a případně
      i jméno uživatele,  provede se vzdálený ssh přenos. scp se v případě
      potřeby  zeptá na heslo a umožní i kopírování mezi dvěma  vzdálenými
      počítači.

          Abychom se vyhnuli  opakovaného  zadávání  passphrase  například
      ke svému tajnému klíči, můžeme pomocí  programů  ssh-agent a ssh-add
      uložit  tajné  klíče do paměti, a posléze je využít při přihlašování
      pomocí ssh. Agenta  spustíme  například při přihlašování do X-Window
      tak, aby  všechny  další  procesy  byly  jeho  potomky. Ty pak zdědí
      spojení k němu a následné  příkazy mohou využít jeho tajných  klíčů.
      Protože při startu X-Window  systémů většinou ještě nemáme terminál,
      na kterém by se ssh-add  mohl  zeptat,  spouští se v takové  situaci
      jednoduchá  aplikace  ssh-askpass, od níž pak {\tt ssh-add}  zadanou
      passphrase převezme.

                           Distribuce veřejných klíčů

          Secure  shell  je  klient  a server  určitého  protokolu,  spolu
      s obslužnými  programy  typu  ssh-keygen.  Protokol  ale nedefinuje,
      jakým  způsobem  si organizace  či  jednotlivci  zajistí  distribuci
      potřebných   veřejných  klíčů  či  backupování  klíčů  tajných.  Aby
      ale usnadnili  alespoň  evidenci  veřejných klíčů,  zahrnuli  autoři
      v distribuci  perlovský  skript  make-ssh-known-hosts,  který  podle
      záznamů v nameserveru projde všechny  stroje v doméně a pokusí se od
      nich získat  jejich  veřejný ssh klíč. Výsledek je ve formě  souboru
      ssh_known_hosts a po jeho kontrole ho můžeme rovnou použít.

                                Na co dát pozor

          Při přihlašování  pomocí ssh je potřeba  mít na paměti, že řetěz
      je tak slabý  jako  jeho  nejslabší  článek.  Ssh odstraňuje  přenos
      hesel v otevřené  podobě, musíme ho ale používat  důsledně: pokud se
      nejprve  přihlásíme  telnetem a teprve dále pomocí ssh, jde po části
      sítě otevřeně nejen heslo k prvnímu telnetu, ale i všechna  případná
      další.

                                Důležité soubory

          /usr/local/bin/ssh,   ssh-keygen,   ssh-agent,  ssh-add  Klient,
      generování klíčů, ssh agent

          /etc/ssh_config         /.ssh/config,        /.ssh/identity,
      /.ssh/identity.pub, /.ssh/authorized_keys

          Standardní    konfigurační   soubor    klienta,   jeho   lokální
      konfigurační soubor, standardní  identita uživatele (tajný a veřejný
      klíč), seznam autorizovaných klíčů

          /usr/local/sbin/sshd     /etc/sshd_config,    /etc/ssh_host_key,
      /etc/ssh_host_key.pub  Daemon,  jeho  konfigurační  soubor,  tajný a
      veřejný klíč stroje

          Konfigurační soubory mohou být na vaší lokální instalaci uloženy
      místo adresáře /etc v /etc/ssh.

                                     Závěr

          Ukázali  jsme, jak začít používat  secure  shell pro bezpečnější
      komunikaci  po  počítačové  síti.   Nastínili  jsme  jeho  filosofii
      a uvedli několik  příkladů.  Uživatelé najdou podrobnější  informace
      v manuálové  stránce  ssh(1),  správci by si měli přečíst  sshd(8) a
      samozřejmě i relevantní dokumentaci odtamtud odkazovanou.

          Často      kladené       dotazy       naleznete     na    adrese
      http://www.uni-karlsruhe.de/   ig25/ssh-faq/  a o  budoucnosti   ssh
      i netriviálních aplikacích je newsová skupina comp.security.ssh.

          Za  přípomínky  a  doplnění  děkuji  Petru  Macháčkovi  a  Petru
      Kolářovi.


            výheň