Moodul 2 · 2.2
SSH-serveri turvaline seadistamine
Moodul 2: SSH ja võtmed · Lugemisaeg: 12 minutit
Õpieesmärk: Pärast seda õppetundi oskad parooliga sisselogimise ja root-i parooliga sisselogimise välja lülitada, kontrollida, milline seade päriselt kehtib, ja teha seda nii, et sa ennast välja ei lukusta.
Põhimõisted: sshd, sshd_config, sshd_config.d, loeb esimene väärtus, PasswordAuthentication, KbdInteractiveAuthentication, PermitRootLogin, AuthenticationMethods, AllowUsers, sshd -t, sshd -T, teine seanss, cloud-init, ssh.socket
Kõigepealt turvavõrk
Selles õppetunnis paned kinni ukse, millest pead ise läbi käima. Üks trükiviga võib tähendada, et sa enam sisse ei pääse. Seepärast tee enne alustamist alati järgmist:
- Kaks võtit töötavad (õppetund 2.1) ja oled uues aknas kontrollinud, et võtmega sisselogimine õnnestub.
- Hetktõmmis (snapshot) sinu VPS-ist. WebOkés teed selle VPS-i vaates, teistel teenusepakkujatel nimetatakse seda samuti snapshotiks või image'iks. Kui midagi läheb valesti, taasta see.
- Teenusepakkuja konsool on sulle tuttav: sealt pääsed sisse ilma SSH-ta.
- Sinu praegune SSH-seanss jääb lõpuni avatuks. Käimasolev seanss töötab edasi ka siis, kui muudad seadeid või laadid teenuse uuesti. Iga muudatust testid teises aknas.
Kus seaded asuvad
SSH-serveri nimi on sshd. Selle seaded on failis /etc/ssh/sshd_config. Debianis ja Ubuntus on selle faili alguses see rida:
Include /etc/ssh/sshd_config.d/*.confKõik kaustas sshd_config.d olevad failid laiendiga .conf loetakse seega enne põhifaili ülejäänud osa, tähestikulises järjekorras. See on mugav: paned oma seaded eraldi faili ja jätad põhifaili rahule, nii et paketi uuendus sinu muudatusi ei puuduta.
Sellel on aga tagajärg, mis paljusid üllatab. Failis sshd_config kehtib reegel: iga seade puhul loeb esimene väärtus, mille sshd leiab. Hilisemaid sama seadega ridu eiratakse. Kui paned faili sshd_config lõppu PasswordAuthentication no, ei võida see kausta sshd_config.d faili, milles on yes.
cloud-init'i lõks
Paljud VPS-i image'id seadistab esimesel käivitusel cloud-init. Sõltuvalt sellest, kuidas image ja paigaldus on seadistatud, kirjutab cloud-init faili, näiteks /etc/ssh/sshd_config.d/50-cloud-init.conf, milles on näiteks:
PasswordAuthentication yesKuna see fail loetakse enne põhifaili, on parooliga sisselogimine sees, ükskõik mida sa failis sshd_config määrad. Ära siis eelda, vaid kontrolli:
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 yesKaks puhast lahendust: muuda see fail väärtusele no või pane oma seaded faili, mis tuleb tähestikus varem, näiteks 00-beveiliging.conf. Fail 99-mijn.conf just ei tööta, sest siis on cloud-init juba võitnud.
Olulised seaded
Loo oma fail:
root@web1:~# nano /etc/ssh/sshd_config.d/00-beveiliging.confjärgmise sisuga:
# Sisselogimine ainult võtmega
PasswordAuthentication no
KbdInteractiveAuthentication no
PermitRootLogin prohibit-passwordMida iga rida tähendab?
- PasswordAuthentication no: server ei aktsepteeri enam parooli. OpenSSH vaikeväärtus on
yes. - KbdInteractiveAuthentication no: "keyboard-interactive" on teine viis parooli küsida, PAM-i kaudu. Kui jätad selle sisse, saab keegi ikkagi parooli proovida, isegi kui
PasswordAuthenticationon väärtuselno. Vanemates juhendites on selle seade nimiChallengeResponseAuthentication; alates OpenSSH 8.7-st on see sama asja vananenud teine nimi. Debian seab selle vaikimisi juba väärtuseleno, kuid kirjuta see ikkagi faili: nii on asi selge ja klapib ka teistes süsteemides. - PermitRootLogin prohibit-password: root võib sisse logida, aga ainult võtmega. Alates OpenSSH 7.0-st on see vaikeväärtus. Rangem on
PermitRootLogin no: root ei pääse SSH kaudu üldse sisse, logid sisse tavakasutajana ja kasutad sudo't (õppetund 3.2). Määranoalles siis, kui oled kindel, et selle kasutajana sisselogimine jasudotöötavad.
Valikuline, kui tahad rohkem:
AllowUsers anna
AuthenticationMethods publickeyAllowUsers laseb sisse ainult nimetatud kasutajad; iga teine nimi lükatakse tagasi, isegi kui sellel on kehtiv võti. Kasulik, aga ära unusta iseennast ja ära unusta nimekirja täiendada, kui lisad teise halduri. AuthenticationMethods publickey ütleb ühe reaga, et kehtivad ainult võtmed.
Testimine, rakendamine, kontrollimine
Kõigepealt lase sshd-l faili kontrollida. See ei käivita ega muuda midagi:
root@web1:~# sshd -t
root@web1:~#Väljundi puudumine tähendab: vigu pole. Trükivea korral näed rida ja faili. Alles siis laadi teenus uuesti:
root@web1:~# systemctl reload sshDebianis ja Ubuntus on teenuse nimi ssh, AlmaLinuxis ja Rocky Linuxis sshd.
Seejärel kontrolli, milline väärtus päriselt kehtib. sshd -T näitab täielikku, välja arvutatud konfiguratsiooni, kus kõik Include-failid on arvesse võetud:
root@web1:~# sshd -T | grep -Ei 'passwordauth|kbdinteractive|permitrootlogin'
permitrootlogin without-password
passwordauthentication no
kbdinteractiveauthentication no(without-password on väärtuse prohibit-password vana nimi. OpenSSH versioonid enne 10.1, näiteks Debian 13 ja Ubuntu 24.04 omad, näitavad veel vana nime; uuemad näitavad prohibit-password. Tähendus on sama.)
Ja nüüd kõige tähtsam: testi teises aknas, samal ajal kui esimene jääb avatuks.
anna@laptop:~$ ssh anna@192.0.2.10
anna@web1:~$Kui see töötab, proovi meelega parooliga sisse logida. See peab ebaõnnestuma:
anna@laptop:~$ ssh -o PreferredAuthentications=password -o PubkeyAuthentication=no anna@192.0.2.10
anna@192.0.2.10: Permission denied (publickey).Teate Permission denied järel on sulgudes kirjas, milliseid sisselogimisviise server veel pakub. Kui seal on ainult publickey, on kõik korras. Kui seal on ka password või keyboard-interactive, kehtib kuskil veel teine väärtus: kontrolli uuesti käsuga sshd -T.
Just seda nimekirja kontrollib ka kursuse ülesanne, väljastpoolt. Sinu SSH-klient küsib iga ühenduse alguses, milliseid viise tohib kasutada, päringuga tüübist "none". Server vastab nimekirjaga, ilma et proovitaks parooli või võtit.
Ubuntu 24.04 ja uuemad: ssh.socket
Ubuntus alates versioonist 22.10 ei kuula pordil 22 sshd ise, vaid systemd, ssh.socket'i kaudu. Alles siis, kui ühendus saabub, käivitab systemd SSH-teenuse. Selle õppetunni seadete jaoks pole sellel tähtsust: piisab käsust systemctl reload ssh või restart ssh.
Tähtsust on sellel siis, kui muudad porti või kuulamisaadressi (Port, ListenAddress). Alates Ubuntu 24.04-st loeb systemd need väärtused failist sshd_config, kuid ainult pärast järgmist:
root@web1:~# systemctl daemon-reload
root@web1:~# systemctl restart ssh.socketKui see ununeb, kuulab server lihtsalt edasi vanal pordil. Hullem veel: kui avad tulemüüris esmalt uue pordi ja paned vana kinni, aga SSH jääb vanale, lukustad ennast välja. Kontrolli alati käsuga ss -tlnp | grep ssh, kus päriselt kuulatakse (õppetund 5.1), ja ava uus port tulemüüris enne, kui vana sulged. Kas teine port on mõistlik, loe õppetunnist 2.3.
Kui midagi siiski läheb valesti
Kui sa enam sisse ei pääse, ava teenusepakkuja konsool, logi sisse root-ina (parooliga, sest konsool on "klaviatuur serveri küljes", mitte SSH) ja võta oma fail tagasi:
root@web1:~# mv /etc/ssh/sshd_config.d/00-beveiliging.conf /root/
root@web1:~# systemctl reload sshKui ka see ei õnnestu, taasta hetktõmmis. WebOkés saad VPS-i vaates määrata ka uue root-i parooli; teistel teenusepakkujatel on sageli sarnane nupp või päästerežiim (rescue).
AlmaLinuxis ja Rocky Linuxis
Teenuse nimi on sshd (systemctl reload sshd). Ka seal on faili alguses Include /etc/ssh/sshd_config.d/*.conf ja süsteem paneb sellesse kausta oma failid; kehtib sama reegel "loeb esimene väärtus". Kui muudad porti, peab SELinux selle pordi lubama (semanage port -a -t ssh_port_t -p tcp 2222) ja firewalld peab selle avama.
Kokkuvõte
- Failis
sshd_configloeb esimene väärtus; kaustasshd_config.dfailid loetakse enne. Pane oma seaded faili, näiteks00-beveiliging.conf. - Määra
PasswordAuthentication nojaKbdInteractiveAuthentication no; root ainult võtmega (prohibit-password) või üldse mitte (no). - Kontrolli enne uuesti laadimist käsuga
sshd -tja käsugasshd -T, milline väärtus päriselt kehtib; jälgi faili50-cloud-init.conf. - Testi teises aknas ja hoia esimene seanss avatuna. Tunne konsooli ja tee eelnevalt hetktõmmis.
- Ubuntu 24.04+ puhul vajab teine port käske
systemctl daemon-reloadjasystemctl restart ssh.socket.
Test (quiz)
Ülesanne
Ülesanne Z2.2: Parooliga sisselogimine on välja lülitatud. Lülita paroolilogin ja keyboard-interactive välja nagu selles õppetunnis ning lase siis programmil väljastpoolt kontrollida. Sisesta oma serveri IP-aadress või hostinimi, SSH-port (vaikimisi 22) ja kasutajanimi, millega ise sisse logid (näiteks anna, mitte root ega väljamõeldud nimi). Programm ei logi sisse: see küsib ainult, nagu iga SSH-klient enne sisselogimist, milliseid sisselogimisviise sinu server sellele kasutajale pakub. Õige on: ainult publickey.
Loe edasi
Nende artiklite sammud kehtivad WebOké VPS-i vaate kohta; teistel teenusepakkujatel töötab see sarnaselt.
- Oma VPS-i turvamine: esimesed viis minutit
- Pole enam ligipääsu oma VPS-ile: mis nüüd?
- VPS-i hetktõmmised ja varukoopiad
- sshd_config juhend: 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
