Modul 2 — Sítě a protokoly
10. SSH — klíče, tunelování, bezpečný vzdálený přístup
Princip protokolu SSH, autentizace pomocí klíčů, bezpečné praktiky konfigurace a tunelování portů pro vzdálený přístup k serverům.
Úvod a kontext
SSH (Secure Shell) je základní nástroj, kterým se DevOps inženýr
prakticky denně připojuje ke vzdáleným serverům — spravuje je,
nasazuje kód, kopíruje soubory a tuneluje si přístup ke službám, které
z bezpečnostních důvodů nejsou vystaveny přímo na internet. Na rozdíl
od svého nezabezpečeného předchůdce Telnet je veškerá komunikace v SSH
šifrovaná. Tato lekce vysvětlí, jak SSH funguje, jak nastavit bezpečnou
autentizaci pomocí klíčů místo hesel a jak SSH využít i jako
univerzální síťový tunel.
Teorie
Co SSH řeší
SSH poskytuje šifrovaný kanál mezi klientem a serverem přes TCP
(standardně port 22) a na tomto kanálu umožňuje:
- vzdálené přihlášení a spuštění příkazového shellu,
- spuštění jednotlivého příkazu na vzdáleném stroji,
- bezpečný přenos souborů (
scp,sftp), - tunelování (přeposílání) libovolného TCP provozu přes šifrované
spojení (tzv. port forwarding).
Autentizace heslem vs. klíčem
SSH podporuje víc metod autentizace, v praxi se ale používají hlavně
dvě:
- Heslo — jednoduché, ale náchylné na brute-force útoky a phishing;
na produkčních serverech se obvykle vypíná. - Veřejný/soukromý klíč (public-key authentication) — bezpečnější a
pohodlnější standard. Princip je založen na asymetrické kryptografii:
- Vygenerujete si pár klíčů — soukromý klíč (zůstává jen u vás,
nikdy se nesdílí) a veřejný klíč (lze bez obav sdílet). - Veřejný klíč nahrajete na server do souboru
~/.ssh/authorized_keysuživatele, pod kterým se chcete
přihlašovat. - Při připojení server pošle klientovi výzvu zašifrovanou veřejným
klíčem; klient prokáže vlastnictví odpovídajícího soukromého
klíče tím, že výzvu rozšifruje (aniž by soukromý klíč kdy opustil
jeho stroj).
Výhoda: i kdyby útočník odposlechl celou komunikaci, soukromý klíč se
po síti nikdy nepřenáší, takže ho nemůže získat. Soukromý klíč navíc
lze chránit passphrase (heslem, kterým je zašifrován na disku).
Fingerprint hostitele a known_hosts
Při prvním připojení k novému serveru SSH klient zobrazí fingerprint
(otisk) veřejného klíče serveru a zeptá se, zda mu důvěřovat — to je
ochrana proti tomu, aby se za server nevydával útočník
(man-in-the-middle). Po potvrzení se otisk uloží do
~/.ssh/known_hosts; pokud se při dalším připojení otisk neshoduje
(server byl přeinstalován, nebo probíhá útok), SSH klient důrazně
varuje a odmítne se připojit, dokud se problém neřeší explicitně.
Tunelování (port forwarding)
SSH lze použít i jako obecný šifrovaný tunel pro jiný síťový provoz:
- Local forwarding (
-L) — otevře port na vašem lokálním stroji,
který přesměruje přes SSH server na cílovou adresu a port. Typické
použití: přístup k databázi, která naslouchá jen nalocalhost
vzdáleného serveru a není jinak dostupná zvenčí. - Remote forwarding (
-R) — opačný směr, zpřístupní lokální službu
vzdálenému serveru (a případně dál). - Dynamic forwarding (
-D) — vytvoří na lokálním stroji SOCKS
proxy, přes kterou lze tunelovat provoz libovolných aplikací.
Praktický příklad
Vygenerování moderního páru klíčů (algoritmus Ed25519 je dnes
doporučenou volbou — kratší klíče, vysoká bezpečnost):
$ ssh-keygen -t ed25519 -C "petr@notebook"
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/petr/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase): ********
Your identification has been saved in /home/petr/.ssh/id_ed25519
Your public key has been saved in /home/petr/.ssh/id_ed25519.pub
Zkopírování veřejného klíče na server (nástroj ssh-copy-id to udělá
za vás):
$ ssh-copy-id petr@203.0.113.10
To je ekvivalentní ručnímu přidání obsahu id_ed25519.pub na konec
souboru ~/.ssh/authorized_keys na serveru.
Doporučené zabezpečení serveru v /etc/ssh/sshd_config — vypnutí
přihlašování heslem a rootem, čímž se výrazně sníží prostor pro
brute-force útoky:
PasswordAuthentication no
PermitRootLogin no
PubkeyAuthentication yes
Po úpravě je nutné konfiguraci znovu načíst:
$ sudo systemctl reload sshd
Přehledná konfigurace opakovaně používaných spojení v
~/.ssh/config na klientovi (šetří psaní dlouhých příkazů):
Host prod-web
HostName 203.0.113.10
User petr
Port 22
IdentityFile ~/.ssh/id_ed25519
Po tomto zápisu stačí ssh prod-web místo celého příkazu s parametry.
Local port forwarding — zpřístupnění databáze PostgreSQL, která na
serveru naslouchá jen na 127.0.0.1:5432, na lokálním portu 6543:
$ ssh -L 6543:127.0.0.1:5432 prod-web
# Nyní se lze z lokálního stroje připojit na:
$ psql -h 127.0.0.1 -p 6543 -U app_user -d app_db
Bezpečné kopírování souboru na server a zpět pomocí scp:
$ scp deploy.tar.gz prod-web:/opt/app/releases/
$ scp prod-web:/var/log/app/error.log ./error.log
Shrnutí
SSH poskytuje šifrovaný kanál pro vzdálenou správu serverů, přenos
souborů a tunelování síťového provozu. Autentizace veřejným/soukromým
klíčem je bezpečnější a pohodlnější než hesla a je dnes na produkčních
serverech standardem — v kombinaci s vypnutím přihlašování heslem a
rootem výrazně snižuje riziko útoku. Port forwarding (-L, -R, -D)
umožňuje bezpečně přistupovat i ke službám, které nejsou přímo
vystavené na síť.
Kontrolní otázky
- Proč je autentizace pomocí SSH klíče bezpečnější než autentizace
heslem? - Co se stane, pokud se při opakovaném připojení k témuž serveru
změní jeho fingerprint vknown_hosts, a proč je to důležitý
bezpečnostní signál? - Jaký příkaz použijete k tomu, aby lokální port
6543přesměroval
provoz na127.0.0.1:5432na vzdáleném serveruprod-web? - Uveďte dvě konfigurační direktivy v
sshd_config, kterými zvýšíte
odolnost serveru proti brute-force útokům na SSH.
Lekce na sebe nejsou zamčené — libovolnou lekci můžete otevřít i označit jako hotovou v jakémkoliv pořadí.