V dávných dobách, kdy byly v síti pouze relativně malé skupiny účastníků, se zabezpečení nikterak neřešilo. Uživatelé a administrátoři používali pro vzdálené připojení nezabezpečené nástroje typu telnet, rsh, ftp nebo rcp. Způsobů, jak řešit zabezpečení přenosu i autentizace, je mnoho, ale právě SSH je známé jako velice flexibilní a hlavně jednoduše nasaditelný nástroj, který nepotřebuje rozsáhlou podporu v infrastruktuře.
Co je to SSH
SSH neboli Secure Shell mate lidi svým názvem, který byl zvolen podle svého "nebezpečného" předchůdce, programu rsh (remote shell). Ve skutečnosti žádný shell neposkytuje, to je záležitost hostitelského operačního systému. SSH dělá pouze jedinou věc a dělá ji velice dobře, vytváří transparentně šifrovaný komunikační kanál mezi dvěma místy v síti. Díky transparentnímu šifrování se programy, které komunikují přes zabezpečenou linku, nemusí o přítomnost SSH, anebo nějaké další zabezpečení, starat.
K čemu se dá použít
- vzdálené přihlášení - můžete se bezpečně přihlásit ke vzdálenému systému;
- přenos souborů - bezpečný způsob přenosu souborů přes síť programy sftp a scp;
- spouštění příkazů na vzdálených počítačích - útočník nezjistí, jaké programy spouštíme a jaký je jejich výstup;
- směrování portů - snadné zabezpečení nešifrovaného přenosu, včetně směrování protokolu X11.
Vzdálené přihlášení k terminálu
Pravděpodobně nejznámější použití, kdy se díky SSH přihlásíme na svůj uživatelský účet na vzdáleném počítači. Použití je velice jednoduché.
michal@localhost ~$ uname Linux michal@localhost ~$ ssh uzivatel@serverdomenacom uzivatel@serverdomenacom's password: Last login: Mon Mar 27 12:57:54 2006 from gateway.isp.com uzivatel@server:~$ uname FreeBSD
V tomto příkladu jsem se přihlásil ze svého počítače se systémem Linux (s velice nenápaditým názvem localhost) na vzdálený systém, který běží na FreeBSD (s rovněž nenápaditým jménem server). Pokud je náhodou vaše uživatelské jméno na obou strojích stejné, můžete pochopitelně prefix uzivatel@ vynechat.
Jak probíhá komunikace
SSH pracuje na architektuře typu klient/server a pro správné fungování musí být na počítači localhost klient SSH a na počítači server sshd (server SSH). V okamžiku, kdy klient odešle příkaz pro připojení na server, se mezi počítači vytvoří šifrovaný kanál a veškerá komunikace probíhá pouze tímto šifrovaným kanálem. Následuje autentizace uživatele, která zde probíhá pomocí hesla. Klient zadá uživateli výzvu a potom je pošle oním zašifrovaným kanálem serveru, který je ověří a v případě úspěchu povolí přihlášení. Všimněte si, že i samotné heslo je přenášeno šifrovaně, takže je útočník nemůže přečíst, jako v případě rsh.
Identifikace serveru
Předchozí popis byl velice zjednodušený. Už z principu fungování protokolu IP nemůžeme zaručit, že se vždy dostaneme na server.domena.com. Například podvržením odpovědi DNS serveru, který se stará o překlad názvu domény na IP adresu, se můžeme připojit na útočníkův server, kterému pošleme heslo. To, že je šifrované, mu nevadí, protože jeho SSH démon zná klíč a heslo dokáže rozšifrovat. Protokol SSH s takovouto situací počítá a umí jí předejít. Nejen server vyžaduje identifikaci po klientovi, ale i klient vyžaduje po serveru, aby prokázal, že je skutečně tím, za něhož se vydává.
Proto, pokud se přihlašujete k novému serveru poprvé, musíte si dát trochu více práce navíc:
michal@localhost ~$ ssh uzivatel@novy-serverdomenacom The authenticity of host 'novy-server.domena.com (216.132.9.143)' can't be established. RSA key fingerprint is 35:c4:a1:c6:a1:17:99:4b:c9:08:ac:c1:b6:55:c1:1c. Are you sure you want to continue connecting (yes/no)? yes uzivatel@novy-serverdomenacom's password: uzivatel@novy-server:~$
Zde SSH klient vypíše varování o tom, že nemohl ověřit identitu serveru a ptá se vás, zda jej má přidat do seznamu známých hostitelů a vytiskne otisk (fingerprint) jeho klíče. Pokud se k danému serveru připojujete poprvé, můžete na tuto otázku bez obav odpovědět ano (ale paranoidnější z vás si mohou pochopitelně ověřit fingerprint ještě z jiného zdroje). Identifikace se uloží do souboru ~/.ssh/known_hosts.
Pokud se k danému serveru připojujete vícekrát a jeho identifikace se změní, objeví se velmi sugestivní varování:
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: POSSIBLE DNS SPOOFING DETECTED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ The RSA host key for server.domena.com has changed, and the key for the according IP address 216.132.9.142 is unchanged. This could either mean that DNS SPOOFING is happening or the IP address for the host and its host key have changed at the same time. Offending key for IP in /home/michal/.ssh/known_hosts:10 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack)! It is also possible that the RSA host key has just been changed. The fingerprint for the RSA key sent by the remote host is 15:ec:62:65:90:1d:40:12:47:08:00:bc:38:db:d6:5a. Please contact your system administrator. Add correct host key in /home/michal/.ssh/known_hosts to get rid of this message. Offending key in /home/michal/.ssh/known_hosts:53 RSA host key for server.domena.com has changed and you have requested strict checking. Host key verification failed.
To může mít dvě příčiny. Buďto správci přeinstalovali sshd (například z důvodu pádu systému), nebo se vás skutečně někdo pokouší napadnout. Rozhodně byste neměli dané varování podcenit a raději kontaktovat správce systému. Dané hlášení nezmizí do té doby, než provedete ruční úpravu souboru ~/.ssh/known_hosts. V závislosti na nastavení klienta ten buďto odmítne přihlášení, anebo alespoň vypne některé doplňkové funkce SSH (jako například X11 forwarding).
Přenosy souborů
Všichni pravděpodobně známe FTP (File Transfer Protocol), což je starý a poměrně nebezpečný protokol používaný pro přenos souborů. Nebezpečný jak z principu fungování, tak tím, že nešifruje ani data, ani heslo, která prochází volně po síti a nikterak nebrání možnému podstrčení dat útočníkem. Všichni také známe program cp, který se používá ke kopírování dat na počítači. SSH poskytuje bezpečné náhrady obou příkazů, které se nazývají sftp a scp. Funkčně mezi nimi není absolutně žádný rozdíl, pouze prvně jmenovaný se ovládá stejně jako jeho nebezpečný předek ftp a scp zase používá stejnou syntaxi jako program cp.
Příklad použití sftp. michal@localhost ~$ sftp uzivatel@serverdomenacom Connecting to server.domena.com... uzivatel@serverdomenacom's password: sftp> ls Desktop Documents WWW mail soubor.txt squeak sftp>sftp> GET soubor.txt Fetching /home/users/uzivatel/soubor.txt to soubor.txt /home/users/uzivatel/soubor.tx 100% 9 0.0KB/s 00:00 sftp>^D michal@localhost ~$ cat soubor.txt Staženo!
Příklad použití scp. michal@localhost ~$ scp uzivatel@serverdomenacom:~/soubor.txt . uzivatel@serverdomenacom's password: soubor.txt 100% 9 0.0KB/s 00:00 michal@localhost ~$ cat soubor.txt Staženo!
Scp provádí i globbing na vzdáleném systému.
michal@localhost ~$ ls soubor.* soubor.jpg michal@localhost ~$ scp uzivatel@serverdomenacom:~/soubor.* . uzivatel@serverdomenacom's password: soubor.txt 100% 9 0.0KB/s 00:00 soubor.text 100% 9 0.0KB/s 00:00
Spouštění příkazů na vzdálených počítačích
Ne vždy chceme a potřebujeme interaktivní shell. V mnoha případech potřebujeme pouze vzdáleně spustit nějaký příkaz a nechat si zobrazit jeho výstup na lokálním systému. To se hodí pro skripty nebo úlohy spouštěné z cronu. Jediným problémem je zadávání hesla, ale to se díky klíčům a programu ssh-agent dá vyřešit (viz dále).
michal@localhost ~$ ssh uzivatel@serverdomenacom /usr/bin/w uzivatel@serverdomenacom's password: 21:57:06 up 4 days, 11:54, 48 users, load average: 0.45, 0.34, 0.23 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT uzivatel pts/6 gateway.isp.com 21:56 43.00s 0.06s 0.06s -ksh ...
Jak samotný příkaz tak jeho výstup jsou bezpečně šifrovány pomocí SSH, takže se k nim potencionální útočník nemůže dostat.