OpenSSH kasutamine

Allikas: Kuutõrvaja
Redaktsioon seisuga 1. oktoober 2008, kell 23:59 kasutajalt Jim (arutelu | kaastöö) (Väljanägemise korrigeerimine, mõned sõna- ja täheparandused)

SSH (Secure Shell - e. k. kindel koorik) on programmide komplekt, mis on mõeldud r-korralduste (rsh, rcp ja rlogin'i) asendamiseks funktsionaalsuselt sarnaste, kuid pealtkuulamise ja IP-aadressi võltsimise suhtes turvalisemate vahenditega.

SSH võimaldab üle mitteturvalise liini turvaliselt

  • logida teise masinasse ja seal toimetada,
  • anda käske teises masinas,
  • kopeerida faile masinate vahel,
  • porte ümber suunata (ingl. k. port forwarding), nt. Fetchmaili ja FTP kasutamisel,
  • Xi rakendusi üle võrgu "vedada",
  • luua turvalisi kanaleid (ingl. k. secure tunnel) teiste protokollide jaoks, näiteks PPP.

Kõik need juhud eeldavad, et teil on kasutajatunnus ka teises masinas. SSH põhineb klient-server mudelil kusjuures ühenduse algatab alati SSH klient. Edaspidises kasutatakse väljendit SSH server, mille all mõeldakse teist masinat ning millel on SSH kliendiga suhtlemiseks sobiv tarkvara.

SSH on protokoll, mille versioonile 1 ja samuti selle baasil loodub programmide komplektile viidatakse kui SSH1. SSH1 on vabalt kasutatav, olles samas ebaturvalisem kui SSH2 protokollil põhinev tarkvara. Tänapäeval pole SSH1 kasutamine soovitatav. SSH kasutab avaliku võtmega krüptimist, mis toetub RSA algoritmile.

Teise masinasse sisselogimine ja ühenduse lõpetamine

Kirjeldame lihtsustatult, kuidas toimub SSHga teise masinasse sisselogimine.

Logimisel on kolm etappi:

Protokollide kontroll. Seansi algus ei ole krüptitud. Selle käigus teevad osapooled kindlaks, et nad kasutavad omavahel sobivaid SSH versioone. Klient veendub serveri ehtsuses. Serveril on kaks RSA võtit: salajane ja avalik. Et klient saaks veenduda, serveri ehtsuses peab ta eelnevalt teadma serveri avalikku võtit. Teatavasti on avaliku võtme krüptograafia kõige nõrgemaks kohaks avaliku võtme edastamine selle kasutajale. Selle võib klient saada, nt disketil, serveri administraatori käest isiklikult, kuid levinum on riskantsem viis. Nimelt esmakordsel ühendusevõtmisel usaldab klient serverit. Saades serveri avaliku võtme ning kliendi so kasutaja nõusoleku, lisatakse see faili ~/.ssh/known_hosts. Kui edaspidi võetakse ühendust sama serveriga, siis on võimalik juba kasutada standardset avaliku võtme krüptograafiat:

Server genereerib ja krüptib juhusliku järgnevuse (ingl. k. challenge) oma salajase võtmega ja saadab selle kliendile. Klient püüab saadetist lahti krüptida tema käsutuses oleva vastava avaliku võtmega. Kui see õnnestub, on server ehtne; kui mitte, siis on server võlts või on ta vahepeal endale uud võtmed tekitanud. Klient saadab serverile tagasi ühe võtmega krüptimise shifri nime (DES, 3DES, IDEA) ja serveri avaliku võtmega küpteeritud sessioonivõtme. Saadetis on avatav ainult vastava salajase võtmega, mis on eeldatavasti vaid õigel serveril. Edasine infovahetus serveri ja kliendi vahel toimub üle krüptitud kanali, kusjuures mõlemad pooled kasutavad kokkulepitud shifrit ja sessioonivõtit.

Server veendub kliendi ehtsuses. Esmalt püütakse kasutajat autentida automatiseeritud viisil. Kui see ei õnnestu, kontrollitakse kasutaja UNIXi parooli, kasutades loodud turvalist kanalit.

Praktiliselt algatab klient serveriga ühenduse käsuga ssh, näiteks

gnoom~$ ssh -l priit reptilus.zoo.tartu.ee
Host key not found from the list of known hosts.
Are you sure you want to continue connecting (yes/no)? yes
Host 'reptilus.zoo.tartu.ee' added to the list of known hosts.
Creating random seed file ~/.ssh/random_seed. This may take a while.
priit@reptilus.zoo.tartu.ee's password:
reptilus~$

Seejuures:

  • tekitatakse kliendile kataloog ~/.ssh milles sisalduvad SSHle olulised failid,
  • serveri avalik võti lisatakse faili ~/.ssh/known_hosts,
  • tekitatakse SSH sisemisteks vajadusteks juhuslikku alget sisaldav fail ~/.ssh/random_seed,
  • küsitakse kasutaja UNIXi parooli, kuna kasutaja RSA võtmetega automaatne autentimine ebaõnnestus.

Tulemusena saadi äsjases näites ette teise masina viip ja võiks hakata seal toimetama. Sarnase tulemuse oleksite võinud saada telnetiga, kuid SSH abil tekitatud ühendust krüptitakse.

Seansi lõpetamine toimub tavalisel moel välja-logimisega

reptilus~$ logout
gnoom~$

Niisiis, SSH klient teeb SSH serveri avaliku võtme abil kindlaks SSH serveri ehtsuse ja seejärel SSH server autendib kasutaja.

Märkus: Kujutleme olukorda, kus teil on harjumus külastada SSHga mõnda masinat ning te ühtäkki märkate sisselogimisel, et server vastab teile hoiatava veateatega, öeldes, et serveri avalik võti ei klapi, pakkudes aga teile võimalust jätkata sisselogimist. Sama toimub ka igal järgmisel korral. Sel juhul on kaks võimalust:

  1. Te suhtlete võltsserveriga ning ei tohiks sisselogimist jätkata. Tuleks muude vahenditega kindlaks teha, mis täpselt toimub.
  2. Server on õige, kuid ta kasutab uusi RSA võtmeid. Sel juhul peab kasutaja oma ~/.ssh/known_hosts failist vastava serveri avaliku võtme rea käepärase tekstiredaktori abil kustutama. Järgmisel külastusel kirjutatakse sinna faili uus serveri avalik võti.

Kasututaja autentimine tema RSA võtmetega

Teatavasti pakuvad r-korraldused suhteliselt automaatset, kuid ebaturvalist autentimist. Näitame, kuidas eelmises punktis kirjeldatud sisselogimisele ja seansi krüptimisele lisaks korraldada SSH abil automaatset kasutaja autentimist.

Autentimine toimub kasutaja enda moodustatud RSA võtmepaari abil. Rääkides seonduvalt SSHga RSA võtmetest, tuleb teha vahet, millal kõneldakse SSH serveri RSA võtmepaarist ja kunas kasutaja RSA võtmepaarist.

RSA võtmete moodustamine

Esmalt moodustab kasutaja, näiteks priit@gnoom.zoo.tartu.ee endale RSA võtmepaari käsuga ssh-keygen

gnoom~$ ssh-keygen
Initializing random number generator...
Generating p:  .......++ (distance 70)
Generating q:  ......................................................++(distance 1384)
Computing the keys...
Testing the keys...
Key generation complete.
Enter file in which to save the key (/home/priit/.ssh/identity):
Enter passphrase:
Enter the same passphrase again:
Your identification has been saved in /home/priit/.ssh/identity.
Your public key is:
1024 37 1554333789793729191862682592260847771258286098468
3921789960662859786586472264373484080228833114457
1626804981901211908429466336667815885184594091461
2569249444672372054586982118977562103987797501424
8271032932681521591906275426044563577193997222784
0241263568911729625907267037780774925882883690450
530158923098373 priit@gnoom.zoo.tartu.ee
Your public key has been saved in /home/priit/.ssh/identity.pub
gnoom~$

Moodustamisel päritakse kasutajalt RSA salajase võtme parooli; selle peab ta sisestama iga kord enne oma salajase võtme kasutamist.

Tulemusena tekitatakse kaks võtit: kasutaja RSA avalik võti: ~/.ssh/identity.pub kasutaja RSA salajane võti: ~/.ssh/identity

Pange tähele, et avaliku võtme lõpus on kirjas, kellele see kuulub. Salajane võti on küll parooliga kaitstud, kuid võti peaks siiski olema vaid kasutajale endale loetav.

RSA avaliku võtme paigutamine SSH serverisse

Oma avaliku võtme peate te lisama külastatava (so. SSH serveri, nt reptilus.zoo.tartu.ee) masina faili ~/.ssh/authorized_keys ja salajase võtme jätma sinna, kuhu ta tekitati. Kuna ~/.ssh/authorized_keys faili sisu on kõigile loetav, pole avaliku võtme edastamisel vaja võtta tarvitusele erilisi ettevaatusabinõusid: peaasi, et võtme sisu jääks muutumatuks. Failis ~/.ssh/authorized_keys võivad sisalduda mitmed avalikud võtmed, igaüks eraldi real ning fail on ASCII kujul. Nii on võimalik külastada SSH serverit erinevatest klient-masinatest. Kõige lihtsam on teha ~/.ssh/identity.pub failist koopia ning see ftp abil SSH serverisse toimetada. Seal andke selle faili lugemis- ja kirjutamisõigus ainult endale

reptilus~$ chmod 600 ~/.ssh/authorized_keys

Kui te nüüd külastate ssh'ga seda SSH serverit, siis esmalt klient autendib serveri varemkirjeldatud tavapärasel moel. Aga server autendib kliendi selliselt: server genereerib juhusliku järgnevuse baite ja krüptib need talle teadaoleva kasutaja avaliku võtmega klient kasutab ainult tal olemasolevat vasatavat sajalast võtit ja krüptib saadetise lahti; tulemus saadetakse serverile tagasi server võrdleb esialgset järgnevust kliendi poolt lahti krüpituga ja nende identsuse korral loeb autentimise õnnestunuks ning kasutajale antakse ette viip.

RSA võtmete kasutamine

Näide automaatsest kasutaja RSA võtmetega autentimisest

gnoom~$ ssh -l priit reptilus.zoo.tartu.ee
Enter passphrase for RSA key 'priit@gnoom.zoo.tartu.ee':
Last login: Thu Nov 11 11:16:09 1999 from mammal.zoo.tartu.ee
Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994
The Regents of University of California. All rights reserved.
reptilus~$

Kuna kasutaja autentimisel läheb tarvis tema salajast võtit, siis küsitakse salajase võtme parooli; '-l kasutajanimi' on vajalik, kui kasutajal on teises masinas erinev kasutajanimi. Siiski, kui ka kasutajal on erinevad kasutajanimed erinevates 'teistes masinates', siis ei pruugi ta '-l' võtit kasutada. Selle asemel võib ta kasutajanime ja vastava teise masina nime ära näidata failis ~/.ssh/config; võib kirjeldada mitmeid SSH servereid:

Host reptilus.zoo.tartu.ee
User priidu
Host mammal.zoo.tartu.ee
User priidik

Näites autenditakse gnoomi kasutajat 'priit' masinas reptilus kasutajana 'priidu'; ja masinas mammal kasutajana 'priidik'. Niisiis, et gnoomist logida sisse mammalisse kasutajana 'priidik' piisab kirjeldatud konfiguratsioonifaili olemasolul anda käsk

gnoom~$ ssh mammal.zoo.tartu.ee

Niisiis, standardne UNIXi paroolikontroll on asendatud SSH vahenditega. Hoiatuseks märgime, et juhul, kui teine masin võimaldab vaid SSHga sisselogimist ja te olete oma authorized_keys faili seal moodustanud ning te eksite, nt. ei mäleta oma salajase võtme parooli, siis peate kuidagi eemaldama authorized_keys faili; või vähemalt sellele masinale vastava sissekande, kust te SSH serverit ebaõnnestunult külastada püüate. Loodetavasti on seda võimalik FTPga teha. Kui ei, peate paluma SSH serveri administraatorit.

Võtmete mälus hoidmine

Eelmises punktis nägime, kuidas korraldada kasutaja (enda) autentimist. Seejuures võib tunduda ebamugavana vajadus iga kord oma salajase võtme parooli sisestada. Tõsi, tehniliselt võite võtmete moodustamisel ka parooli panemata jätta (vajutades Enterit), kuid see oleks turvaline seni, kuni teie salajane võti kindlalt ainult teie valduses on. Tõsi, reeglina see nii ka on. SSH pakub võimaluse salajasi võtmeid kliendi masina mälus hoida kuigi ka see pole väga turvaline, kuid enamasti piisav praktiliseks kasutamiseks.

Selleks käivitatakse võtmete mälus hoidmise agendi abil programm, millele (ja millest käivitatud uutele programmidele) saab teha kasutaja salajase võtme kättesaadavaks. Näiteks koorik

gnoom~$ ssh-agent bash

Eeldades, et te hoiate oma salajasi võtmeid failis ~/.ssh/indentity, saate nad mällu laadida korraldusega ssh-add

gnoom~$ ssh-add
Need passphrase for /home/priit/.ssh/identity (priit@gnoom.zoo.tartu.ee)
Enter passphrase:
Identity added: /home/priit/.ssh/identity (priit@gnoom.zoo.tartu.ee)

Nüüd saavad kõik uuest koorikust järgnevalt käivitatud programmid, näiteks ssh ja cvs, vajadusel kasutada mällu laaditud SSH RSA sajalasi võtmeid.

Mälus olevate salajaste võtmete vaatamiseks on korraldus

gnoom~$ ssh-add -l

Salajaste võtmete mälust eemaldamiseks on korraldus

bash~$ ssh-add -D

Korralduste täitmine teises masinas

SSH võimaldab lasta korraldusi täita teises masinas, kasutades järgmist süntaksit

ssh -l kasutaja2 teise.masina.nimi käsk käsu-võtmed

kasutaja2 on kasutajanimi teises masinas, kelle õigustes seal tegutsetakse.

Sõltuvalt korralduse iseloomust võib väljund esituda ekraanil. Korralduse täitmisele eelneb varemkirjeldatud autentimine.

Anname näiteks teises masinas korralduse 'hostname -f'

gnoom~$ ssh -l kasutaja2 reptilus.zoo.tartu.ee hostname -f
reptilus.zoo.tartu.ee
gnoom~$

või korralduse 'w'

gnoom~$ ssh kasutaja2@reptilus.zoo.tartu.ee w
12:10PM     up 9 days, 21:18, 8 users, load averages: 0.02, 0.03, 0.00
USER    TTY        FROM       LOGIN@   IDLE       WHAT
mart    tty2       mammal     11:09AM  0:05       bash
gnoom~$

Paralleelselt on lubatud kasutada ka konstruktsiooni kasutajanimi@masina.nimi.

Mõned programmid, nagu näiteks mc eeldavad, et neile eraldatakse kauges masinas terminal, seda peab näitama võtmega -t

gnoom~$ ssh -t kasutaja2@reptilus.zoo.tartu.ee mc

Failide kopeerimine

SSH võimaldab masinate vahel käsuga scp faile kopeerida järgmise süntaksi kohaselt scp võti kasutaja1@masin1.nimi:/kataloog1/failinimi1 kasutaja2@masin2.nimi:./kataloog2/failinimi2

Mõlemad argumendid koosnevad kahest osast, mida eraldab koolon (:)

  • masina nimi
  • failinimi

Kui failinimi algab punktiga (.), siis näitab see faili asukohta vastava masina kasutaja kodukataloogi suhtes; muidu on tegu absoluutse nimega.

Esimeseks argumendiks on kopeeritava faili nimi ja teiseks nimi, millega ta teises masinas salvestatakse.

Programm scp näitab kopeerimise ajal progressi. Kasutades võtit -A seda ei tehta.

Korralduse täitmisele eelneb eelkirjeldatud autentimine, kusjuures kehtivad võimalused võtmeid mälus hoida. Näiteks kopeerib kasutaja priit faili priidupilt.jpg teisest masinast kohalikku

gnoom~$ scp priidu@reptilus.zoo.tartu.ee:./public_html/priidupilt.jpg priidupilt.jpg
priidupilt.jpg | 6600 KB | 179.7 kB/s | ETA: 00:03:00 | 83%

Võimalik on kopeerida faile ka nö teise ja kolmanda masina vahel, see tähendab, et ei see, kust fail võetakse ega see, kuhu ta pannakse, pole masin, mille viip teil ees on

gnoom~$ scp priidu@reptilus.zoo.tartu.ee:./pilt.jpg priidik@mammal.zoo.tartu.ee:./pildid/pingu.jpg

Failide kopeerimisel saab kasutada ka IOga manipuleerimist, näiteks kasutaja arhiveerib kataloogi ~/public_html sisu, pakib andmed ning saadab SSH abil üle võrgu teise masinasse; seal sisenetakse kodukataloogi ning harutatakse arhiiv lahti

gnoom~$ tar cf - ~/public_html | gzip | ssh reptilus.zoo.tartu.ee 'cd ~ && cat - > priidu.koduleht.tgz'

Oma RSA salajase võtme parooli muutmine

Oma salajase võtme parooli muutmiseks kasutage käsku ssh-keygen võtmega -p

gnoom~$ ssh-keygen -p
Enter file key is in (/home/priit/.ssh/identity):
Enter old passphrase:
Key has comment 'priit@gnoom.zoo.tartu.ee'
Enter new passphrase:
Enter the same passphrase again:
Your identification has been saved with the new passphrase.

Parooli muutmiseks on vaja vana parooli teada. Kui see on unustatud, tuleb genereerida uus RSA võtmepaar ning seda kasutama asuda.

Pordi edasisuunamine

Mitmetel põhjustel, näiteks turvalisus või kasutusmugavus võib olla abiks selle asemel, et pöörduda otse teenuse poole üle interneti aadress:port, pöörduda aadressile localhost:port.

Eemal asuva serveri pordi suunamine kohaliku masina localhost porti toimub käsuga

bash$ ssh priit@gnoom.zoo.tartu.ee -L 6565:localhost:5432

Selle tulemusena saab pöörduda localhost:6565 poole ning kasutada eemal asuva masina pordil localhost:5432 olevat teenust. Näiteks võiks sellest olla kasu kui gnoom.zoo.tartu.ee asub otse avalikus võrgus, aga seal töötav PostgreSQL andmebaas kuulab localhostil ning soovite andmebaasi kasutada kohalikus masinas töötava PgAdmin klientprogrammiga.

Kohaliku masin pordi 192.168.1.3:3306 suunamine eemal asuva arvuti gnoom.zoo.tartu.ee porti localhost:6565 toimub käsuga

bash$ ssh priit@gnoom.zoo.tartu.ee -R 6565:192.168.1.3:3306

Selle tulemusena saab eemal oleva masina kasutaja pöörduda enda arvuti localhost:6565 poole ning kasutaja teie kohaliku arvuti pordil 192.168.1.3:3306 töötavat teenust. Näiteks võiks sellest kasu olla kui teie töökohaarvutil ei ole avalikku ip aadressi ning te soovite kellelegi tutvustada mõnda oma arvutis töötavat programmi.

Uuemad SSH versioonid võimaldavad lisaks localhostile seostada nii suunatud porte ka muude võrguliidestega.

Xi rakenduste kasutamine üle võrgu

Teatavasti on Xi akende so programmide üle võrgu vedamine ebaturvaline, lisaks ka ebamugav, kuna peab paika sättima DISPLAY keskonnamuutujat või näitama selle ära käsureal, näiteks

gnoom~$ gimp -display reptilus.zoo.tartu.ee:0

Peale selle on vaja Xserveris ära näidata käsuga xhost, milline kasutaja ja millisest masinast võib seal aknaid avada.

SSH teeb asja turvalisemaks ja lihtsamaks. Näiteks käivitame teise masina programmi xterm nii, et programm avaneb kohalikus Xserveris aknana: retpilus~$ ssh gnoom.zoo.tartu.ee /usr/X11R6/bin/xterm

Ning kui avanenud xterm'ist käivitada järgnevalt programme, toimub andmete liikumine samuti üle üle SSH kanali ning aknad avatakse selles Xserveris, kus see xtermi aken asub.

Kasulikud lisamaterjalid