Moduuli 2 · 2.2
SSH-palvelimen turvallinen määrittäminen
Moduuli 2: SSH ja avaimet · Lukuaika: 12 minuuttia
Tavoite: Tämän oppitunnin jälkeen osaat poistaa käytöstä salasanalla kirjautumisen ja rootin salasanakirjautumisen, tarkistaa, mikä asetus on todella voimassa, ja tehdä tämän lukitsematta itseäsi ulos.
Keskeiset käsitteet: sshd, sshd_config, sshd_config.d, ensimmäinen arvo ratkaisee, PasswordAuthentication, KbdInteractiveAuthentication, PermitRootLogin, AuthenticationMethods, AllowUsers, sshd -t, sshd -T, toinen istunto, cloud-init, ssh.socket
Ensin turvaverkko
Tällä oppitunnilla suljet oven, josta sinun itsesi pitää kulkea. Yksi kirjoitusvirhe voi tarkoittaa, ettet pääse enää sisään. Tee siksi aina ennen aloittamista nämä:
- Kaksi avainta toimii (oppitunti 2.1), ja olet tarkistanut uudessa ikkunassa, että kirjautuminen avaimella onnistuu.
- Tilannevedos (snapshot) VPS:stäsi. WebOkéssa teet sen VPS-näkymässä, muilla palveluntarjoajilla sen nimi on myös snapshot tai image. Jos jokin menee pieleen, palautat sen.
- Palveluntarjoajasi konsoli on sinulle tuttu: sen kautta pääset sisään ilman SSH:ta.
- Nykyinen SSH-istuntosi pysyy auki loppuun asti. Käynnissä oleva istunto toimii edelleen, vaikka muutat asetuksia tai lataat palvelun uudelleen. Testaat jokaisen muutoksen toisessa ikkunassa.
Missä asetukset ovat
SSH-palvelimen nimi on sshd. Sen asetukset ovat tiedostossa /etc/ssh/sshd_config. Debianissa ja Ubuntussa tiedoston alussa on tämä rivi:
Include /etc/ssh/sshd_config.d/*.confKaikki kansion sshd_config.d tiedostot, joiden pääte on .conf, luetaan siis ennen pääasetustiedoston muuta sisältöä, aakkosjärjestyksessä. Tämä on kätevää: laitat omat asetuksesi omaan tiedostoonsa etkä koske pääasetustiedostoon, jolloin paketin päivitys ei vaikuta muutoksiisi.
Tällä on kuitenkin seuraus, joka yllättää monet. Tiedostossa sshd_config pätee: jokaisen asetuksen kohdalla ratkaisee ensimmäinen arvo, jonka sshd kohtaa. Myöhemmät rivit, joissa on sama asetus, ohitetaan. Jos kirjoitat sshd_config-tiedoston loppuun PasswordAuthentication no, se ei siis voita kansion sshd_config.d tiedostoa, jossa lukee yes.
cloud-initin sudenkuoppa
Monet VPS-imaget määrittää ensimmäisellä käynnistyskerralla cloud-init. Riippuen siitä, miten image ja asennus on määritetty, cloud-init kirjoittaa tiedoston, kuten /etc/ssh/sshd_config.d/50-cloud-init.conf, jossa on esimerkiksi:
PasswordAuthentication yesKoska tämä tiedosto luetaan ennen pääasetustiedostoa, salasanakirjautuminen on käytössä, kirjoitit tiedostoon sshd_config mitä tahansa. Älä siis oleta, vaan tarkista:
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 yesKaksi siistiä ratkaisua: muuta tuo tiedosto arvoon no tai laita omat asetuksesi tiedostoon, joka tulee aakkosissa aiemmin, kuten 00-beveiliging.conf. Tiedosto 99-mijn.conf ei nimenomaan toimi, koska silloin cloud-init on jo voittanut.
Asetukset, joilla on merkitystä
Luo oma tiedostosi:
root@web1:~# nano /etc/ssh/sshd_config.d/00-beveiliging.confja lisää siihen tämä sisältö:
# Kirjautuminen vain avaimella
PasswordAuthentication no
KbdInteractiveAuthentication no
PermitRootLogin prohibit-passwordMitä kukin rivi tarkoittaa?
- PasswordAuthentication no: palvelin ei enää hyväksy salasanaa. OpenSSH:n oletusarvo on
yes. - KbdInteractiveAuthentication no: "keyboard-interactive" on toinen tapa kysyä salasanaa, PAM:n kautta. Jos jätät tämän päälle, joku voi silti kokeilla salasanaa, vaikka
PasswordAuthenticationolisi arvossano. Vanhemmissa ohjeissa tämän asetuksen nimi onChallengeResponseAuthentication; OpenSSH 8.7:stä lähtien se on saman asetuksen vanhentunut vaihtoehtoinen nimi. Debian asettaa sen oletuksena jo arvoonno, mutta kirjoita se silti tiedostoon: silloin asia on selvä ja pitää paikkansa myös muissa järjestelmissä. - PermitRootLogin prohibit-password: root saa kirjautua, mutta vain avaimella. Tämä on ollut oletus OpenSSH 7.0:sta lähtien. Tiukempi vaihtoehto on
PermitRootLogin no: root ei pääse SSH:n kautta sisään lainkaan, vaan kirjaudut tavallisena käyttäjänä ja käytät sudoa (oppitunti 3.2). Asetanovasta, kun olet varma, että kirjautuminen kyseisenä käyttäjänä jasudotoimivat.
Valinnaisesti, jos haluat mennä pidemmälle:
AllowUsers anna
AuthenticationMethods publickeyAllowUsers päästää sisään vain luetellut käyttäjät; kaikki muut nimet hylätään, vaikka niillä olisi kelvollinen avain. Kätevää, mutta älä unohda itseäsi, äläkä unohda lisätä nimeä, kun otat käyttöön toisen ylläpitäjän. AuthenticationMethods publickey kertoo yhdellä rivillä, että vain avaimet kelpaavat.
Testaa, ota käyttöön, tarkista
Ensin annat sshd:n tarkistaa tiedoston. Tämä ei käynnistä eikä muuta mitään:
root@web1:~# sshd -t
root@web1:~#Jos tulostetta ei tule, virheitä ei ole. Kirjoitusvirheen kohdalla näet rivin ja tiedoston. Vasta sitten lataat palvelun uudelleen:
root@web1:~# systemctl reload sshDebianissa ja Ubuntussa palvelun nimi on ssh, AlmaLinuxissa ja Rocky Linuxissa sshd.
Sen jälkeen tarkistat, mikä arvo on todella voimassa. sshd -T näyttää koko lasketun määrityksen, johon kaikki Include-tiedostot on käsitelty:
root@web1:~# sshd -T | grep -Ei 'passwordauth|kbdinteractive|permitrootlogin'
permitrootlogin without-password
passwordauthentication no
kbdinteractiveauthentication no(without-password on vanha nimi arvolle prohibit-password. OpenSSH:n versiot ennen 10.1:tä, kuten Debian 13:ssa ja Ubuntu 24.04:ssä, näyttävät vielä vanhan nimen; uudemmat näyttävät prohibit-password. Merkitys on sama.)
Ja nyt tärkein: testaa toisessa ikkunassa, kun ensimmäinen pysyy auki.
anna@laptop:~$ ssh anna@192.0.2.10
anna@web1:~$Jos se toimii, yritä tarkoituksella kirjautua salasanalla. Tämän pitää epäonnistua:
anna@laptop:~$ ssh -o PreferredAuthentications=password -o PubkeyAuthentication=no anna@192.0.2.10
anna@192.0.2.10: Permission denied (publickey).Tekstin Permission denied perässä suluissa näkyy, mitä kirjautumistapoja palvelin vielä tarjoaa. Jos siinä on vain publickey, kaikki on kunnossa. Jos mukana on password tai keyboard-interactive, jossain on vielä voimassa toinen arvo: tarkista uudelleen komennolla sshd -T.
Juuri tämän listan kurssin tehtävä tarkistaa myös, ulkopuolelta. SSH-asiakasohjelmasi kysyy jokaisen yhteyden alussa ensin, mitkä tavat ovat sallittuja, "none"-tyyppisellä pyynnöllä. Palvelin vastaa listalla, eikä salasanaa tai avainta kokeilla.
Ubuntu 24.04 ja uudemmat: ssh.socket
Ubuntussa versiosta 22.10 lähtien porttia 22 ei kuuntele sshd itse vaan systemd, ssh.socket-yksikön kautta. Vasta kun yhteys saapuu, systemd käynnistää SSH-palvelun. Tämän oppitunnin asetuksiin sillä ei ole vaikutusta: systemctl reload ssh tai restart ssh riittää.
Sillä on kuitenkin merkitystä, jos muutat porttia tai kuunteluosoitetta (Port, ListenAddress). Ubuntu 24.04:stä lähtien systemd lukee nämä arvot tiedostosta sshd_config, mutta vasta tämän jälkeen:
root@web1:~# systemctl daemon-reload
root@web1:~# systemctl restart ssh.socketJos unohdat sen, palvelin kuuntelee edelleen vanhaa porttia. Pahempaa: jos asetat palomuurin ensin uuteen porttiin ja SSH jää vanhaan, lukitset itsesi ulos. Tarkista aina komennolla ss -tlnp | grep ssh, mitä todella kuunnellaan (oppitunti 5.1), ja avaa uusi portti palomuurista ennen kuin suljet vanhan. Onko toisesta portista hyötyä, sen luet oppitunnilta 2.3.
Jos jokin kuitenkin menee pieleen
Jos et enää pääse sisään, avaa palveluntarjoajasi konsoli, kirjaudu rootina (salasanalla, koska konsoli on "näppäimistö palvelimessa" eikä SSH) ja palauta tiedostosi:
root@web1:~# mv /etc/ssh/sshd_config.d/00-beveiliging.conf /root/
root@web1:~# systemctl reload sshJos sekään ei onnistu, palauta tilannevedos. WebOkéssa voit myös asettaa VPS-näkymässä uuden root-salasanan; muilla palveluntarjoajilla on usein vastaava painike tai pelastustila (rescue).
AlmaLinuxissa ja Rocky Linuxissa
Palvelun nimi on sshd (systemctl reload sshd). Myös siellä tiedoston alussa on Include /etc/ssh/sshd_config.d/*.conf, ja järjestelmä tuo omia tiedostojaan tuohon kansioon; sama sääntö "ensimmäinen arvo ratkaisee" pätee. Jos muutat porttia, SELinuxin on myös sallittava se (semanage port -a -t ssh_port_t -p tcp 2222) ja firewalldin avattava se.
Yhteenveto
- Tiedostossa
sshd_configratkaisee ensimmäinen arvo; kansionsshd_config.dtiedostot luetaan ensin. Laita omat asetuksesi tiedostoon, kuten00-beveiliging.conf. - Aseta
PasswordAuthentication nojaKbdInteractiveAuthentication no; root vain avaimella (prohibit-password) tai ei lainkaan (no). - Tarkista komennolla
sshd -tennen uudelleenlatausta ja komennollasshd -T, mikä arvo on todella voimassa; varo tiedostoa50-cloud-init.conf. - Testaa toisessa ikkunassa ja pidä ensimmäinen istunto auki. Tunne konsoli ja tee tilannevedos etukäteen.
- Ubuntu 24.04+:ssa toinen portti vaatii komennot
systemctl daemon-reloadjasystemctl restart ssh.socket.
Tietovisa (quiz)
Tehtävä
Tehtävä Z2.2: Salasanakirjautuminen on pois päältä. Poista salasanakirjautuminen ja keyboard-interactive käytöstä tämän oppitunnin mukaisesti ja anna sitten ohjelman tarkistaa tilanne ulkopuolelta. Anna palvelimesi IP-osoite tai isäntänimi, SSH-portti (oletus 22) ja käyttäjänimi, jolla itse kirjaudut (esimerkiksi anna, ei root eikä keksitty nimi). Ohjelma ei kirjaudu sisään: se vain kysyy, kuten jokainen SSH-asiakasohjelma ennen kirjautumista, mitä kirjautumistapoja palvelimesi tarjoaa kyseiselle käyttäjälle. Oikea tulos: vain publickey.
Lue lisää
Näiden artikkelien vaiheet koskevat WebOkén VPS-näkymää; muilla palveluntarjoajilla toiminta on samankaltaista.
- VPS:n suojaaminen: ensimmäiset viisi minuuttia
- Et pääse enää VPS:llesi: mitä nyt?
- VPS-palvelimen snapshotit ja varmuuskopiot
- sshd_config-käyttöohje: 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
