Modul 2 · 2.2
Sigurno postavljanje SSH poslužitelja
Modul 2: SSH i ključevi · Vrijeme čitanja: 12 minuta
Cilj učenja: Nakon ove lekcije moći ćete isključiti prijavu lozinkom i root prijavu lozinkom, provjeriti koja postavka stvarno vrijedi i to učiniti tako da sami sebi ne zaključate pristup.
Ključni pojmovi: sshd, sshd_config, sshd_config.d, vrijedi prva vrijednost, PasswordAuthentication, KbdInteractiveAuthentication, PermitRootLogin, AuthenticationMethods, AllowUsers, sshd -t, sshd -T, druga sesija, cloud-init, ssh.socket
Najprije sigurnosna mreža
U ovoj lekciji zatvarate nešto kroz što i sami morate proći. Jedna tipfeler može značiti da više ne možete ući. Zato uvijek, prije nego što počnete:
- Dva ključa rade (lekcija 2.1) i u novom ste prozoru provjerili da prijava ključem uspijeva.
- Snapshot Vašeg VPS-a. Kod WebOkéa ga izrađujete na zaslonu VPS-a, a kod drugih pružatelja zove se također snapshot ili image. Ako nešto pođe po zlu, vratite ga.
- Konzolu svog pružatelja poznajete: preko nje ulazite bez SSH-a.
- Vaša trenutna SSH sesija ostaje otvorena do samog kraja. Aktivna sesija nastavlja raditi kada mijenjate postavke ili ponovno učitate uslugu. Svaku promjenu testirate u drugom prozoru.
Gdje se nalaze postavke
SSH poslužitelj zove se sshd. Njegove postavke nalaze se u /etc/ssh/sshd_config. Na Debianu i Ubuntuu na vrhu te datoteke stoji ovaj redak:
Include /etc/ssh/sshd_config.d/*.confSve datoteke s nastavkom .conf u mapi sshd_config.d čitaju se dakle prije ostatka glavne datoteke, abecednim redom. To je praktično: vlastite postavke stavljate u zasebnu datoteku, a glavnu datoteku ne dirate, pa ažuriranje paketa ne utječe na Vaše izmjene.
No to ima posljedicu koja mnoge iznenadi. U sshd_config vrijedi: za svaku postavku važi prva vrijednost na koju sshd naiđe. Kasniji retci s istom postavkom zanemaruju se. Tko na dno datoteke sshd_config upiše PasswordAuthentication no, time ne nadjačava datoteku u sshd_config.d u kojoj piše yes.
Zamka cloud-inita
Mnoge VPS slike pri prvom pokretanju postavlja cloud-init. Ovisno o tome kako su slika i instalacija postavljene, cloud-init zapisuje datoteku poput /etc/ssh/sshd_config.d/50-cloud-init.conf u kojoj stoji primjerice:
PasswordAuthentication yesBudući da se ta datoteka čita prije glavne datoteke, prijava lozinkom ostaje uključena, bez obzira na to što upišete u sshd_config. Zato ništa ne pretpostavljajte, nego provjerite:
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 yesDva su uredna rješenja: promijenite tu datoteku u no ili stavite vlastite postavke u datoteku koja abecedno dolazi ranije, poput 00-beveiliging.conf. Datoteka 99-mijn.conf upravo neće raditi, jer je tada cloud-init već pobijedio.
Postavke koje su važne
Izradite vlastitu datoteku:
root@web1:~# nano /etc/ssh/sshd_config.d/00-beveiliging.confsa sljedećim sadržajem:
# Prijava samo pomoću ključa
PasswordAuthentication no
KbdInteractiveAuthentication no
PermitRootLogin prohibit-passwordŠto znači svaki redak?
- PasswordAuthentication no: poslužitelj više ne prihvaća lozinku. Zadana vrijednost OpenSSH-a je
yes. - KbdInteractiveAuthentication no: "keyboard-interactive" je drugi način traženja lozinke, preko PAM-a. Ako ovo ostavite uključeno, netko i dalje može pokušati s lozinkom, čak i ako je
PasswordAuthenticationpostavljeno nano. U starijim uputama ova se postavka zoveChallengeResponseAuthentication; od OpenSSH 8.7 to je zastarjeli drugi naziv za isto. Debian je prema zadanim postavkama već postavlja nano, ali je ipak upišite: tada je jasno i ispravno je i na drugim sustavima. - PermitRootLogin prohibit-password: root se smije prijaviti, ali samo ključem. To je zadana vrijednost od OpenSSH 7.0. Strože je
PermitRootLogin no: root uopće ne smije ući preko SSH-a, prijavljujete se kao običan korisnik i koristite sudo (lekcija 3.2). Postavitenotek kada ste sigurni da prijava kao taj korisnik isudorade.
Neobavezno, za one koji žele više:
AllowUsers anna
AuthenticationMethods publickeyAllowUsers pušta unutra samo navedene korisnike; svako drugo ime odbija se, čak i ako ima valjan ključ. Korisno, ali ne zaboravite sebe i ne zaboravite dopuniti popis kada dodate drugog administratora. AuthenticationMethods publickey u jednom retku kaže da vrijede samo ključevi.
Testiranje, primjena, provjera
Najprije neka sshd provjeri datoteku. To ništa ne pokreće i ništa ne mijenja:
root@web1:~# sshd -t
root@web1:~#Nema ispisa znači: nema pogrešaka. Kod tipfelera vidjet ćete redak i datoteku. Tek tada ponovno učitajte uslugu:
root@web1:~# systemctl reload sshNa Debianu i Ubuntuu usluga se zove ssh, a na AlmaLinuxu i Rocky Linuxu sshd.
Zatim provjerite koja vrijednost stvarno vrijedi. sshd -T prikazuje potpunu, izračunatu konfiguraciju sa svim obrađenim Include datotekama:
root@web1:~# sshd -T | grep -Ei 'passwordauth|kbdinteractive|permitrootlogin'
permitrootlogin without-password
passwordauthentication no
kbdinteractiveauthentication no(without-password je stari naziv za prohibit-password. Verzije OpenSSH-a prije 10.1, kao na Debianu 13 i Ubuntuu 24.04, još prikazuju stari naziv; novije prikazuju prohibit-password. Značenje je isto.)
A sada najvažnije: testirajte u drugom prozoru, dok prvi ostaje otvoren.
anna@laptop:~$ ssh anna@192.0.2.10
anna@web1:~$Ako to radi, namjerno se pokušajte prijaviti lozinkom. To mora propasti:
anna@laptop:~$ ssh -o PreferredAuthentications=password -o PubkeyAuthentication=no anna@192.0.2.10
anna@192.0.2.10: Permission denied (publickey).Iza Permission denied u zagradama piše koje načine prijave poslužitelj još nudi. Ako tamo stoji samo publickey, sve je u redu. Ako uz to stoji password ili keyboard-interactive, negdje još vrijedi druga vrijednost: ponovno provjerite s sshd -T.
Upravo taj popis provjerava i zadatak u tečaju, izvana. Vaš SSH klijent pri svakoj vezi najprije pita koji su načini dopušteni, zahtjevom vrste "none". Poslužitelj odgovara popisom, a da se pritom ne pokušava ni lozinka ni ključ.
Ubuntu 24.04 i noviji: ssh.socket
Na Ubuntuu od verzije 22.10 na priključku 22 ne sluša sam sshd, nego systemd, preko ssh.socket. Tek kada stigne veza, systemd pokreće SSH uslugu. Za postavke iz ove lekcije to nije bitno: systemctl reload ssh ili restart ssh je dovoljno.
Bitno je međutim kada mijenjate priključak ili adresu na kojoj se sluša (Port, ListenAddress). Od Ubuntua 24.04 systemd te vrijednosti čita iz sshd_config, ali tek nakon:
root@web1:~# systemctl daemon-reload
root@web1:~# systemctl restart ssh.socketAko to zaboravite, poslužitelj i dalje sluša na starom priključku. Još gore: ako najprije postavite vatrozid na novi priključak, a SSH ostane na starom, sami ste sebi zaključali pristup. Uvijek provjerite s ss -tlnp | grep ssh na čemu se stvarno sluša (lekcija 5.1) i otvorite novi priključak u vatrozidu prije nego što zatvorite stari. Ima li smisla drugi priključak, pročitajte u lekciji 2.3.
Ako ipak pođe po zlu
Ako više ne možete ući, otvorite konzolu svog pružatelja, prijavite se kao root (lozinkom, jer je konzola "tipkovnica spojena na poslužitelj", a ne SSH) i vratite svoju datoteku:
root@web1:~# mv /etc/ssh/sshd_config.d/00-beveiliging.conf /root/
root@web1:~# systemctl reload sshAko ni to ne uspije, vratite snapshot. Kod WebOkéa na zaslonu VPS-a možete postaviti i novu root lozinku; drugi pružatelji često imaju sličan gumb ili način za spašavanje (rescue).
Na AlmaLinuxu i Rocky Linuxu
Usluga se zove sshd (systemctl reload sshd). I tamo na vrhu stoji Include /etc/ssh/sshd_config.d/*.conf, a sustav u toj mapi isporučuje vlastite datoteke; vrijedi isto pravilo "vrijedi prva vrijednost". Ako mijenjate priključak, SELinux mora i taj priključak dopustiti (semanage port -a -t ssh_port_t -p tcp 2222), a firewalld ga mora otvoriti.
Sažetak
- U
sshd_configvrijedi prva vrijednost; datoteke usshd_config.dčitaju se prve. Vlastite postavke stavite u datoteku poput00-beveiliging.conf. - Postavite
PasswordAuthentication noiKbdInteractiveAuthentication no; root samo s ključem (prohibit-password) ili nikako (no). - Provjerite s
sshd -tprije ponovnog učitavanja, a ssshd -Tkoja vrijednost stvarno vrijedi; pazite na50-cloud-init.conf. - Testirajte u drugom prozoru i držite prvu sesiju otvorenom. Upoznajte konzolu i unaprijed izradite snapshot.
- Na Ubuntuu 24.04+ drugi priključak zahtijeva
systemctl daemon-reloadisystemctl restart ssh.socket.
Kviz
Zadatak
Zadatak Z2.2: Prijava lozinkom je isključena. Isključite prijavu lozinkom i keyboard-interactive kao u ovoj lekciji, a zatim neka program provjeri izvana. Unesite IP adresu ili naziv hosta svog poslužitelja, SSH priključak (zadano 22) i korisničko ime kojim se sami prijavljujete (primjerice anna, a ne root ili izmišljeno ime). Program se ne prijavljuje: samo pita, kao svaki SSH klijent prije prijave, koje načine prijave Vaš poslužitelj nudi za tog korisnika. Ispravno je: samo publickey.
Dodatno štivo
Koraci u ovim člancima odnose se na zaslon VPS-a u WebOkéu; kod drugih pružatelja postupak je sličan.
- Zaštita Vašeg VPS-a: prvih pet minuta
- Više nemate pristup svom VPS-u: što sada?
- Snimke stanja i sigurnosne kopije Vašeg VPS-a
- Priručnik za 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
- VPS: od prve prijave do sigurnog poslužitelja 3.2: Isključivanje prijave lozinkom i prijave kao root
