9. SSH (Secure Shell)

Posledná zmena: 7/9/2021

9.1 SSH (Secure shell)

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.

9.1.1 SSH vs. OpenSSH

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

9.1.2 Základ balíčka

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.

9.1.3 Protokol SSH1

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.

9.1.4 Protokol SSH2

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.

9.1.5 Konfigurácia SSH démona

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

9.1.5.1 Súbor "/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:

9.1.5.2 Obmedzenie prístupu

"sshd" ponúka niekoľko spôsobov, ktoré pomôžu obmedziť prístup používateľov:

9.1.5.3 Generovanie serverových kľúčov

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:

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!

9.1.6 Konfigurácia a používanie SSH klienta

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.

9.1.6.1 Príkazový riadok

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.

9.1.6.2 Súbor "/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

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.

9.1.6.3 Autentifikácia heslom

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.

9.16.4 Autentifikácia pomocou verejného kľúča

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

9.1.6.5 Generovanie kľúčov

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/temp
Prihlá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/temp
Prihlá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/temp
Prihlá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.

9.1.7 Používanie sftp a scp

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):

  1. znak "@" oddeľuje používateľské meno a adresu vzdialeného servera
  2. znak ":" oddeľuje adresu vzdialeného servera a cestu k súboru
  3. ak cesta nezačína znakom "/", považuje sa za relatívnu cestu vzhľadom na domáci adresár používateľa
  4. ak cesta nie je určená (za znakom ":" je prázdny reťazec), uvažuje sa defaultne s domácim adresárom

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

9.1.8 Vypnutie nebezpečných služieb (telnet, ftp)

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.