Posledná zmena: 7/9/2021
Secure shell je kombinácia klienta a servera, pomocou ktorých sa môžete
pripájať na vzdialené servery podobne ako použitím príkazu
"telnet
" - s výnimkou toho, že spojenie bude šifrované a teda
bezpečné! V dnešnej dobe by som odporúčal používať namiesto telnetu výlučne
SSH, pretože ho úplne nahrádza a ponúka (okrem šifrovania) aj ďalšie
vymoženosti.
Na Internete sú rozšírené dve rôzne "verzie" SSH: komerčné "ssh
", ktoré je (vraj - treba si pozrieť
licenciu) za určitých podmienok použiteľné aj zadarmo a voľne použiteľné "OpenSSH". Princíp činnosti a konfigurácia sú
rovnaké alebo veľmi podobné, v tomto texte sa budem zaoberať iba balíčkom
"OpenSSH".
Základom balíčka je démon "sshd
", ktorého úlohou je počúvať na
porte 22 a reagovať na prichádzajúce spojenia. Po pripojení sa vytvorí nový
proces na obsluhu požiadavky, nasleduje autentifikácia používateľa a potom
proces "sshd
" zmení identitu na práve prihláseného používateľa
(zdá sa, že úplne korektne až od verzie OpenSSH 3.4, doteraz sa procesy javili
ako rootovské). Na pripojenie sa používa klientský program "ssh
¨.
Bleskový návod na pripojenie pomocou SSH:
ssh -l login server.example.com
resp.
ssh login@server.example.com
Po zadaní niektorého z týchto príkazov sa pripojíte na server
"server.example.com
" ako používateľ "login".
Autentifikácia štandardne prebieha zadaním hesla pre dané používateľské meno
a server.
Existujú dve verzie protokolu SSH označované ako SSH1 a SSH2.
Preložené z manuálu SSH ("man sshd
"):
Každý server má vytvorený RSA identifikačný kľúč (default: 1024 bitov), ktorý ho jednoznačne identifikuje. Pri štarte démona sa okrem toho vytvára ďalší RSA kľúč (default: 768 bitov), ktorý sa generuje každú hodinu (3600 sekúnd), ak bol aspoň raz použitý. Tento kľúč sa neukladá na disk.
Keď sa klient pripojí na démona, ten mu sprístupní svoje verejné RSA kľúče. Klient porovná verejný identifikačný RSA kľúč servera so svojou uloženou kópiou (ak existuje), aby detekoval zmeny kľúča (ku ktorým za normálnych okolností dochádza zriedkavo - typicky po preinštalovaní SSH servera). Klient potom vygeneruje náhodné 256-bitové číslo, zašifruje ho obomi verejnými kľúčmi servera a pošle mu ho. Ten si ho vie dešifrovať vďaka privátnym kľúčom. Toto číslo používajú obe strany ako symetrický kľúč počas ďalšej komunikácie (symetrické šifrovanie je oveľa rýchlejšie ako asymetrické) - používajú sa šifry 3DES a Blowfish (šifrovací algoritmus vyberá klient z ponuky servera).
Nasleduje autentifikácia. Klient sa pokúša autentifikovať pomocou
".rhosts
", ".rhosts
" s RSA autentifikáciou
klientského počítača, čistou RSA autentifikáciou alebo pomocou hesla.
Preložené z manuálu SSH ("man sshd
"):
Každý server má identifikačný DSA kľúč, ktorý ho jednoznačne identifikuje. Pri štarte démona sa však nevytvára serverový kľúč. Na základe výmeny kľúčov Diffie-Hellmanovým algoritmom získajú obe strany kľúč, ktorý sa použije na symetrické šifrovanie - používajú sa Blowfish, 3DES a ďalšie (šifrovací algoritmus vyberá klient z ponuky servera).
Protokol SSH2 ponúka dve prístupové metódy: autentifikáciu verejným kľúčom
alebo pomocou hesla. Autentifikácia pomocou súborov ".rhosts
" je
nebezpečná a nemala by sa vôbec používať ani v prípade SSH1.
Z väčšej časti prebieha konfigurácia SSH démona upravením konfiguračného
súboru "/etc/ssh/sshd_config
". Táto konfigurácia je veľmi
dôležitá a zaujímavá, ale už po niekoľkých inštaláciách OpenSSH sa z nej stane
rutinná záležitosť.
/etc/ssh/sshd_config
"Ukážka konfiguračného súboru (OpenSSH 3.4). Komentované direktívy po inštalácii obsahujú defaultné hodnoty, netreba ich teda odkomentovať.
#Port 22 Protocol 2,1 #ListenAddress 0.0.0.0 #ListenAddress :: # HostKey for protocol version 1 HostKey /etc/ssh/ssh_host_key # HostKeys for protocol version 2 HostKey /etc/ssh/ssh_host_rsa_key HostKey /etc/ssh/ssh_host_dsa_key # Lifetime and size of ephemeral version 1 server key #KeyRegenerationInterval 3600 #ServerKeyBits 768 # Logging #obsoletes QuietMode and FascistLogging #SyslogFacility AUTH #LogLevel INFO # Authentication: #LoginGraceTime 600 PermitRootLogin no #StrictModes yes #RSAAuthentication yes #PubkeyAuthentication yes #AuthorizedKeysFile .ssh/authorized_keys # rhosts authentication should not be used RhostsAuthentication no # Don't read the user's ~/.rhosts and ~/.shosts files IgnoreRhosts yes # For this to work you will also need host keys in /etc/ssh/ssh_known_hosts #RhostsRSAAuthentication no # similar for protocol version 2 #HostbasedAuthentication no # Change to yes if you don't trust ~/.ssh/known_hosts for # RhostsRSAAuthentication and HostbasedAuthentication IgnoreUserKnownHosts no # To disable tunneled clear text passwords, change to no here! PasswordAuthentication yes PermitEmptyPasswords no # Change to no to disable s/key passwords ChallengeResponseAuthentication no # Kerberos options #KerberosAuthentication no #KerberosOrLocalPasswd yes #KerberosTicketCleanup yes #AFSTokenPassing no # Kerberos TGT Passing only works with the AFS kaserver #KerberosTgtPassing no # Set this to 'yes' to enable PAM keyboard-interactive authentication # Warning: enabling this may bypass the setting of 'PasswordAuthentication' #PAMAuthenticationViaKbdInt yes X11Forwarding yes #X11DisplayOffset 10 #X11UseLocalhost yes #PrintMotd yes #PrintLastLog yes #KeepAlive yes #UseLogin no UsePrivilegeSeparation yes #Compression yes #MaxStartups 10 # no default banner path #Banner /some/path #VerifyReverseMapping no # override default of no subsystems Subsystem sftp /usr/lib/ssh/sftp-server
Najdôležitejšie direktívy:
sshd
" (default: 22)sshd
" (default: všetky sieťové
rozhrania servera)sshd
" tak, že počas autentifikácie
nebeží s právami roota, ale špeciálneho používateľa (ssh). Po autentifikácii
proces zmení identitu na autentifikovaného používateľa. Táto direktíva
existuje od verzie OpenSSH 3.4 (jún/2002)
a všetci by ste mali upgradovať minimálne na túto verziu čo najskôr kvôli
bezpečnostným rizikám nižších verzií!!!.rhosts
"sshd
" skontroluje práva a vlastníka
používateľských súborov a domáceho adresára. Ak sú súbory zapisovateľné pre
všetkých, odmietne prihlásenie/etc/hosts.equiv
", resp. ".rhosts
"./etc/hosts.equiv
", resp. ".rhosts
" spolu s úspešnou
RSA autentifikáciou klientského počítačalogin
" pre
interaktívne prihlásenie (práca s terminálom). Pre vzdialené vykonávanie
príkazov pomocou "ssh
" sa nepoužíva.
"sshd
" ponúka niekoľko spôsobov, ktoré pomôžu obmedziť prístup
používateľov:
/etc/ssh/sshd_config
". Pozor! Kombinácia direktív
Allow../Deny.. mi nefungovala! V manuáli o tom (ako inak) nie je ani slovo.../etc/hosts.allow
", "/etc/hosts.deny
"), ak bol
démon skompilovaný s knižnicou "libwrap
" (o tom sa môžete
jednoducho presvedčiť príkazom "ldd `which sshd`
").
Debianovské balíčky pre Potato a Woody boli skompilované s knižnicou
"libwrap
".Ak nainštalujete balíčkovú verziu OpenSSH, o generovanie kľúčov sa nemusíte starať - urobí to za vás väčšinou poinštalačný alebo spúšťací skript. Ak ste však skompilovali OpenSSH sami alebo ste zmenili podporu protokolu (typicky z SSH1 na SSH2), treba vygenerovať privátne a verejné kľúče pre váš server a protokol:
ssh-keygen -t rsa1 -f /etc/ssh/ssh_host_key -N ''
ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N ''
Parametre:
sshd
" vedel spustiť a pracovať s kľúčom bez
interakcie so správcom servera, ktorý by zadal heslo)
Nové kľúče sú platné po reštartovaní "sshd
" démona:
/etc/init.d/sshd restart
Pozor! Ak ste vygenerovali nové kľúče, pri ďalšom prihlasovaní na váš server zobrazí klient hlásenie o ich zmene!
Klientský program "ssh
" má množstvo parametrov na príkazovom
riadku. Okrem nich ho však možno predkonfigurovať aj pomocou globálneho
konfiguračného súboru (default: "/etc/ssh/ssh_config
"), resp.
používateľského konfiguračného súboru (default: "~/.ssh/config
").
Pre bližšie informácie pozri "man ssh
.
Parametre na príkazovom riadku:
Prihlásenie na server s adresou "server.example.com
"
s používateľským menom "login". Ak nezadáte používateľské meno, použije sa
aktuálne meno používateľa:
ssh -l login server.example.com
resp.
ssh login@server.example.com
Prihlásenie na server s adresou "server.example.com
"
s používateľským menom "login". Ak nezadáte používateľské meno, použije sa
aktuálne meno používateľa. Po prihlásení sa nespustí interaktívny shell,
namiesto toho sa vykoná príkaz zadaný ako posledný parameter (vhodné napríklad
na vykonanie zálohovania na vzdialenom serveri a pod.):
ssh -l login server.example.com prikaz
resp.
ssh login@server.example.com prikaz
Parametrov je samozrejme viac, ale po niekoľkých rokoch používania SSH som nijaké iné takmer nikdy nepotreboval.
/etc/ssh/ssh_config
"
("~/.ssh/config
")
Konfiguračný súbor "/etc/ssh/ssh_config
" obsahuje nastavenia
klientského programu "ssh
", ktoré sa uplatnia pri každom
používaní. Súbor "~/.ssh/config
" (v domácom adresári používateľa)
a parametre na príkazovom riadku však majú prednosť.
Konfiguračný súbor obsahuje direktívy platné pre jednotlivé počítače, na ktoré
sa pripájate - platnosť určuje direktíva "Host adresa
". Za touto
direktívou nasledujú direktívy s parametrami prihlasovania (napr. šifrovací
algoritmus).
Ukážka konfiguračného súboru "/etc/ssh/ssh_config
":
# Host * # ForwardAgent no # ForwardX11 no # RhostsAuthentication no # RhostsRSAAuthentication yes # RSAAuthentication yes # PasswordAuthentication yes # FallBackToRsh no # UseRsh no # BatchMode no # CheckHostIP yes # StrictHostKeyChecking yes # IdentityFile ~/.ssh/identity # IdentityFile ~/.ssh/id_dsa # IdentityFile ~/.ssh/id_rsa1 # IdentityFile ~/.ssh/id_rsa2 # Port 22 # Protocol 2,1 # Cipher blowfish # EscapeChar ~ Host * ForwardAgent yes ForwardX11 yes Cipher blowfish TransmitInterlude 100 StrictHostKeyChecking no
known_hosts
".aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,arcfour,
aes192-cbc,aes256-cbc,rijndael128-cbc,rijndael192-cbc,
rijndael256-cbc,rijndael-cbc@lysator.liu.se
"gzip
" (1: rýchla, slabá kompresia; 9: pomalá, najlepšia
kompresia). Default: 6.rsh
". Tento parameter by ste vždy mali
nastaviť na "no".known_hosts
" a v prípade, že došlo k zmene kľúča. Hodnoty:
known_hosts
". V prípade zmenených kľúčov sa vypíše výstražný
text a pripojenie sa neuskutoční. Ak ste si istí, že zmena kľúča je
v poriadku, musíte ručne vymazať záznam pre daný server zo súboru
"~/.ssh/known_hosts
" (jeden záznam = jeden dlhý riadok)known_hosts
". V prípade zmenených kľúčov sa vypíše výstražný
text a pripojenie sa neuskutoční. Ak ste si istí, že zmena kľúča je
v poriadku, musíte ručne vymazať záznam pre daný server zo súboru
"~/.ssh/known_hosts
" (jeden záznam = jeden dlhý riadok)
Ak používate iného klienta, napr. "Putty
", problémov je
menej. Stačí nastaviť adresu vzdialeného servera a zadať používateľské meno.
Ak budete používať autentifikáciu pomocou verejného kľúča, treba postupovať
podľa návodu v danom programe.
Používateľ sa autentifikuje pomocou svojho hesla. Tento postup je celkom
rovnaký ako pri použití programu "telnet
" alebo konzoly, preto
k nemu niet čo dodať. Snáď len toľko, že ho podporujú obe verzie protokolu
SSH.
Aby ste mohli využívať tento spôsob autentifikácie, treba si najprv vytvoriť
pár kľúčov (privátny a verejný). Kľúče vytvárate na počítači, z ktorého sa
budete prihlasovať na vzdialený server. Privátny kľúč si ponecháte,
verejný prekopírujete na vzdialený server (text kľúča treba pridať do súboru
"~/.ssh/authorized_keys
" (RSA) resp. do súboru
"~/.ssh/authorized_keys2
" (DSA/SSH2) na vzdialenom serveri).
Kľúče vytvoríte pomocou programu "ssh-keygen
". Postup je
takmer rovnaký ako pri vytváraní kľúčov pre server, s tým rozdielom, že tieto
kľúče si môže vygenerovať ľubovoľný používateľ a že tentokrát budeme používať
heslo pre prístup k privátnemu kľúču:
SSH1, RSA:
Program si vypýta heslo pre privátny kľúč. Toto heslo budete používať pri autentifikácii namiesto hesla na daný server! Toto heslo by malo byť dostatočne zložité.
Pozor! Ak zabudnete heslo, neexistuje spôsob, ako ho získať späť! Budete si musieť vygenerovať nový pár kľúčov.
ssh-keygen -t rsa1 Generating public/private rsa1 key pair. Enter file in which to save the key (/home/login/.ssh/identity): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/login/.ssh/identity. Your public key has been saved in /home/login/.ssh/identity.pub.
Program "ssh-keygen
" vytvorí dva súbory:
"~/.ssh/identity
" s privátnym kľúčom
a "~/.ssh/identity.pub
" s verejným (public) kľúčom. Teraz treba
skopírovať verejný kľúč na vzdialený server:
scp ~/.ssh/identity.pub login@server.example.com:.ssh/tempPrihláste sa na vzdialený server (ešte stále pomocou klasického hesla!)
ssh login@server.example.com
Vojdite do adresára ".ssh
" a vykonajte tieto príkazy:
cd .ssh cat temp >> authorized_keys rm temp
SSH2, RSA:
Program si vypýta heslo pre privátny kľúč. Toto heslo budete používať pri autentifikácii namiesto hesla na daný server! Toto heslo by malo byť dostatočne zložité.
Pozor! Ak zabudnete heslo, neexistuje spôsob, ako ho získať späť! Budete si musieť vygenerovať nový pár kľúčov.
ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/home/login/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/login/.ssh/id_rsa. Your public key has been saved in /home/login/.ssh/id_rsa.pub.
Program "ssh-keygen
" vytvorí dva súbory:
"~/.ssh/id_rsa
" s privátnym kľúčom
a "~/.ssh/id_rsa.pub
" s verejným (public) kľúčom. Teraz treba
skopírovať verejný kľúč na vzdialený server:
scp ~/.ssh/id_rsa.pub login@server.example.com:.ssh/tempPrihláste sa na vzdialený server (ešte stále pomocou klasického hesla!)
ssh login@server.example.com
Vojdite do adresára ".ssh
" a vykonajte tieto príkazy:
cd .ssh cat temp >> authorized_keys rm temp
SSH2, DSA:
Program si vypýta heslo pre privátny kľúč. Toto heslo budete používať pri autentifikácii namiesto hesla na daný server! Toto heslo by malo byť dostatočne zložité.
Pozor! Ak zabudnete heslo, neexistuje spôsob, ako ho získať späť! Budete si musieť vygenerovať nový pár kľúčov.
ssh-keygen -t dsa Generating public/private dsa key pair. Enter file in which to save the key (/home/login/.ssh/id_dsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/login/.ssh/id_dsa. Your public key has been saved in /home/login/.ssh/id_dsa.pub.
Program "ssh-keygen
" vytvorí dva súbory:
"~/.ssh/id_dsa
" s privátnym kľúčom
a "~/.ssh/id_dsa.pub
" s verejným (public) kľúčom. Teraz treba
skopírovať verejný kľúč na vzdialený server:
scp ~/.ssh/id_dsa.pub login@server.example.com:.ssh/tempPrihláste sa na vzdialený server (ešte stále pomocou klasického hesla!)
ssh login@server.example.com
Vojdite do adresára ".ssh
" a vykonajte tieto príkazy:
cd .ssh cat temp >> authorized_keys2 rm temp
Týmto ste pridali verejný kľúč do súboru, v ktorom ho bude "sshd
"
počas vašej ďalšej autentifikácie hľadať. Odhláste sa a skúste sa opätovne
prihlásiť.
ssh login@server.example.com
Mali by ste vidieť text typu:
Enter passphrase for RSA key 'login@server.example.com':
Zadajte heslo pre privátny kľúč. To je všetko.
Ak použijete SSH, okrem shellovského prístupu na vzdialený server získavate aj
čosi navyše - dva protokoly na prenos súborov! Jeden z nich
("scp
") funguje pre SSH1 aj SSH2, druhý ("sftp
") je
určený iba pre SSH2. Oba ponúkajú šifrovanie sieťovej prevádzky, takže sa
nikto nedostane k vašim heslám.
Autentifikácia používateľa prebieha úplne rovnako ako pri interaktívnom
prihlasovaní cez "ssh
", t.j. ak máte vytvorené kľúče, budú sa
používať.
Ak sa rozhodnete používať "scp
" resp. "sftp
", budete
potrebovať klienta (server už máte). Ak chcete klienta pre Linux (Unix),
vlastne ho máte tiež. Na kopírovanie súborov existujú rovnomenné klientské
programy "scp
", resp. "sftp
". Ak budete chcieť
používať Windows, odporúčam českého "scp
" klienta "WinSCP", ktorý je zadarmo. Existujú aj
klienti podporujúci "sftp
" pre Windows, sám som však testoval iba
jedného ("SecureFX
"), ktorý už zadarmo nebol. Fungovať by mal aj
free program FileZilla
(sftp/scp).
Používanie GUI klientov je jednoduché, pretože sa od vás očakávajú rovnaké
údaje ako pri pripájaní pomocou SSH ("Putty
"), čiže adresa servera
a prihlasovacie meno. Namiesto toho napíšem niečo o používaní
"scp
" a "sftp
" pod Linuxom.
Ak chcete používať "sftp
", na vzdialenom serveri musí
konfiguračný súbor "/etc/ssh/sshd_config
" obsahovať direktívu
"Subsystem sftp /usr/lib/ssh/sftp-server
". Na klientskom počítači
stačí spustiť program "sftp
":
sftp server.example.com
resp.
sftp login@server.example.com
Práca s klientom je takmer úplne rovnaká ako práca s bežným "ftp
"
klientom, iba sada príkazov je trochu oklieštená (napr. chýba
"mget
" / "mput
"). Základné operácie ale určite
zvládnete, prípadne môžete zadať príkaz "help
". Len pozor,
"sftp
" klient nie je veľmi ukecaný...
scp sa používa trochu jednoduchšie, pretože neopúšťate pohodlie svojho shellu, môžete používať hviezdičkové a otáznikové masky a podobné zvrhlosti. Pri určovaní vzdialeného súboru na kopírovanie sa používa podobná syntax ako pri NFS (network file system):
Kopírovanie vzdialeného súboru "pokus.txt
" z domáceho adresára zo
servera "server.example.com
" na lokálny počítač (do aktuálneho
adresára):
scp login@server.example.com:pokus.txt .
Kopírovanie vzdialeného súboru "/var/spool/mail/login
" zo servera
"server.example.com
" na lokálny počítač do adresára
"/tmp
":
scp login@server.example.com:/var/spool/mail/login /tmp/
Kopírovanie viacerých lokálnych súborov z domáceho adresára na vzdialený server:
scp .bash* login@server.example.com:
Skutočná lahôdka (a či zvrhlosť): kopírovanie súboru medzi dvomi vzdialenými počítačmi:
scp login@server2.example.com:.bash* login@server.example.com:
Ako vidíte, je to elegantné, krásne a jednoduché, najmä pre tých, ktorí už používali NFS (pribudlo len používateľské meno).
Po nainštalovaní a otestovaní "sshd
" odstráňte (zakomentujte)
z "inetd.conf
" riadok, ktorý zabezpečuje spúšťanie
"telnetd
" a reštartujte "inetd
" (ak
"telnetd
" spúšťate samostatne, odstráňte jeho spúšťací skript,
zastavte démona a prípadne ho odinštalujte):
telnet stream tcp nowait root /usr/sbin/tcpd /usr/sbin/in.telnetd
Odporúčam tiež, aby ste namiesto FTP používali "sftp
" resp.
"scp
", ktoré umožňuje to isté, ale so šifrovaným prenosom. Ak
súhlasíte, odstráňte (zakomentujte) z "inetd.conf
" riadok, ktorý
zabezpečuje spúšťanie "ftpd
" a reštartujte "inetd
"
(ak "ftpd
" spúšťate samostatne, odstráňte jeho spúšťací skript,
zastavte démona a prípadne ho odinštalujte):
ftp stream tcp nowait root /usr/sbin/tcpd /usr/sbin/in.ftpd
Ešte raz pripomínam, že po zmene "inetd.conf
" treba reštartovať
"inetd
":
/etc/init.d/inetd reload
resp.
killall -HUP inetd
A nakoniec skúška správnosti. Presvedčte sa, že po zadaní príkazov:
telnet localhost
ftp localhost
sa zobrazí chyba
Connection refused.