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.
