Přejít na obsah

Nastavení cookies

Zvolte, které druhy cookies povolíte. Svou volbu můžete kdykoli změnit přes Nastavení cookies v dolní části každé stránky. Prohlášení o ochraně osobních údajů

Nezbytné

Vždy zapnuté

Potřebné pro přihlášení, uchování košíku a zapamatování vašich voleb. Jsou vždy zapnuté.

Které cookies?
  • weboke_sessie, weboke_klant, weboke_remember: vaše relace a trvalé přihlášení
  • weboke_basket: váš košík
  • wkBtwIncl: zobrazení cen s DPH nebo bez DPH
  • wok_cookies: vaše volba cookies, 12 měsíců

Měří, která reklama vede k návštěvě nebo objednávce, abychom neplatili za reklamy, které nic nepřinášejí.

Které cookies?
  • Google Ads přes Google Tag Manager (_gcl_au, _gcl_aw), až 90 dní
  • OpenAI Ads, reklamy v ChatGPT
  • wok_aff: partner, který vás k nám doporučil (partnerský program), 60 dní

4,6

Země a jazyk

Každá země má vlastní web s cenami a DPH dané země.

Zobrazit

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:

  1. Dva klíče fungují (lekce 2.1) a v novém okně jste ověřili, že přihlášení klíčem funguje.
  2. 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.
  3. Konzoli svého poskytovatele znáte: přes ni se dostanete dovnitř bez SSH.
  4. 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/*.conf

Vš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 yes

Protož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 yes

Existují 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.conf

s tímto obsahem:

# Přihlášení pouze pomocí klíče
PasswordAuthentication no
KbdInteractiveAuthentication no
PermitRootLogin prohibit-password

Co 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 PasswordAuthentication nastaveno na no. Ve starších návodech se toto nastavení jmenuje ChallengeResponseAuthentication; od OpenSSH 8.7 je to zastaralý alternativní název pro totéž. Debian ho ve výchozím stavu už nastavuje na no, 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). no nastavte až tehdy, když víte jistě, že přihlášení jako tento uživatel a sudo fungují.

Volitelně, pro ty, kdo chtějí víc:

AllowUsers anna
AuthenticationMethods publickey

AllowUsers 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 ssh

Na 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.socket

Pokud 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 ssh

Pokud 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_config platí první hodnota; soubory v sshd_config.d se načítají jako první. Vlastní nastavení dejte do souboru jako 00-beveiliging.conf.
  • Nastavte PasswordAuthentication no i KbdInteractiveAuthentication no; root jen s klíčem (prohibit-password) nebo vůbec (no).
  • Před opětovným načtením kontrolujte pomocí sshd -t a pomocí sshd -T ověřte, která hodnota skutečně platí; pozor na 50-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-reload a systemctl restart ssh.socket.

Kvíz

1. Na konci /etc/ssh/sshd_config je PasswordAuthentication no, ale stále se můžete přihlásit heslem. Jaká je nejpravděpodobnější příčina?



2. Proč vedle PasswordAuthentication no nastavujete také KbdInteractiveAuthentication no?



3. Co znamená PermitRootLogin prohibit-password?



4. V jakém pořadí postupujete nejbezpečněji?



5. Na Ubuntu 24.04 změníte řádek Port 22 na Port 2222 a spustíte systemctl restart ssh. Pomocí ss -tlnp vidíte, že se stále naslouchá na portu 22. Na co jste zapomněli?



Ú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.

Úkol Z2.2: Přihlášení heslem je vypnuté

Nepřihlašujeme se a nezkoušíme žádné heslo ani klíč. Nejprve prokážete, že server patří Vám: klikněte na "Zobrazit můj kód" a umístěte na webový server Vašeho názvu hostitele soubor /.well-known/weboke-cursus-<code>.txt, který obsahuje pouze tento kód. Stahujeme ho přímo z každé IP adresy, kterou kontrolujeme (IPv4 a IPv6 zvlášť); záznam TXT se zde nepočítá. Kontrola probíhá ze serveru heavy.webawere.nl (185.158.167.16 a 2a07:ae80:100:0:185:158:167:16), nikoli z našeho webového serveru. Pouze pro přihlášené účastníky kurzu; nejvýše 6 kontrol za hodinu na jeden server. Zjišťujeme pouze, jaké metody přihlášení Váš server nabízí pro Vaše uživatelské jméno, stejně jako to před přihlášením dělá každý SSH klient. Zadejte svého vlastního uživatele: neznámé jméno se ve Vašem logu objeví jako "Invalid user" a fail2ban ho započítá jako jeden pokus.





Co vyplníte a co zjistíme, neukládáme. Váš prohlížeč si pamatuje Vaše odpovědi a to, zda jste úkol splnili. Pokud jste přihlášeni, ukládáme v sekci Moje kurzy pouze to, že jste úkol měli (téměř) správně; i to tam můžete odstranit.

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ě.

Chvíli strpení…

Nastavení vašich domén

U každé domény nastavte jmenné servery, propojení s hostingem a to, kdo bude držitelem.

Načítání vašich domén…