SSH

klíče, config, agent, tunely.

SSH (Secure Shell) je způsob, jak se bezpečně přihlásit do shellu na cizím počítači — přes síť, ale šifrovaně. Sedneš u svého notebooku, napíšeš jeden příkaz a najednou píšeš příkazy na serveru vzdáleném tisíce kilometrů, jako bys u něj seděl. Všechno mezi tebou a serverem je přitom zašifrované, takže po cestě nikdo nepřečte tvé heslo ani to, co děláš. SSH je základní nástroj každého, kdo spravuje servery — bez něj se ke vzdálenému Linuxu prakticky nedostaneš.


Pár pojmů na úvod

  • Klient vs server = na tvém počítači běží SSH klient (ssh), na vzdáleném stroji SSH server (démon sshd). Klient se připojí, server rozhodne, zda tě pustí.
  • Shell = program, který čte tvé příkazy a spouští je (bash, zsh…). SSH ti otevře shell na tom druhém stroji — píšeš lokálně, běží to vzdáleně.
  • Port 22 = číslo „dveří", na kterých sshd naslouchá. Výchozí je 22; jiný port se dá nastavit.
  • Asymetrická kryptografie = dvojice klíčů (veřejný + soukromý), které patří k sobě. Co zašifruje jeden, rozšifruje jen ten druhý. Na tomhle stojí přihlašování klíčem — vysvětlíme níž.
  • Fingerprint (otisk) = krátký „podpis" veřejného klíče serveru. Slouží k tomu, aby sis ověřil, že se bavíš se správným serverem a ne s podvrhem.

Jak vypadá přihlášení

Nejjednodušší forma je jeden příkaz:

ssh user@host
  • user = uživatelské jméno na vzdáleném stroji (např. root, matej, deploy).
  • host = adresa serveru — IP (100.65.217.18) nebo doménové jméno (server.example.com).

Když server naslouchá na jiném než výchozím portu, přidáš -p:

ssh -p 2222 user@host

Poprvé se tě SSH zeptá, jestli věříš tomuhle serveru (viz known_hosts níž). Pak se ověříš — buď heslem, nebo (lépe) klíčem — a jsi ve vzdáleném shellu. Odejdeš příkazem exit nebo Ctrl+D.


Klíče vs heslo — proč jsou klíče lepší

Přihlásit se jde dvěma způsoby a je to zásadní rozdíl:

  • Heslem — napíšeš heslo, server ho ověří. Problém: heslo se dá uhádnout, odchytit nebo brute-force nabít (roboti nonstop zkoušejí root + slovníková hesla na každý server na internetu).
  • Klíčem — použiješ asymetrickou dvojici klíčů. Vygeneruješ si dva soubory, které patří k sobě:
    • soukromý klíč (~/.ssh/id_ed25519) — zůstává jen u tebe, nikdy ho nikam neposíláš.
    • veřejný klíč (~/.ssh/id_ed25519.pub) — ten smíš rozdávat, nakopíruješ ho na servery.

Při přihlášení server pošle výzvu, kterou dokáže správně zodpovědět jen držitel soukromého klíče. Soukromý klíč přitom nikdy neopustí tvůj počítač — po síti se neposílá, takže není co odchytit. Klíč je navíc dlouhý a náhodný, takže se nedá uhádnout jako heslo admin123.

💡 Přirovnání: veřejný klíč je visací zámek, který můžeš rozdat komukoli a nechat ho zamknout na dveře serveru. Soukromý klíč je jediný klíč od toho zámku — ten si necháváš. Kdokoli si může pověsit tvůj zámek, ale otevřít ho umíš jen ty.


Vytvoření klíče a nasazení na server

Klíč si vyrobíš jednou a používáš pro všechny servery. Doporučený typ je ed25519 (moderní, krátký, bezpečný):

ssh-keygen -t ed25519 -C "matej@notebook"
  • -t ed25519 = typ klíče (starší návody říkají rsa — ed25519 je dnes lepší volba).
  • -C "..." = komentář, ať poznáš, čí klíč to je (typicky email nebo user@stroj).
  • Zeptá se na passphrase — heslo, kterým se zašifruje samotný soukromý klíč na disku. Rozhodně ji nastav: kdyby ti někdo ukradl soubor s klíčem, bez passphrase je mu k ničemu.

Vzniknou dva soubory v ~/.ssh/: id_ed25519 (soukromý) a id_ed25519.pub (veřejný).

Veřejný klíč pak dostaneš na server jedním příkazem:

ssh-copy-id user@host

Ten se připojí (naposledy heslem) a přidá tvůj veřejný klíč do souboru ~/.ssh/authorized_keys na serveru. Od té chvíle se přihlašuješ klíčem, bez hesla.

  • ~/.ssh/authorized_keys = seznam veřejných klíčů, které smějí do tohohle účtu. Jeden řádek = jeden povolený klíč. Klidně jich tam může být víc (víc tvých strojů, víc lidí).
  • Kdyby ssh-copy-id nebyl k dispozici, přidáš řádek ručně — obsah .pub souboru zkopíruješ na nový řádek do authorized_keys na serveru.

~/.ssh/config — aliasy hostů

Psát pořád ssh -p 2222 [email protected] je otrava. Řešení je konfigurační soubor ~/.ssh/config na tvém počítači, kde si pojmenuješ zkratky:

Host server1
    HostName 100.65.217.18
    User deploy
    Port 2222
    IdentityFile ~/.ssh/id_ed25519

Pak se připojíš prostě:

ssh server1

SSH si domyslí adresu, uživatele, port i který klíč použít. Do jednoho souboru si takhle uložíš všechny své servery a nemusíš nic pamatovat.


ssh-agent — odemkni passphrase jen jednou

Passphrase u klíče je bezpečná, ale otravné psát ji při každém připojení. Od toho je ssh-agent — program, který si po zadání passphrase podrží odemčený klíč v paměti a při dalších připojeních ho použije za tebe.

ssh-add ~/.ssh/id_ed25519

Zadáš passphrase jednou, agent klíč drží, a dokud jsi přihlášený, další ssh už se neptá. Na desktopu (KDE, GNOME) agent typicky běží automaticky a napojuje se na klíčenku. Výhoda je nejlepší z obou světů: klíč je na disku šifrovaný passphrase, ale ty ji píšeš jen jednou za sezení.


known_hosts a proč se tě SSH poprvé ptá na „fingerprint"

Při prvním připojení k serveru uvidíš něco jako:

The authenticity of host 'server1 (100.65.217.18)' can't be established.
ED25519 key fingerprint is SHA256:abc123...
Are you sure you want to continue connecting (yes/no)?

SSH tím říká: „Tenhle server jsem ještě neviděl. Tady je jeho otisk — je to opravdu ten, kam se chceš připojit?" Když odsouhlasíš yes, uloží se otisk serveru do ~/.ssh/known_hosts. Při dalších připojeních SSH otisk tiše porovná a nikdy se už neptá.

Proč to celé? Aby tě někdo nepodvrhl. Kdyby se mezi tebe a server vecpal útočník (MITM — man in the middle) a tvářil se jako tvůj server, měl by jiný otisk — a SSH by hlasitě zaječelo. Ta první otázka je jediné místo, kde otisk „posvětíš"; ideálně si ho ověříš jiným kanálem (od poskytovatele serveru).


Tunely — -L a -R v kostce

SSH umí kromě shellu i protunelovat porty skrz šifrované spojení. Hodí se, když chceš dosáhnout na službu, která není přímo vystavená na internet:

  • -L (local forward) = „přines mi vzdálený port k sobě". Např. databáze běží na serveru jen na localhost:5432 — tímhle si ji zpřístupníš na svém počítači:
    ssh -L 5432:localhost:5432 server1
    

    Pak se na localhost:5432 u sebe připojíš, jako by DB běžela lokálně.
  • -R (remote forward) = opačný směr — „vystav můj lokální port na serveru". Užitečné pro zpřístupnění něčeho, co běží u tebe, vzdálenému stroji.

Zatím ber tunely jen jako „že to jde"; v praxi je nejčastější -L pro bezpečný přístup k databázi nebo interní administraci bez otevírání portů do světa.


Kopírování souborů přes SSH

Přes stejné šifrované spojení se dají i přenášet soubory:

scp soubor.txt user@host:/cesta/na/serveru/
rsync -av ./slozka/ user@host:/cil/
  • scp = jednoduché kopírování „sem–tam", syntaxe jako cp, jen s user@host: u vzdálené strany.
  • rsync = chytřejší — přenáší jen změny, umí pokračovat, ideální na zálohy a opakovaný deploy.

📎 Podrobněji se přenosu souborů věnuje samostatná kapitola o přenosu dat; tady stačí vědět, že scp i rsync jedou po tomtéž SSH spojení a používají stejné klíče a ~/.ssh/config aliasy.


Failure modes — časté průšvihy

  • Špatná práva na ~/.ssh a klíči. SSH je záměrně paranoidní: pokud může do tvého soukromého klíče nebo authorized_keys číst někdo jiný, odmítne je použít (WARNING: UNPROTECTED PRIVATE KEY). Musí platit chmod 700 ~/.ssh a chmod 600 ~/.ssh/id_ed25519. Je to funkce, ne buzerace — soukromý klíč čitelný pro ostatní = kompromitovaný klíč.
  • Spoléhání na heslovou autentizaci. Hesla se dají brute-forcovat a roboti to na každém serveru dělají nonstop. Nasaď klíče a heslovou auth na serveru vypni (PasswordAuthentication no). ⚠️ Moderní sshd_config obsahuje Include /etc/ssh/sshd_config.d/*.conf, takže hodnota z drop-in souboru přebije hlavní soubor — edituj proto raději sshd_config.d/10-hardening.conf. A změna se projeví až po sudo sshd -t (test syntaxe) + sudo systemctl restart sshd — nejdřív si ale z druhého okna ověř, že se přihlásíš klíčem, ať se nezamkneš ven.
  • Povolený root login. Přihlašování přímo jako root přes SSH je klasická díra — útočník zná jméno účtu předem, zbývá mu jen heslo. Nech PermitRootLogin no a přihlašuj se běžným uživatelem, root řeš přes sudo.
  • Ztracený soukromý klíč. Soukromý klíč je jako klíč od bytu — když ho ztratíš nebo unikne, kdokoli se za tebe přihlásí. Musíš jeho veřejný protějšek smazat z authorized_keys na všech serverech a vygenerovat nový. Proto passphrase + neposílej ho nikam.
  • Ignorování změny fingerprintu. Když SSH najednou zařve REMOTE HOST IDENTIFICATION HAS CHANGED, neber to jako otravu a slepě to nemaž. Buď server dostal nový klíč (reinstalace), nebo tě někdo podvrhuje (MITM). Nejdřív zjisti proč, teprve pak upravuj known_hosts.

🛠️ Cvičení

  1. Vyrob si klíč. Vygeneruj ed25519 klíč s passphrase a rozmysli si, který ze vzniklých dvou souborů smíš rozdat a který nikdy nesmí opustit tvůj počítač. Podle čeho to poznáš?
  2. Zkrať si přístup. Napiš do ~/.ssh/config alias Host pro nějaký (klidně smyšlený) server s jiným portem a uživatelem, aby stačilo psát ssh <alias>. Které čtyři věci alias typicky obsahuje?
  3. Oprav práva. Máš klíč ~/.ssh/id_ed25519, ale SSH ho odmítá se stížností na práva. Jakými dvěma chmod příkazy to spravíš a proč na tom SSH tak trvá?
  4. Pochop fingerprint. Vysvětli vlastními slovy, proč se tě SSH při prvním připojení ptá na otisk serveru a co znamená, když se ten otisk po čase změní.
  5. Klíč místo hesla na serveru. Popiš krok za krokem, co uděláš, abys na cizím serveru mohl vypnout přihlašování heslem — od vytvoření klíče až po ověření, že klíč funguje.
Náčrt řešení — rozbal, až si cvičení zkusíš sám
  1. Klíčssh-keygen -t ed25519 -C "ja@stroj" vyrobí id_ed25519 (soukromý) a id_ed25519.pub (veřejný). Rozdat smíš jen .pub — ten se kopíruje na servery. Soukromý (id_ed25519, bez přípony) zůstává u tebe a nikdy ho neposíláš. Poznáš to podle přípony .pub a podle toho, že veřejný je krátký jednořádkový text. Pozor: passphrase chrání soukromý klíč, kdyby soubor unikl.
  2. Config alias — do ~/.ssh/config: Host mujserver a pod ním odsazené HostName <adresa>, User <uživatel>, Port <číslo>, IdentityFile ~/.ssh/id_ed25519. Pak stačí ssh mujserver. Typicky obsahuje HostName, User, Port a IdentityFile. Pozor: soubor je na tvém klientu, ne na serveru.
  3. Právachmod 700 ~/.ssh (jen ty smíš do složky) a chmod 600 ~/.ssh/id_ed25519 (jen ty smíš číst klíč). SSH na tom trvá, protože soukromý klíč čitelný pro ostatní uživatele = fakticky vyzrazený klíč; radši spojení odmítne, než by riskovalo. Pozor: authorized_keys na serveru chce taky přísná práva (600).
  4. Fingerprint — otisk je krátký „podpis" veřejného klíče serveru. Poprvé ho SSH nezná, tak se ptá, ať posvětíš, že je to opravdu tvůj server, a uloží ho do known_hosts. Změna otisku znamená buď legitimní reinstalaci serveru, nebo že se mezi tebe a server někdo vecpal (MITM). Pozor: slepě smazat known_hosts záznam = přijít o ochranu proti podvrhu; nejdřív zjisti proč.
  5. Klíč místo hesla — (a) ssh-keygen -t ed25519 vyrobí klíč; (b) ssh-copy-id user@host nakopíruje veřejný klíč do ~/.ssh/authorized_keys na serveru; (c) ssh user@host ověříš, že tě to pustí bez hesla; (d) teprve pak na serveru v konfiguraci sshd nastavíš PasswordAuthentication no a sshd restartuješ. Pozor: nejdřív si ověř, že klíč funguje — jinak se sám zamkneš venku.

🧠 Otázky & odpovědi

K čemu vlastně SSH je?

SSH (Secure Shell) je nástroj pro bezpečné, šifrované přihlášení do shellu na vzdáleném počítači. Napíšeš ssh user@host, projdeš ověřením a píšeš příkazy na cizím stroji, jako bys u něj seděl — jenže všechno mezi tebou a serverem je zašifrované, takže po cestě nikdo nepřečte tvé heslo ani data. Kromě shellu umí SSH i kopírovat soubory (scp, rsync) a tunelovat porty. Pro správu serverů je to naprostý základ — bez SSH se ke vzdálenému Linuxu prakticky nedostaneš.

Proč je přihlašování klíčem bezpečnější než heslem?

Protože při ověření klíčem soukromý klíč nikdy neopustí tvůj počítač — po síti se neposílá, takže není co odchytit. Funguje to na asymetrické dvojici: veřejný klíč rozdáš na servery (do authorized_keys), soukromý si necháš. Server pošle výzvu, na kterou správně odpoví jen držitel soukromého klíče. Klíč je navíc dlouhý a náhodný, takže se nedá uhádnout ani brute-forcovat jako heslo admin123, které roboti na servery nonstop zkoušejí. Ideál: klíče zapnout a heslovou auth vypnout.

Co je ssh-agent a proč ho chci?

ssh-agent je program, který si podrží tvůj odemčený soukromý klíč v paměti, abys passphrase zadával jen jednou za sezení. Klíč na disku je totiž zašifrovaný passphrase (to je správně — kdyby unikl soubor, je bez hesla k ničemu), ale psát ji při každém připojení by bylo otravné. Přidáš klíč přes ssh-add ~/.ssh/id_ed25519, zadáš passphrase jednou, a další ssh se už neptají. Na desktopu agent většinou běží sám a napojuje se na klíčenku. Dostaneš tak bezpečí passphrase i pohodlí bez neustálého psaní.

Proč se mě SSH při prvním připojení ptá na fingerprint serveru?

Aby sis ověřil, že se bavíš se správným serverem a ne s podvrhem. Otisk (fingerprint) je krátký podpis veřejného klíče serveru. Poprvé ho SSH nezná, tak se zeptá a po odsouhlasení ho uloží do ~/.ssh/known_hosts. Napříště už otisk tiše porovná a mlčí. Kdyby se mezi tebe a server vecpal útočník (MITM), měl by jiný otisk a SSH by tě varovalo. Když se otisk náhle změní, ber to vážně: buď server dostal nový klíč (reinstalace), nebo tě fakt někdo podvrhuje — nejdřív zjisti proč, pak teprve maž záznam.

Jaká práva musí mít soubory v ~/.ssh a co když nesedí?

SSH je záměrně přísné: složka ~/.ssh musí být 700 a soukromý klíč 600 — tedy přístupné jen tobě. Pokud do nich může číst někdo jiný, SSH je odmítne použít a zařve UNPROTECTED PRIVATE KEY. Není to buzerace, ale ochrana: soukromý klíč čitelný pro ostatní uživatele je fakticky vyzrazený klíč, a SSH radši spojení odmítne, než by to risklo. Spravíš to chmod 700 ~/.ssh a chmod 600 ~/.ssh/id_ed25519; na serveru totéž platí pro authorized_keys.