Ssh
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.