SSH

klíče, config, agent, tunely.

Co se naučíš: Přihlásíš se na server klíčem místo heslem a nastavíš si config tak, aby to bylo na jeden příkaz.

14 min čtení + cvičeníNavazuje na:🌐 Síť v Linuxu

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áva, chmod 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.