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émonsshd). 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
sshdnaslouchá. 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.
- soukromý klíč (
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 nebouser@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-idnebyl k dispozici, přidáš řádek ručně — obsah.pubsouboru zkopíruješ na nový řádek doauthorized_keysna 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 nalocalhost:5432— tímhle si ji zpřístupníš na svém počítači:ssh -L 5432:localhost:5432 server1
Pak se nalocalhost:5432u 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 jakocp, jen suser@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
scpirsyncjedou po tomtéž SSH spojení a používají stejné klíče a~/.ssh/configaliasy.
Failure modes — časté průšvihy
- Špatná práva na
~/.ssha klíči. SSH je záměrně paranoidní: pokud může do tvého soukromého klíče neboauthorized_keysčíst někdo jiný, odmítne je použít (WARNING: UNPROTECTED PRIVATE KEY). Musí platitchmod 700 ~/.sshachmod 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_configobsahujeInclude /etc/ssh/sshd_config.d/*.conf, takže hodnota z drop-in souboru přebije hlavní soubor — edituj proto radějisshd_config.d/10-hardening.conf. A změna se projeví až posudo 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
rootpřes SSH je klasická díra — útočník zná jméno účtu předem, zbývá mu jen heslo. NechPermitRootLogin noa přihlašuj se běžným uživatelem, root řeš přessudo. - 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_keysna 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 upravujknown_hosts.
🛠️ Cvičení
- 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áš?
- Zkrať si přístup. Napiš do
~/.ssh/configaliasHostpro nějaký (klidně smyšlený) server s jiným portem a uživatelem, aby stačilo psátssh <alias>. Které čtyři věci alias typicky obsahuje? - Oprav práva. Máš klíč
~/.ssh/id_ed25519, ale SSH ho odmítá se stížností na práva. Jakými dvěmachmodpříkazy to spravíš a proč na tom SSH tak trvá? - 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í.
- 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
- Klíč —
ssh-keygen -t ed25519 -C "ja@stroj"vyrobíid_ed25519(soukromý) aid_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.puba podle toho, že veřejný je krátký jednořádkový text. Pozor: passphrase chrání soukromý klíč, kdyby soubor unikl. - Config alias — do
~/.ssh/config:Host mujservera 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. - Práva —
chmod 700 ~/.ssh(jen ty smíš do složky) achmod 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_keysna serveru chce taky přísná práva (600). - 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ě smazatknown_hostszáznam = přijít o ochranu proti podvrhu; nejdřív zjisti proč. - Klíč místo hesla — (a)
ssh-keygen -t ed25519vyrobí klíč; (b)ssh-copy-id user@hostnakopíruje veřejný klíč do~/.ssh/authorized_keysna serveru; (c)ssh user@hostověříš, že tě to pustí bez hesla; (d) teprve pak na serveru v konfiguracisshdnastavíšPasswordAuthentication noasshdrestartuješ. 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.
