Ssh

From EIK wiki

Secure shell

Autor

Ragnar Nurmla
AK32

Olemus

Secure Shell või lihtsalt SSH on võrguprotokoll mis võimaldab andmete vahetust võrguseadmete vahel üle turvalise kanali. SSH loodi asendamaks ebaturvalisi kaughaldus vahendeid, näiteks telnet, kuna need saadavad andmeid krüpteerimata kujul üle võrgu. Tänu SSH krüpteerimisele saab andmeid saata üle ebaturvalise võrgu, näiteks Internet ja säilib andmete konfidentsiaalsus ning terviklikkus. SSH on kasutuses peamiselt GNU/Linux ja Unix süsteemides, võimaldades eemalt logida kasutaja kestale (shell). Turvalisus põhineb avaliku ja salajase võtme ehk asümmeetrilisel krüptograafial. SSH kasutab klient-server mudelit.

Kasutusvaldkonnad

  • Shellile logimine (telneti asendus)
  • Korralduse täitmine eemalseisvas masinas
  • Turvaline failide kopeerimine kohalikust masinast teise (scp)
  • X11 edastus eemalseisvast masinast

Paigaldamine

Kasutades apt pakihalduse vahendit saab SSH-d paigaldada käsuga:

sudo apt-get install ssh openssh-blacklist*

Mille tulemusena paigaldadakse meie arvutisse openssh-server ja ssh, scp, sftp, openssh-blacklist ja openssh-blacklist-extra. Esimene on ssh server mis kuulab vaikimis pordil 22 ja teised kolm on kliendid eemalseisvasse masinasse logimiseks ja failide kopeerimiseks. openssh-blacklist ja openssh-blacklist-extra sisaldavad mittesoovitavaid (kergesti haavatavaid) võtmeid, mida uute võtmepaaride loomisel teatakse nende pakkide olemasolul siis vältida.

Kontrollime kas ssh server läks tööle ja kuulab pordil:

netstat -tnlp
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      2359/sshd

Tundub, et õnnestus.

Kasutamine

ssh

Kõige lihtsam viis ssh-d kasutada on ühenduse loomine eemalseisvasse masinasse, selleks anname käsu

ahven@pingviinike:~$ ssh www

Kui me loome ühendust esimest korda kasutaja ahven alt masinasse nimega www, siis kuvatakse meile järgmine tekst:

The authenticity of host 'www (10.59.1.84)' can't be established.
RSA key fingerprint is a2:35:41:54:05:37:b4:e9:69:5f:19:d3:87:74:e4:1a.
Are you sure you want to continue connecting (yes/no)? yes

Kui oleme kindlad, et just see masin on see kuhu me ühendust tahame luua kirjutame yes. Mis järel luuakse meie kodukataloogi kaust .ssh ning selle sisse fail known_hosts, mille sisse kirjutatakse serveri avalik võti.

Warning: Permanently added 'www,10.59.1.84' (RSA) to the list of known hosts.

Ning seejärel küsitakse parooli:

ahven@www's password:

Ning kui parool on õige, olemegi loonud turvalise ühenduse masinasse nimega www

ahven@www:~$

Ühenduse lõpetatakse käsuga exit

ahven@www:~$ exit
logout
Connection to www closed.
ahven@pingviinike:~$

Kui tahame luua ühendust mõne teise kasutajanimega peame kasutama võtit l millele järgi anname kasutajanime:

ahven@pingviinike:~$ ssh -l rax www
rax@www's password:

Nüüd küsitakse juba kasutaja rax parooli. Sama asja teeb ka selline käsk:

ahven@pingviinike:~$ ssh rax@www
rax@www's password:

scp

SCP on üks osa SSH pakist. See võimaldab turvaliselt kopeerida faile ühest masinast teise üle võrgu.
SCP kasutamine võiks välja näha nii:

root@pingviinike:~# scp tainas.txt rax@www:/home/rax/
rax@www's password:
tainas.txt                                                           100%    0     0.0KB/s   00:00
root@pingviinike:~#

Kohalikus masinas olev fail tainas.txt kopeeritakse kasutaja rax õigustega masinasse nimega www kausta /home/rax
Loomulikult on võimalik teha ka vastupidi:

root@pingviinike:~# scp rax@www:/home/rax/tainas.txt /root
rax@www's password:
tainas.txt                                                            100%    0     0.0KB/s   00:00
root@pingviinike:~#

Remote maisnast www kaustast /home/rax kopeeritakse fail tainas.txt kohaliku masina /root kausta.

sftp

Alternatiiv SCP kasutamisele on kasutada SFTP-d. SFTP-ga saab ühenduda masinatesse kus "jookseb" ssh server (sshd). Ühendus luuakse nagu hariliku FTP kliendiga ainult krüpteeritult. Kasutaja liides on ka nagu FTP oma, saab kasutada käske nagu näiteks ls, cd, get, put jne.
Kasutamine:

root@pingviinike:~# sftp rax@www
Connecting to www...
rax@www's password:
sftp>

Selle tulemusena tegime SFTP ühenduse masinasse www kasutaja rax kodukataloogi.

Liigutame faile ka:

sftp> put /root/oinas.txt
Uploading /root/oinas.txt to /home/rax/oinas.txt
/root/oinas.txt                                                                               100%    0     0.0KB/s   00:00
sftp>

Selle tulmusena laadisime kohalikust masina /root kataloogist faili oinas.txt remote masina kausta /home/rax
Kontrollime kas on ikka nii:

sftp> ls -l
-rw-r--r--    1 rax      rax             0 Apr 24 15:33 oinas.txt
-rw-r--r--    1 rax      rax             0 Apr 24 15:11 tainas.txt
sftp>

Tõesti fail oinas.txt on olemas.

Xi akende edastus

Üle SSH kanali on võimalik ka graafilise keskkonna aknaid suunata, seda lihtsalt ja turvaliselt. Graafiliste programmide käivitamiseks teisest masinast (serverist) ei pea seal olema installeeritud terve graafiline keskkond (gnome, x-window-system) vaid piisab paketist xbase-clients (Debian, Ubuntu). Küll aga peab olema sinu masinas (klient masinas) installeeritud X server (graafiliste akende kuvaja). Samuti peaks kontrollima kas /etc/ssh/sshd_config failis on lubatud X11 edastus. Selleks on seal rida X11Forwarding mille väärtus peab olema yes (vaikimis on yes).

Teeme ühenduse kasutades -X võtit:

rax@pingviinike:~$ ssh -X rax@www

Olles loonud ühenduse saame nüüd eemalt masinast tõmmata käima meile vajalikke graafilise programme ja kuvada neid meie kohalikus masinas.

SSH serveri seadistus

Paroolita autentimine

Kui on vaja pidevalt teha ühedusi mingisse kindlasse masinasse või kui on loodud varunduse lahendus üle ssh siis on mugav kasutada ssh autentimist ilma paroolita.

Esmalt kontrollime kas kasutaja kodukaustas, kelle nimega tahame autentida, on olemas kaust .ssh:

[rax@fjoodor ~]$ ssh rax@www ls -la
rax@www's password: 
total 24
drwxr-xr-x 2 rax  rax  4096 2010-03-13 12:51 .
drwxr-xr-x 5 root root 4096 2010-04-17 10:42 ..
-rw------- 1 rax  rax    47 2010-04-17 11:07 .bash_history
-rw-r--r-- 1 rax  rax   220 2010-02-26 11:40 .bash_logout
-rw-r--r-- 1 rax  rax  3116 2010-02-26 11:40 .bashrc
-rw-r--r-- 1 rax  rax   675 2010-02-26 11:40 .profile
[rax@fjoodor ~]$

Kuna .ssh kausta pole siis tekitame selle sinna:

ssh rax@www mkdir .ssh
rax@www's password: 
[rax@fjoodor ~]$

Ning kontrollime nüüd:

[rax@fjoodor ~]$ ssh rax@www ls -la
rax@www's password: 
total 28
drwxr-xr-x 3 rax  rax  4096 2010-04-24 10:21 .
drwxr-xr-x 5 root root 4096 2010-04-17 10:42 ..
-rw------- 1 rax  rax    47 2010-04-17 11:07 .bash_history
-rw-r--r-- 1 rax  rax   220 2010-02-26 11:40 .bash_logout
-rw-r--r-- 1 rax  rax  3116 2010-02-26 11:40 .bashrc
-rw-r--r-- 1 rax  rax   675 2010-02-26 11:40 .profile
drwxr-xr-x 2 rax  rax  4096 2010-04-24 10:21 .ssh
[rax@fjoodor ~]$

Täitsa olemas! Turvalisuse huvides peaksime tegema selle kausta ligipääsetavaks vaid selle omanikule. Selleks anname käsu:

[rax@fjoodor ~]$ ssh rax@www chmod 700 .ssh
rax@www's password: 
[rax@fjoodor ~]$

Nüüd genereerime avaliku ja salajase võtme. Seda teeme käsuga:

[rax@fjoodor ~]$ ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/home/rax/.ssh/id_dsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/rax/.ssh/id_dsa.
Your public key has been saved in /home/rax/.ssh/id_dsa.pub.
The key fingerprint is:
5c:b6:df:53:e9:0f:ce:c4:4c:2d:92:71:aa:78:b1:e0 rax@fjoodor
The key's randomart image is:
+--[ DSA 1024]----+
|                 |
|                 |
|          o . .  |
|       . o . = ..|
|        S o + o.o|
|       . o = *.o |
|        E + . B. |
|         .   + o.|
|              o .|
+-----------------+
[rax@fjoodor ~]$

-t võtmega ütleme krüpteerimis algoritmi, mis antud näites on dsa. Seejärel küsitakse kuhu kausta genereeritud võtmed pannakse, milleks vaikimisi on meie kodukaustas asuv .ssh nimeline kaust. Järgmisena pakutakse võimalust võtmele veel parool peale panna, kuna meie eesmärk on paroolita autentimine siis lähme sealt lihtsalt klahvi enter vajutades edasi ning ongi võtmed olemas.

[rax@fjoodor ~]$ ls -l .ssh/
total 16
-rw------- 1 rax rax  668 2010-04-24 10:30 id_dsa
-rw-r--r-- 1 rax rax  601 2010-04-24 10:30 id_dsa.pub
-rw-r--r-- 1 rax rax  398 2010-04-24 10:16 known_hosts
[rax@fjoodor ~]$

Nüüd peame toimetama avaliku võtme turvalist teed pidi masinasse kuhu tahame ühendust luua. Eesmärk on meie genereeritud avalik võti paigutada masina www kasutaja rax kodukasutas olevasse faili authorized_keys mis asub kataloogis .ssh. Seda püüame saavutada nii:

[rax@fjoodor ~]$ cat .ssh/id_dsa.pub | ssh rax@www 'cat >> .ssh/authorized_keys'
rax@www's password:

Selle tulemusena lisame äsja genereeritud avaliku võtme faili .ssh/authorized_keys, oluline on just lisada mitte seda faili üle kirjutada kuna seal võib ees juba olla mõne teise masina avalik võti. Kui nüüd viga ei tekkinud siis võib eeldada et kõik õnnestus ja meie eesmärk on täidetud. Kontrollime:

[rax@fjoodor ~]$ ssh rax@www
Linux www 2.6.26-2-686 #1 SMP Wed Feb 10 08:59:21 UTC 2010 i686
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Sat Apr 24 10:46:32 2010 from pingviinike.lan
rax@www:~$

Jah tõesti meie käest ei küsitud enam autentimiseks parooli.

SSH konfiguratsioonfail

Kõik varasemad näited katavad stsenaariume kus kasutaja peab ühenduse loomiseks kasutama kasutajanime ning serveri hosti. Mis saab siis kui masinaid millega on vaja ühenduda on rohekm kui üks? Kui erinevad masinad kasutavad erinevaid võtmeid? Kui mõnda masinasse ei saa otse vaid ainult läbi mõne kindla masina? Selleks, et seda kõike paremini hallata, on SSH'l olemas konfiguratiooni fail mis lubab kõike seda paremini hallata ning teha kasutaja jaoks SSH kasutamine igapäevaselt oluliselt mugavamaks.

~/.ssh/config või $HOME/.ssh/config on kasutajapõhine ssh seadistuste fail kus on võimalik defineerida parameetreid mida süsteem peab kasutama erinevate masinatega ühendamiseks.

Näide

Kasutaja peab logima masinasse dev.example.com kasutades porti 22000 ning kasutajat foo (eeldame, et SSH võtmed on varasemalt juba seadistatud - Ssh#Paroolita_autentimine):

$ ssh foo@dev.example.com -p 22000

Täpselt sama asja on võimalik saavutada oluliselt mugavamalt lisades faili ~/.ssh/config järgmised read:

Host dev
   HostName dev.example.com
   Port 22000
   User foo

Ning käivitades seejärel järgneva käsu:

$ ssh dev

Mingil hetkel saab kasutaja õiguse ligi saada ka masinale prod.example.com pordile 22001 ning kasutajaks on foo:

$ ssh foo@prod.example.com -p 22001

Et teha elu mugavamaks tuleks lisada faili ~/.ssh/config järgmised read:

Host prod
   HostName prod.example.com
   Port 22001
   User foo

Seejärel saab logida antud masinasse sisse lihtsalt:

$ ssh prod


Näite kokkuvõte

Kui algselt pidi kasutaja kahte erinevasse masinasse ühendudes kasutama järgmisi käske:

 $ ssh foo@dev.example.com -p 22000
 $ ssh foo@prod.example.com -p 22001

siis peale faili ~/.ssh/config järgmiste ridade lisamist

Host dev
   HostName dev.example.com
   Port 22000
   User foo
Host prod
   HostName prod.example.com
   Port 22001
   User foo

saab ta teha seda oluliselt lihtsamalt:

$ ssh dev
$ ssh prod

Nagu näitest on näha, peab kasutaja meelde jätma ainult tema poolt defineeritud hosti aliase (dev, prod) ning kõik muu (port, kasutaja, tegelik host) on tema eest peidus.


Formaat

Faili ~/.ssh/config muutes tuleb meeles pidada:

  • Üks konfiguratsiooni parameeter rea kohta, parameetri nimele järgneb parameetri väärtus(väärtused
parameeter1 väärtus
parameeter2 väärtus1 väärtus2
  • Parameetri nime ja väärtuse/väärtuste vahel võib tühiku asemel kasutada ka = märki
parameeter1=väärtus
parameeter2=väärtus1 väärtus2
  • Tühje ridu ignoreeritakse
  • Kõik read mis algavad hashiga (#) ignoreeritakse
  • Kõik parameetrite väärtused on tõstutundlikud (case-sensitive)
  • Parameetrite nimed ei ole tõstutundlikud


Parameetrid

Enimkasutatavad parameetrid ja nende tähendus/kasutus:

  • Host - alias reaalsele host masinale (mida kasutatakse siis hiljem ssh käsus)
  • HostName - määrab reaalse host masina
  • Post - määrab pordi kuhu tuleb ühenduda
  • User - kasutajanimi mida kasutatakse ühenduse loomiseks (kellena sisse logida)
  • IdentityFile - määratakse ära millist võtme faili ühenuse loomiseks kasutatakse.
$ ssh foo@dev.example.com -p 222 -i ~/.ssh/dev.key
Host dev
  HostName dev.example.com
  Port 222
  User foo
  IdentityFile ~/.ssh/dev.key

~/.ssh/config failis on võimalik kasutada kõiki parameetreid mida saab kasutada ka tavalise ssh käsu puhul (-p, -i jne).

Täielik list kõigist parameetritest on nähtavad järgmise käsuga:

$ man ssh_config

Jagatud seaded

Mõnikord võib tekkida olukord, kus erinevate masinate seaded (parameetri ja väärtuse paar) on samad. Sellisel juhul pole alati mõtet defineeri antud parameetrit kõigis hostides vaid tasuks kasutada * (wildcard) sümbolit aliase definitsioonis.

Võtame juba varem olnud näite (dev.example.com ja prod.example.com):

# Dev masin
Host dev
  HostName dev.example.com
  Port 22000

# Prod masin
Host prod
  HostName prod.example.com
  Port 22001

# Kõik masinad
Host *
  User foo
  IdentityFile ~/.ssh/example.key

Antud näite puhul saavad dev ja prod aliased User väärtuse * blokist, samamoodi kasutatakse mõlema ühenduse puhul sama võtit.


Lisame juurde kolmanda masina foo.personal.com ning GitHubi

 # Dev masin
Host example-dev
  HostName dev.example.com
  Port 22000

# Prod masin
Host example-prod
  HostName prod.example.com
  Port 22001

# Mingi isiklik masin
Host personal
  HostName foo.personal.com
  User bar

#GitHub
Host github
  HostName github.com
  User foogh

# Kõik example-* masinad
Host example-*
  User foo
  IdentityFile ~/.ssh/example.key

# Kõik masinad
Host *
  User foo
  IdentityFile ~/.ssh/foo.key
  

Antud näite puhul saavad example-dev ja example-prod masinad User ning IdentityFile parameetri väärtuse aliaselt example-* ning kõik teised aliased (millel pole defineeritud User või IdentityFile parameetreid saavad antud väärtused * aliaselt.


Jumphost

Olukorras, kus avalikult on kättesaadav ainult üks masin ning kõik teised on avaliku masinaga samas privaatvõrgus, tuleks kasutada sellist asja nagu jumphost.

Jumphosti puhul ühendutakse alguses avaliku masina külge ning sealt edasi minnakse siis juba konkreetsesse privaatsesse masinasse (mis peab olema jumphosti poolt kättesaadav).


Võtame sama näite, kuid nüüd pole antud masinad enam otse kättesaadavad.

# Dev masin - ei ole avalikult kättesaadav
Host dev
  HostName dev.example.com
  Port 22000

# Prod masin - ei ole avalikult kättesaadav
Host prod
  HostName prod.example.com
  Port 22001

# Avalik masin - asub pordil 22
Host public
  HostName pub.example.com

# Kõik masinad kasutavad sama kasutajanime ning võtit
Host *
  User foo
  IdentityFile ~/.ssh/example.key
$ ssh dev
ssh: connect to host dev.example.com port 22000: No route to host

$ ssh prod
ssh: connect to host prod.example.com port 22001: No route to host


Selleks, et oleks võimalik ligi saada privaatsetele masinatele (dev ja prod) tuleb neisse ühenduda läbi public masina. Konfiguratsiooni tuleks muuta järgmiselt:

# Avalik masin - asub pordil 22
Host public
  HostName pub.example.com
  ForwardAgent yes # et lokaalsest masinast võti public masinasse kaasa läheks

# Dev masin - ei ole avalikult kättesaadav, siseneme sinna läbi public masina
Host dev
  HostName dev.example.com
  Port 22000
  ProxyJump public

# Prod masin - ei ole avalikult kättesaadav, siseneme sinna läbi public masina
Host prod
  HostName prod.example.com
  Port 22001
  ProxyJump public

# Kõik masinad kasutavad sama kasutajanime ning võtit
Host *
  User foo
  IdentityFile ~/.ssh/example.key

Ning kasutades käske

$ ssh dev
$ ssh prod

ühendutakse korrektselt privaatsetesse masinatesse läbi avaliku masina.