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.

Odhadovaná délka studia: 55 minut · Stav: nehotovo

Technologie: SSH

Ú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:
  1. 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).
  2. Veřejný klíč nahrajete na server do souboru
    ~/.ssh/authorized_keys uživatele, pod kterým se chcete
    přihlašovat.
  3. 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 na localhost
    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

  1. Proč je autentizace pomocí SSH klíče bezpečnější než autentizace
    heslem?
  2. Co se stane, pokud se při opakovaném připojení k témuž serveru
    změní jeho fingerprint v known_hosts, a proč je to důležitý
    bezpečnostní signál?
  3. Jaký příkaz použijete k tomu, aby lokální port 6543 přesměroval
    provoz na 127.0.0.1:5432 na vzdáleném serveru prod-web?
  4. 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í.