Modul 2 · 2.2
Slovenčina
Bezpečné nastavenie SSH servera
Modul 2: SSH a kľúče · Čas čítania: 12 minút
Cieľ lekcie: Po tejto lekcii dokážete vypnúť prihlasovanie heslom a prihlasovanie roota heslom, overiť, ktoré nastavenie skutočne platí, a urobiť to tak, aby ste si nezablokovali prístup.
Kľúčové pojmy: sshd, sshd_config, sshd_config.d, platí prvá hodnota, PasswordAuthentication, KbdInteractiveAuthentication, PermitRootLogin, AuthenticationMethods, AllowUsers, sshd -t, sshd -T, druhá relácia, cloud-init, ssh.socket
Najprv záchranná sieť
Táto lekcia zatvára dvere, ktorými musíte prechádzať aj vy sami. Jeden preklep môže znamenať, že sa už neprihlásite. Preto vždy predtým, ako začnete:
- Dva kľúče fungujú (lekcia 2.1) a v novom okne ste overili, že prihlásenie kľúčom funguje.
- Snapshot vášho VPS. Vo WebOké ho vytvoríte na obrazovke VPS, u iných poskytovateľov sa tiež volá snapshot alebo image. Ak sa niečo pokazí, obnovíte ho.
- Konzolu svojho poskytovateľa poznáte: cez ňu sa dostanete dnu bez SSH.
- Vaša aktuálna SSH relácia zostáva otvorená až do konca. Bežiaca relácia funguje ďalej, aj keď zmeníte nastavenia alebo službu znovu načítate. Každú zmenu otestujte v druhom okne.
Kde sú nastavenia uložené
SSH server sa volá sshd. Jeho nastavenia sú v /etc/ssh/sshd_config. Na Debiane a Ubuntu je na začiatku tohto súboru tento riadok:
Include /etc/ssh/sshd_config.d/*.confVšetky súbory s .conf v priečinku sshd_config.d sa teda načítajú pred zvyškom hlavného súboru, v abecednom poradí. To je praktické: vlastné nastavenia zapíšete do vlastného súboru a hlavný súbor necháte tak, takže aktualizácia balíka vaše zmeny neprepíše.
Má to však dôsledok, ktorý mnohých prekvapí. V sshd_config platí: pre každé nastavenie sa použije prvá hodnota, na ktorú sshd narazí. Neskoršie riadky s rovnakým nastavením sa ignorujú. Kto na koniec sshd_config zapíše PasswordAuthentication no, teda neprebije súbor v sshd_config.d, ktorý hovorí yes.
Pasca cloud-init
Mnohé VPS image pri prvom spustení nastavuje cloud-init. V závislosti od toho, ako sú image a inštalácia nastavené, vytvorí cloud-init súbor ako /etc/ssh/sshd_config.d/50-cloud-init.conf, v ktorom je napríklad:
PasswordAuthentication yesKeďže sa tento súbor načíta skôr ako hlavný súbor, prihlasovanie heslom zostane zapnuté, nech do sshd_config zapíšete čokoľvek. Nič teda nepredpokladajte, ale overte to:
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ú dve čisté riešenia: upravte tento súbor na no, alebo zapíšte vlastné nastavenia do súboru, ktorý je v abecede skôr, napríklad 00-beveiliging.conf. Súbor 99-mijn.conf naopak nefunguje, pretože vtedy už cloud-init vyhral.
Nastavenia, na ktorých záleží
Vytvorte vlastný súbor:
root@web1:~# nano /etc/ssh/sshd_config.d/00-beveiliging.confs týmto obsahom:
# Prihlásenie iba pomocou kľúča
PasswordAuthentication no
KbdInteractiveAuthentication no
PermitRootLogin prohibit-passwordČo znamená každý riadok?
- PasswordAuthentication no: server už neprijme heslo. Predvolená hodnota OpenSSH je
yes. - KbdInteractiveAuthentication no: "keyboard-interactive" je druhý spôsob, ako si vypýtať heslo, a to cez PAM. Ak ho necháte zapnutý, niekto môže heslo skúšať aj naďalej, aj keď je
PasswordAuthenticationnastavené nano. V starších návodoch sa toto nastavenie voláChallengeResponseAuthentication; od OpenSSH 8.7 je to zastaraný iný názov pre to isté. Debian ho štandardne nastavuje nano, napriek tomu ho tam zapíšte: je to prehľadné a platí to aj na iných systémoch. - PermitRootLogin prohibit-password: root sa môže prihlásiť, ale iba kľúčom. Od OpenSSH 7.0 je to predvolené nastavenie. Prísnejšie je
PermitRootLogin no: root sa cez SSH nedostane dnu vôbec, prihlasujete sa ako bežný používateľ a používate sudo (lekcia 3.2).nonastavte až vtedy, keď máte istotu, že prihlásenie ako tento používateľ asudofungujú.
Voliteľne, pre tých, ktorí chcú viac:
AllowUsers anna
AuthenticationMethods publickeyAllowUsers pustí dnu iba uvedených používateľov; každé iné meno je odmietnuté, aj keď má platný kľúč. Je to praktické, ale nezabudnite na seba a nezabudnite zoznam doplniť, keď pridáte druhého správcu. AuthenticationMethods publickey jedným riadkom určuje, že platia iba kľúče.
Testovanie, použitie, kontrola
Najprv nechajte sshd súbor skontrolovať. Nič sa tým nespúšťa ani nemení:
root@web1:~# sshd -t
root@web1:~#Žiadny výstup znamená: žiadne chyby. Pri preklepe uvidíte riadok a súbor. Až potom službu znovu načítajte:
root@web1:~# systemctl reload sshNa Debiane a Ubuntu sa služba volá ssh, na AlmaLinux a Rocky Linux sshd.
Potom overte, ktorá hodnota skutočne platí. sshd -T zobrazí úplnú, vyhodnotenú konfiguráciu so spracovanými všetkými súbormi z Include:
root@web1:~# sshd -T | grep -Ei 'passwordauth|kbdinteractive|permitrootlogin'
permitrootlogin without-password
passwordauthentication no
kbdinteractiveauthentication no(without-password je starý názov pre prohibit-password. Verzie OpenSSH pred 10.1, napríklad na Debiane 13 a Ubuntu 24.04, ešte zobrazujú starý názov; novšie zobrazujú prohibit-password. Znamená to to isté.)
A teraz to najdôležitejšie: testujte v druhom okne, kým prvé zostáva otvorené.
anna@laptop:~$ ssh anna@192.0.2.10
anna@web1:~$Ak to funguje, skúste sa zámerne prihlásiť heslom. Toto musí zlyhať:
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átvorkách uvedené, ktoré metódy prihlásenia server ešte ponúka. Ak je tam iba publickey, je to v poriadku. Ak je tam aj password alebo keyboard-interactive, niekde ešte platí iná hodnota: skontrolujte to znova pomocou sshd -T.
Presne tento zoznam kontroluje zvonku aj úloha kurzu. Váš SSH klient sa pri každom spojení najprv opýta, ktoré metódy sú povolené, a to požiadavkou typu "none". Server odpovie zoznamom bez toho, aby sa skúšalo heslo alebo kľúč.
Ubuntu 24.04 a novšie: ssh.socket
Na Ubuntu od verzie 22.10 nepočúva na porte 22 samotný sshd, ale systemd, prostredníctvom ssh.socket. Až keď príde spojenie, systemd spustí službu SSH. Pre nastavenia v tejto lekcii to nehrá rolu: systemctl reload ssh alebo restart ssh stačí.
Rolu to však hrá, keď meníte port alebo adresu počúvania (Port, ListenAddress). Od Ubuntu 24.04 číta systemd tieto hodnoty z sshd_config, ale iba po:
root@web1:~# systemctl daemon-reload
root@web1:~# systemctl restart ssh.socketAk na to zabudnete, server bude naďalej počúvať na starom porte. Horšie je toto: ak najprv nastavíte firewall na nový port a SSH zostane na starom, zablokujete si prístup. Vždy overte pomocou ss -tlnp | grep ssh, kde sa skutočne počúva (lekcia 5.1), a nový port povoľte vo firewalle skôr, ako zatvoríte starý. Či má iný port zmysel, sa dočítate v lekcii 2.3.
Ak sa niečo napriek tomu pokazí
Ak sa už nedostanete dnu, otvorte konzolu svojho poskytovateľa, prihláste sa ako root (heslom, pretože konzola je "klávesnica pripojená k serveru", nie SSH) a vráťte svoj súbor späť:
root@web1:~# mv /etc/ssh/sshd_config.d/00-beveiliging.conf /root/
root@web1:~# systemctl reload sshAk nepomôže ani to, obnovte snapshot. Vo WebOké môžete na obrazovke VPS nastaviť aj nové heslo pre roota; iní poskytovatelia mávajú podobné tlačidlo alebo záchranný režim (rescue).
Na AlmaLinux a Rocky Linux
Služba sa volá sshd (systemctl reload sshd). Aj tam je na začiatku Include /etc/ssh/sshd_config.d/*.conf a systém do tohto priečinka dodáva vlastné súbory; platí rovnaké pravidlo "platí prvá hodnota". Ak meníte port, musí ho povoliť aj SELinux (semanage port -a -t ssh_port_t -p tcp 2222) a firewalld ho musí otvoriť.
Zhrnutie
- V
sshd_configplatí prvá hodnota; súbory vsshd_config.dsa načítajú ako prvé. Vlastné nastavenia zapíšte do súboru ako00-beveiliging.conf. - Nastavte
PasswordAuthentication noajKbdInteractiveAuthentication no; root iba s kľúčom (prohibit-password) alebo vôbec (no). - Pred opätovným načítaním skontrolujte konfiguráciu pomocou
sshd -ta pomocousshd -Toverte, ktorá hodnota skutočne platí; pozor na50-cloud-init.conf. - Testujte v druhom okne a prvú reláciu nechajte otvorenú. Poznajte konzolu a vopred si vytvorte snapshot.
- Na Ubuntu 24.04+ si iný port vyžaduje
systemctl daemon-reloadasystemctl restart ssh.socket.
Kvíz
Úloha
Úloha Z2.2: Prihlasovanie heslom je vypnuté. Vypnite prihlasovanie heslom a keyboard-interactive tak, ako je opísané v tejto lekcii, a potom nechajte program skontrolovať server zvonku. Zadajte IP adresu alebo názov hostiteľa vášho servera, SSH port (štandardne 22) a používateľské meno, ktorým sa sami prihlasujete (napríklad anna, nie root ani vymyslené meno). Program sa neprihlasuje: iba sa opýta, ako každý SSH klient pred prihlásením, ktoré metódy prihlásenia váš server pre daného používateľa ponúka. Správny výsledok je: iba publickey.
Ďalšie čítanie
Postupy v týchto článkoch platia pre obrazovku VPS vo WebOké; u iných poskytovateľov to funguje podobne.
- Zabezpečenie VPS: prvých päť minút
- Žiadny prístup k VPS: čo teraz?
- Snapshoty a zálohy VPS
- Príručka 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
