Bezpečné nastavení SSH serveru
Modul 2: SSH a klíče · Doba čtení: 12 min.
Cíl lekce: Po této lekci umíte vypnout přihlášení heslem a přihlášení uživatele root heslem, zkontrolovat, které nastavení skutečně platí, a udělat to tak, abyste si nezablokovali přístup.
Klíčové pojmy: sshd, sshd_config, sshd_config.d, platí první hodnota, PasswordAuthentication, KbdInteractiveAuthentication, PermitRootLogin, AuthenticationMethods, AllowUsers, sshd -t, sshd -T, druhá relace, cloud-init, ssh.socket
Nejprve záchranná síť
V této lekci zavřete něco, čím sami musíte projít. Jeden překlep může znamenat, že se už nedostanete dovnitř. Proto vždy, než začnete:
- Dva klíče fungují (lekce 2.1) a v novém okně jste ověřili, že přihlášení klíčem funguje.
- Snapshot Vašeho VPS. U WebOké ho vytvoříte na obrazovce VPS, u jiných poskytovatelů se také jmenuje snapshot nebo image. Když se něco pokazí, obnovíte ho.
- Konzoli svého poskytovatele znáte: přes ni se dostanete dovnitř bez SSH.
- Vaše aktuální SSH relace zůstane otevřená až do konce. Běžící relace funguje dál, i když změníte nastavení nebo službu znovu načtete. Každou změnu testujete ve druhém okně.
Kde je nastavení uložené
SSH server se jmenuje sshd. Jeho nastavení je v /etc/ssh/sshd_config. Na Debianu a Ubuntu je na začátku tohoto souboru tento řádek:
Include /etc/ssh/sshd_config.d/*.confVšechny soubory s .conf ve složce sshd_config.d se tedy načtou před zbytkem hlavního souboru, a to v abecedním pořadí. To je praktické: vlastní nastavení si dáte do vlastního souboru a hlavní soubor necháte být, takže aktualizace balíčku Vaše změny nepřepíše.
Má to ale důsledek, který mnohé překvapí. V sshd_config platí: pro každé nastavení se použije první hodnota, na kterou sshd narazí. Pozdější řádky se stejným nastavením se ignorují. Kdo tedy na konec sshd_config napíše PasswordAuthentication no, nepřebije soubor v sshd_config.d, který říká yes.
Past jménem cloud-init
Mnoho imagí VPS se při prvním spuštění nastavuje pomocí cloud-init. Podle toho, jak jsou image a instalace nastavené, zapíše cloud-init soubor jako /etc/ssh/sshd_config.d/50-cloud-init.conf, v němž je například:
PasswordAuthentication yesProtože se tento soubor načte dřív než hlavní soubor, zůstane přihlášení heslem zapnuté, ať do sshd_config napíšete cokoli. Nespoléhejte se tedy na předpoklady a podívejte se:
root@web1:~# grep -ri passwordauthentication /etc/ssh/sshd_config /etc/ssh/sshd_config.d/
/etc/ssh/sshd_config:#PasswordAuthentication yes
/etc/ssh/sshd_config.d/50-cloud-init.conf:PasswordAuthentication yesExistují dvě čistá řešení: upravte tento soubor na no, nebo dejte vlastní nastavení do souboru, který je v abecedě dřív, například 00-beveiliging.conf. Soubor 99-mijn.conf naopak nefunguje, protože to už cloud-init vyhrál.
Nastavení, na kterých záleží
Vytvořte vlastní soubor:
root@web1:~# nano /etc/ssh/sshd_config.d/00-beveiliging.confs tímto obsahem:
# Přihlášení pouze pomocí klíče
PasswordAuthentication no
KbdInteractiveAuthentication no
PermitRootLogin prohibit-passwordCo jednotlivé řádky znamenají?
- PasswordAuthentication no: server už nepřijme heslo. Výchozí hodnota OpenSSH je
yes. - KbdInteractiveAuthentication no: „keyboard-interactive“ je druhý způsob, jak si vyžádat heslo, a to přes PAM. Pokud ho necháte zapnutý, může někdo heslo zkoušet i tak, i když je
PasswordAuthenticationnastaveno nano. Ve starších návodech se toto nastavení jmenujeChallengeResponseAuthentication; od OpenSSH 8.7 je to zastaralý alternativní název pro totéž. Debian ho ve výchozím stavu už nastavuje nano, přesto ho tam uveďte: je to pak jednoznačné a platí to i na jiných systémech. - PermitRootLogin prohibit-password: root se smí přihlásit, ale jen klíčem. To je výchozí nastavení od OpenSSH 7.0. Přísnější je
PermitRootLogin no: root se přes SSH nepřihlásí vůbec, přihlašujete se jako běžný uživatel a používáte sudo (lekce 3.2).nonastavte až tehdy, když víte jistě, že přihlášení jako tento uživatel asudofungují.
Volitelně, pro ty, kdo chtějí víc:
AllowUsers anna
AuthenticationMethods publickeyAllowUsers pustí dovnitř jen uvedené uživatele; každé jiné jméno je odmítnuto, i když má platný klíč. Praktické, ale nezapomeňte na sebe a nezapomeňte seznam doplnit, když přidáte druhého správce. AuthenticationMethods publickey jedním řádkem říká, že platí jen klíče.
Otestovat, použít, zkontrolovat
Nejprve necháte sshd soubor zkontrolovat. Nic se tím nespustí ani nezmění:
root@web1:~# sshd -t
root@web1:~#Žádný výstup znamená: žádné chyby. Při překlepu uvidíte řádek a soubor. Teprve potom službu znovu načtete:
root@web1:~# systemctl reload sshNa Debianu a Ubuntu se služba jmenuje ssh, na AlmaLinuxu a Rocky Linuxu sshd.
Potom zkontrolujete, která hodnota skutečně platí. sshd -T zobrazí úplnou, vyhodnocenou konfiguraci včetně všech souborů z Include:
root@web1:~# sshd -T | grep -Ei 'passwordauth|kbdinteractive|permitrootlogin'
permitrootlogin without-password
passwordauthentication no
kbdinteractiveauthentication no(without-password je starý název pro prohibit-password. Verze OpenSSH před 10.1, například na Debianu 13 a Ubuntu 24.04, ještě zobrazují starý název; novější zobrazují prohibit-password. Znamená to totéž.)
A teď to nejdůležitější: testujte ve druhém okně, zatímco první zůstane otevřené.
anna@laptop:~$ ssh anna@192.0.2.10
anna@web1:~$Pokud to funguje, zkuste se záměrně přihlásit heslem. Musí se to nepovést:
anna@laptop:~$ ssh -o PreferredAuthentications=password -o PubkeyAuthentication=no anna@192.0.2.10
anna@192.0.2.10: Permission denied (publickey).Za Permission denied je v závorce uvedeno, které metody přihlášení server ještě nabízí. Pokud je tam jen publickey, je vše v pořádku. Pokud je tam i password nebo keyboard-interactive, platí někde ještě jiná hodnota: podívejte se znovu pomocí sshd -T.
Právě tento seznam kontroluje zvenčí i úkol v kurzu. Váš SSH klient se při každém připojení nejprve zeptá, které metody jsou povolené, a to požadavkem typu „none“. Server odpoví seznamem, aniž by se zkoušelo heslo nebo klíč.
Ubuntu 24.04 a novější: ssh.socket
Na Ubuntu od verze 22.10 neposlouchá na portu 22 samotný sshd, ale systemd, a to přes ssh.socket. Teprve když přijde spojení, systemd spustí službu SSH. Pro nastavení v této lekci to nehraje roli: stačí systemctl reload ssh nebo restart ssh.
Roli to ale hraje, když měníte port nebo adresu naslouchání (Port, ListenAddress). Od Ubuntu 24.04 čte systemd tyto hodnoty z sshd_config, ale jen po:
root@web1:~# systemctl daemon-reload
root@web1:~# systemctl restart ssh.socketPokud na to zapomenete, server bude dál poslouchat na starém portu. Horší je: když nejprve nastavíte firewall na nový port a SSH zůstane na starém, zablokujete si přístup. Vždy si pomocí ss -tlnp | grep ssh ověřte, kde se skutečně naslouchá (lekce 5.1), a nový port povolte ve firewallu dřív, než zavřete starý. Zda má jiný port smysl, se dočtete v lekci 2.3.
Když se to přesto pokazí
Pokud se už nedostanete dovnitř, otevřete konzoli svého poskytovatele, přihlaste se jako root (heslem, protože konzole je „klávesnice připojená k serveru“, a ne SSH) a vraťte svůj soubor zpět:
root@web1:~# mv /etc/ssh/sshd_config.d/00-beveiliging.conf /root/
root@web1:~# systemctl reload sshPokud nepomůže ani to, obnovte snapshot. U WebOké můžete na obrazovce VPS také nastavit nové heslo pro root; jiní poskytovatelé mají často podobné tlačítko nebo záchranný režim (rescue).
Na AlmaLinuxu a Rocky Linuxu
Služba se jmenuje sshd (systemctl reload sshd). I tam je na začátku Include /etc/ssh/sshd_config.d/*.conf a systém do této složky dodává vlastní soubory; platí stejné pravidlo „platí první hodnota“. Pokud měníte port, musí ho povolit i SELinux (semanage port -a -t ssh_port_t -p tcp 2222) a otevřít firewalld.
Shrnutí
- V
sshd_configplatí první hodnota; soubory vsshd_config.dse načítají jako první. Vlastní nastavení dejte do souboru jako00-beveiliging.conf. - Nastavte
PasswordAuthentication noiKbdInteractiveAuthentication no; root jen s klíčem (prohibit-password) nebo vůbec (no). - Před opětovným načtením kontrolujte pomocí
sshd -ta pomocísshd -Tověřte, která hodnota skutečně platí; pozor na50-cloud-init.conf. - Testujte ve druhém okně a první relaci nechte otevřenou. Znejte konzoli a předem vytvořte snapshot.
- Na Ubuntu 24.04+ vyžaduje jiný port
systemctl daemon-reloadasystemctl restart ssh.socket.
Kvíz
Úkol
Úkol Z2.2: Přihlášení heslem je vypnuté. Vypněte přihlášení heslem a keyboard-interactive podle této lekce a potom nechte program zkontrolovat server zvenčí. Zadejte IP adresu nebo název hostitele svého serveru, port SSH (výchozí 22) a uživatelské jméno, pod kterým se sami přihlašujete (například anna, ne root ani vymyšlené jméno). Program se nepřihlašuje: jen se zeptá, stejně jako každý SSH klient před přihlášením, které metody přihlášení Váš server tomuto uživateli nabízí. Správně je: jen publickey.
Doporučujeme k přečtení
Postupy v těchto článcích platí pro obrazovku VPS u WebOké; u jiných poskytovatelů to funguje podobně.
- Zabezpečení VPS: prvních pět minut
- Žádný přístup k VPS: co teď?
- Snapshoty a zálohy VPS
- Manuál sshd_config: https://man.openbsd.org/sshd_config
- Ubuntu: SSHd now uses socket-based activation: https://discourse.ubuntu.com/t/sshd-now-uses-socket-based-activation-ubuntu-22-10-and-later/30189
