Chytré používání SSH
Modul 2: SSH a klíče · Doba čtení: 10 min.
Cíl lekce: Po této lekci budete umět SSH pohodlně používat každý den s vlastním konfiguračním souborem, kopírovat soubory pomocí scp a rsync a dostat se tunelem k databázi, aniž by databázový port musel být otevřený do internetu.
Klíčové pojmy: ~/.ssh/config, Host, HostName, User, IdentityFile, scp, rsync, sftp, port forwarding, -L, tunel, ProxyJump, ServerAliveInterval, jiné číslo portu, odvolání klíče
Méně psaní díky ~/.ssh/config
Po několika týdnech budete tohle psát desítkykrát denně:
anna@laptop:~$ ssh -i ~/.ssh/id_ed25519 anna@192.0.2.10S konfiguračním souborem pro klienta bude zápis kratší a uděláte méně chyb. Soubor je uložený na Vašem vlastním počítači: ~/.ssh/config (Windows: C:\Users\anna\.ssh\config, bez přípony).
Host web1
HostName 192.0.2.10
User anna
IdentityFile ~/.ssh/id_ed25519
ServerAliveInterval 60
Host test
HostName test.example.com
User anna
Port 2222Teď stačí jen:
anna@laptop:~$ ssh web1
anna@web1:~$Co jednotlivé řádky dělají?
- Host je přezdívka, kterou si zvolíte sami. Píšete ji za
ssh,scparsync. - HostName je skutečná adresa: IP adresa nebo název, který je zapsaný v DNS.
- User a Port jsou uživatelské jméno a port, takže si je už nemusíte pamatovat.
- IdentityFile určuje klíč. Hodí se, pokud máte více klíčů; bez tohoto řádku zkouší ssh Vaše výchozí klíče.
- ServerAliveInterval 60 posílá každých 60 sekund malý signál, že spojení žije. Mnoho domácích routerů a sítí wifi ukončí tiché spojení po několika minutách; díky tomu Vaše relace zůstane otevřená.
I tady platí, že rozhoduje první hodnota, stejně jako na serveru. Obecná pravidla jako Host * proto dávejte na konec souboru.
Kopírování souborů: scp, rsync a sftp
scp kopíruje soubor, se stejným zápisem jako cp, ale s host: na začátku:
anna@laptop:~$ scp backup.sql web1:/home/anna/
anna@laptop:~$ scp web1:/var/log/nginx/error.log .rsync je chytřejší u složek a velkých objemů dat: posílá jen to, co se změnilo, a umí navázat přerušené kopírování. Musí být nainstalovaný na obou stranách (apt install rsync).
anna@laptop:~$ rsync -avz --progress ./site/ web1:/var/www/example.com/Dejte pozor na lomítko za ./site/: s lomítkem zkopíruje rsync obsah složky, bez lomítka složku samotnou (dostanete pak /var/www/example.com/site/). Když si nejste jistí, zkuste to nejdřív s --dry-run, a buďte velmi opatrní s --delete, která na přijímající straně smaže vše, co u Vás neexistuje.
sftp a grafické programy jako FileZilla nebo WinSCP používají stejné spojení SSH a stejný klíč. Samostatný FTP server tedy není potřeba. Staromódní FTP server na VPS nedoporučujeme: obyčejné FTP posílá Vaše heslo po síti nešifrovaně.
Tunel místo otevřeného portu
Tohle je možná to nejužitečnější, co SSH umí. Představte si, že na Vašem serveru běží databáze PostgreSQL. Chcete se k ní připojit z notebooku grafickým programem. Pokušení otevřít port 5432 do internetu je velké. Nedělejte to: otevřené databázové porty patří k největším příčinám úniků dat (lekce 10.2) a kurz později zvenčí kontroluje, že jsou zavřené (úkol Z5.1).
Pomocí lokálního port forwardingu necháte SSH vytvořit tunel:
anna@laptop:~$ ssh -L 5432:127.0.0.1:5432 web1Čtěte to takto: „poslouchej na mém notebooku na portu 5432 a vše, co tam přijde, pošli spojením SSH na 127.0.0.1:5432, z pohledu serveru“. Dokud je tato relace otevřená, připojíte svůj databázový program k localhost na port 5432 na vlastním notebooku a dostanete se k databázi na serveru.
Proč je to tak dobré?
- Databáze poslouchá na serveru jen na
127.0.0.1a zvenčí je nedostupná. - Spojení je šifrované pomocí SSH, i když samotná databáze šifrování nemá.
- Dostane se k ní jen ten, kdo se může přihlásit přes SSH. Využíváte tedy silné zabezpečení, které už máte.
Pokud na Vašem notebooku už něco běží na portu 5432, zvolte vlevo jiné číslo: -L 15432:127.0.0.1:5432, a připojte se na port 15432. Když tunel zapíšete do ~/.ssh/config, budete ho mít vždy po ruce:
Host web1-db
HostName 192.0.2.10
User anna
LocalForward 15432 127.0.0.1:5432S ssh -N web1-db získáte jen tunel, bez příkazového řádku.
Přes mezilehlý server: ProxyJump
Někdy se k serveru dostanete jen přes jiný, například k databázovému serveru bez veřejné IP adresy za Vaším webovým serverem. ProxyJump přeskočí přes první server na druhý:
Host db1
HostName 10.0.0.5
User anna
ProxyJump web1Rozdíl oproti agent forwardingu (lekce 2.1): u ProxyJump vede šifrování od začátku do konce mezi Vaším notebookem a db1. Mezilehlý server jen předává pakety a Váš klíč použít nemůže.
Jiné číslo portu: ano, nebo ne?
Mnoho návodů doporučuje přesunout SSH na jiný port, například 2222. Co to doopravdy udělá?
- Sníží to šum: většina automatizovaných pokusů o uhodnutí hesla zkouší jen port 22. Váš log bude klidnější.
- Není to zabezpečení. Skener, který projde všechny porty, najde SSH během několika sekund podle jeho banneru s verzí.
S klíči a vypnutým přihlašováním heslem (lekce 2.2) má port pro bezpečnost malý význam. Pokud ho přesto chcete změnit, postupujte ve správném pořadí: otevřít nový port ve firewallu, nechat SSH poslouchat na obou portech, otestovat to ve druhém okně a teprve potom zavřít starý port. Na Ubuntu 24.04 a novějším k tomu patří systemctl daemon-reload a systemctl restart ssh.socket (lekce 2.2). Nezapomeňte, že i Váš poskytovatel může mít firewall.
Odvolání přístupu
Bývalý kolega nebo tvůrce webu měl na Vašem serveru klíč a už pro Vás nepracuje? Odvolat přístup je jednoduché, pokud o tom máte přehled:
- Prohlédněte si všechny klíče:
ssh-keygen -lf ~/.ssh/authorized_keys, a to u každého uživatele (také/root/.ssh/authorized_keys). - Odstraňte řádek dané osoby.
- Pokud používal vlastní uživatelský účet, zamkněte ho (lekce 3.1) a zkontrolujte, zda byl ve skupině
sudo(lekce 3.2). - Pokud viděl hesla, například heslo k databázi v konfiguračním souboru, změňte je také.
Běžný klíč nemá datum platnosti. Co neodstraníte, funguje dál, i po letech. Pokud někomu dáváte dočasný přístup, můžete před jeho řádek v authorized_keys přidat volbu expiry-time="20261231"; po tomto datu server klíč odmítne.
Shrnutí
~/.ssh/configna Vašem počítači uchovává pro každý server název, uživatele, port a klíč;Host *patří na konec.- scp pro jednotlivé soubory, rsync pro složky (pozor na lomítko a na
--delete), sftp místo FTP. - S
ssh -Lse dostanete k databázi šifrovaným tunelem, zatímco databázový port zůstává zvenčí zavřený. - ProxyJump bezpečně přeskočí přes mezilehlý server; je to lepší než agent forwarding.
- Jiné číslo portu snižuje šum, ale nezabezpečuje. Klíče, které neodstraníte, fungují dál.
Kvíz
Úkol
Úkol O2.3: SSH config a tunel. Vytvořte na svém počítači ~/.ssh/config s přezdívkou pro svůj server, přihlaste se jen pomocí ssh <bijnaam>, zkopírujte soubor pomocí scp nebo rsync a vytvořte tunel s -L ke službě, která na Vašem serveru poslouchá jen na 127.0.0.1 (pokud ještě nemáte databázi, použijte port 22 samotného serveru: ssh -L 2200:127.0.0.1:22 <bijnaam> a potom ssh -p 2200 anna@localhost). Odpovězte na otázky o tom, co tunel dělá a proč port nemusí být otevřený.
Úkol O2.3: SSH config a tunel
Tento úkol provádíte sami; nikdo ho nekontroluje. Odškrtněte, co jste udělali, a označte úkol jako splněný.
Váš notebook naslouchá na levém portu, provoz jde šifrovaně přes SSH a na serveru vychází na 127.0.0.1:<poort>. Služba zůstává zvenku nedostupná. Jiný port pro SSH znamená méně šumu v logu, ale není to zabezpečení; zabezpečením jsou klíče a vypnuté přihlašování heslem.
Vaše zaškrtnutí a poznámky zůstávají pouze v tomto prohlížeči; nikam je neposíláme. Pokud jste přihlášeni, ukládáme v sekci Moje kurzy pouze to, že jste úkol splnili.
Doporučujeme k přečtení
Postupy v těchto článcích platí pro VPS a panely WebOké; u jiných poskytovatelů to funguje podobně.
- Přihlášení k VPS přes SSH (a vytvoření SSH klíče)
- Manuál ssh_config (nastavení klienta): https://man.openbsd.org/ssh_config
- Manuál ssh (volby
-L,-J,-N): https://man.openbsd.org/ssh
