Siirry suoraan sisältöön

Evästeasetukset

Valitse, mitä evästetyyppejä sallit. Voit muuttaa valintaasi milloin tahansa jokaisen sivun alareunassa olevasta kohdasta Evästeasetukset. Tietosuojaseloste

Välttämättömät

Aina käytössä

Tarvitaan sisäänkirjautumiseen, ostoskorin säilyttämiseen ja valintojesi muistamiseen. Nämä ovat aina käytössä.

Mitkä evästeet?
  • weboke_sessie, weboke_klant, weboke_remember: istuntosi ja sisäänkirjautuneena pysyminen
  • weboke_basket: ostoskorisi
  • wkBtwIncl: hintojen näyttäminen verollisina tai verottomina
  • wok_cookies: evästevalintasi, 12 kuukautta

Mittaa, mikä mainos johtaa käyntiin tai tilaukseen, jotta emme maksa mainoksista, joista ei ole hyötyä.

Mitkä evästeet?
  • Google Ads Google Tag Managerin kautta (_gcl_au, _gcl_aw), enintään 90 päivää
  • OpenAI Ads, mainokset ChatGPT-palvelussa
  • wok_aff: minkä kumppanin kautta tulit meille (kumppaniohjelma), 60 päivää

4,6

Maa ja kieli

Jokaisella maalla on oma sivustonsa, jossa on kyseisen maan hinnat ja ALV.

Näytä

Portit ja kuuntelevat palvelut

Moduuli 5: Verkon suojaaminen · Lukuaika: 10 minuuttia

Tavoite: Tämän oppitunnin jälkeen näet, mitkä palvelut kuuntelevat palvelimellasi ja missä osoitteessa, osaat selittää osoitteiden 0.0.0.0 ja 127.0.0.1 eron ja voit tarkistaa ulkopuolelta, mitä kuka tahansa internetissä näkee palvelimestasi.

Keskeiset käsitteet: portti, TCP ja UDP, kuuntelu, ss -tulpn, 0.0.0.0 ja [::], 127.0.0.1 ja [::1], bind-address, avoin, suljettu ja suodatettu, hyökkäyspinta, skannerit

IP-osoite, jossa on 65 535 ovea

Palvelimellasi on IP-osoite, esimerkiksi 192.0.2.10 ja 2001:db8::10. Samassa osoitteessa voi olla tavoitettavissa useita ohjelmia yhtä aikaa, kukin omassa portissaan: portti on numero väliltä 1-65 535. Ohjelma, joka ottaa vastaan yhteyksiä, kuuntelee porttia. Muutama tuttu:

PorttiProtokollaPalvelu
22TCPSSH
80TCPhttp (verkkopalvelin)
443TCP ja UDPhttps (UDP HTTP/3:a varten)
25TCPsähköposti postipalvelinten välillä (SMTP)
3306TCPMySQL ja MariaDB
5432TCPPostgreSQL
6379TCPRedis

TCP on protokolla yhteyksille, joiden täytyy perillä luotettavasti (web, SSH, tietokannat). UDP on nopeille, erillisille paketeille (DNS, VPN:t kuten WireGuard, HTTP/3). Palvelu kuuntelee TCP:tä, UDP:tä tai molempia.

Jokainen kuunteleva portti on ovi palvelimellesi. Jokaisen oven takana on ohjelmisto, jossa voi olla virheitä. Ulkoa tavoitettavien ovien kokonaisuutta kutsutaan hyökkäyspinnaksi. Mitä pienempi, sitä parempi: verkkosivustoa ajava palvelin tarvitsee ulkoa vain portit 22, 80 ja 443.

Mikä kuuntelee: ss

Komento ss (socket statistics) näyttää, mikä palvelimellasi kuuntelee. Valinnat ovat -t (TCP), -u (UDP), -l (vain kuuntelevat), -p (mikä ohjelma) ja -n (numerot, ei nimiä):

anna@web1:~$ sudo ss -tulpn
Netid State  Local Address:Port  Peer Address:Port Process
udp   UNCONN 127.0.0.54:53       0.0.0.0:*         users:(("systemd-resolve",pid=402,fd=16))
tcp   LISTEN 0.0.0.0:22          0.0.0.0:*         users:(("sshd",pid=611,fd=3))
tcp   LISTEN 0.0.0.0:80          0.0.0.0:*         users:(("nginx",pid=902,fd=6))
tcp   LISTEN 0.0.0.0:443         0.0.0.0:*         users:(("nginx",pid=902,fd=7))
tcp   LISTEN 127.0.0.1:3306      0.0.0.0:*         users:(("mariadbd",pid=755,fd=21))
tcp   LISTEN 0.0.0.0:6379        0.0.0.0:*         users:(("redis-server",pid=780,fd=6))
tcp   LISTEN [::]:22             [::]:*            users:(("sshd",pid=611,fd=4))
tcp   LISTEN [::]:80             [::]:*            users:(("nginx",pid=902,fd=8))
tcp   LISTEN [::]:443            [::]:*            users:(("nginx",pid=902,fd=9))

Tärkein sarake on Local Address: osoite, jossa ohjelma kuuntelee.

OsoiteMerkitys
0.0.0.0Kaikki palvelimen IPv4-osoitteet, siis myös julkinen osoite: tavoitettavissa ulkoa (ellei palomuuri estä)
[::]Kaikki IPv6-osoitteet: sama IPv6:lle
127.0.0.1 tai [::1]Vain palvelin itse (loopback): ei koskaan tavoitettavissa ulkoa
127.0.0.53, 127.0.0.54Myös loopback; tässä kuuntelee systemd-resolvedin paikallinen DNS-apu
192.0.2.10Vain tuo yksi osoite

Yllä olevassa esimerkissä MariaDB on kunnossa: se kuuntelee osoitteessa 127.0.0.1, joten siihen pääsevät vain palvelimen omat ohjelmat (sivustosi). Redis taas kuuntelee osoitteessa 0.0.0.0:6379. Jos palomuuri ei ole kunnossa, siihen pääsee koko internet. Juuri tällaisesta virheestä tämä oppitunti kertoo.

Kuuntele oikeassa osoitteessa

Tietokannan, välimuistin tai hallintapaneelin ei pitäisi juuri koskaan olla tavoitettavissa ulkoa. Ensimmäinen ja paras puolustus on, että palvelu kuuntelee vain loopbackissa. Palomuuri (oppitunti 5.2) on toinen kerros; se voi olla vahingossa pois päältä tai jäädä vaikuttamatta (esimerkiksi Dockerin kanssa, oppitunti 9.3).

Asetuksen paikka vaihtelee ohjelmittain:

OhjelmaAsetusTiedosto (Debian/Ubuntu)
MariaDB/MySQLbind-address = 127.0.0.1/etc/mysql/mariadb.conf.d/50-server.cnf
PostgreSQLlisten_addresses = 'localhost'/etc/postgresql/<versie>/main/postgresql.conf
Redisbind 127.0.0.1 -::1 ja protected-mode yes/etc/redis/redis.conf

Debianin ja Ubuntun paketit asettavat nämä palvelut oletuksena jo localhostiin. Yleensä vika syntyy, kun joku seuraa ohjetta, jossa sanotaan "aseta bind-address arvoon 0.0.0.0, niin voit yhdistää ulkoa". Jos haluat itse päästä tietokantaan läppäriltäsi, käytä SSH-tunnelia (oppitunti 2.3): portti pysyy suljettuna, ja vain SSH:n kautta sisään tullut pääsee siihen.

Muutoksen jälkeen käynnistä palvelu uudelleen ja tarkista tilanne taas komennolla ss -tulpn.

Avoin, suljettu ja suodatettu

Ulkoa katsottuna portti voi olla kolmessa tilassa:

  • Avoin (open): jokin kuuntelee ja yhteys onnistuu.
  • Suljettu (closed): mikään ei kuuntele, tai palomuuri torjuu aktiivisesti. Palvelin vastaa heti "ei" (TCP:ssä RST-paketilla). Yhteys epäonnistuu saman tien ilmoituksella "Connection refused" (yhteys torjuttiin).
  • Suodatettu (filtered): palomuuri hylkää paketin hiljaa. Yhteys jää roikkumaan, kunnes aikakatkaisu iskee.

Tietokannalle sekä suljettu että suodatettu ovat hyviä: kukaan ei pääse sisään. Ero kertoo vain, miksi: suodatettu tarkoittaa lähes aina, että palomuurisi pysäyttää yhteyden.

Katso ulkopuolelta

ss näyttää, mikä palvelimella kuuntelee, mutta ei sitä, mikä on tavoitettavissa ulkoa. Välissä on vielä palomuuri, ja palveluntarjoajalla joskus lisäksi verkkopalomuuri. Ainoa todellinen tarkistus on siksi: katso ulkopuolelta, toiselta tietokoneelta.

Omalta tietokoneeltasi (ei palvelimelta itseltään, koska silloin liikenne kulkee loopbackin kautta) voit tarkistaa yhden portin komennolla nc (netcat):

anna@laptop:~$ nc -vz -w 3 192.0.2.10 6379
nc: connect to 192.0.2.10 port 6379 (tcp) failed: Connection refused
anna@laptop:~$ nc -vz -w 3 192.0.2.10 22
Connection to 192.0.2.10 22 port [tcp/ssh] succeeded!

Windowsissa PowerShell tekee saman komennolla Test-NetConnection 192.0.2.10 -Port 6379. Porttiskanneri, kuten nmap, voi tutkia useita portteja kerralla; käytä tällaista skanneria vain omaan palvelimeesi.

Älä unohda IPv6:ta. Yleinen virhe on palomuuri, jossa on säännöt vain IPv4:lle, vaikka palvelu kuuntelee myös osoitteessa [::]. Testaa siis myös IPv6-osoite: nc -6 -vz -w 3 2001:db8::10 6379.

Miksi tämä on niin tärkeää

Palvelintasi skannataan ensimmäisestä minuutista lähtien. Internetin laitteiden ja palveluiden hakukoneet sekä rikollisten botit kokeilevat jatkuvasti kaikkia IPv4-osoitteita tunnetuissa porteissa. Avoin Redis ilman salasanaa, Elasticsearch-klusteri tai MongoDB ilman pääsynhallintaa löytyy lyhyessä ajassa. Avoimien tietokantojen ja hakuklustereiden aiheuttamat tietovuodot ovat usein uutisissa, ja lähes aina kyse on juuri tästä virheestä: sisäiseen käyttöön tarkoitettu palvelu kuunteli kaikissa osoitteissa.

Myös SSH:n porttia koputellaan koko päivän. Se on normaalia, eikä se ole ongelma, kun käytössä ovat avaimet (oppitunti 2.2) ja fail2ban (oppitunti 5.3).

Kurssin tarkistus

Tämän oppitunnin tehtävässä kurssiohjelma tarkistaa ulkopuolelta viisi kiinteää tietokantaporttia palvelimeltasi: 3306 (MySQL/MariaDB), 5432 (PostgreSQL), 6379 (Redis), 9200 (Elasticsearch/OpenSearch) ja 27017 (MongoDB). Ohjelma kokeilee vain, syntyykö yhteys, ei lähetä tietoja eikä kirjaudu mihinkään. Se ei skannaa muita portteja. Tarkistukset tulevat tehtävässä mainitusta IP-osoitteesta, joten tunnistat ne omasta lokistasi. Samaa osoitetta voi tarkistaa vain muutaman kerran tunnissa.

AlmaLinuxissa ja Rocky Linuxissa

ss toimii samalla tavalla. Palveluiden tiedostot ovat eri paikoissa (esimerkiksi /etc/my.cnf.d/ MariaDB:lle, /var/lib/pgsql/data/postgresql.conf PostgreSQL:lle). Lisäksi SELinux voi estää palvelun, joka yrittää kuunnella epätavallista porttia; sen näet silloin komennolla journalctl (oppitunti 6.2), et komennolla ss.

Yhteenveto

  • Jokainen kuunteleva portti on ovi; pidä ulospäin auki vain se, mikä on todella tarpeen (yleensä 22, 80 ja 443).
  • sudo ss -tulpn näyttää, mikä ohjelma kuuntelee missä osoitteessa ja portissa.
  • 0.0.0.0 ja [::] tarkoittavat "kaikki osoitteet", 127.0.0.1 ja [::1] tarkoittavat "vain palvelin itse". Tietokannat, välimuistit ja hakuklusterit kuuluvat loopbackiin.
  • Suljettu ja suodatettu ovat molemmat hyviä tietokannalle; avoin on virhe.
  • Tarkista aina ulkopuolelta, sekä IPv4 että IPv6, koska ss ei näe palomuuria.

Tietovisa (quiz)

1. Komennon ss -tulpn tulosteessa mariadbd-rivillä lukee 127.0.0.1:3306. Mitä se tarkoittaa?



2. Redis kuuntelee osoitteessa 0.0.0.0:6379. Palomuurisi ei päästä porttia 6379 läpi. Mikä on paras toimintatapa?



3. Testaat porttia 5432 ulkopuolelta, ja yhteys roikkuu 3 sekuntia ja epäonnistuu sitten. Mikä on todennäköinen tila?



4. Miksi avoin portti pitää tarkistaa ulkopuolelta eikä vain palvelimella komennolla ss?



5. Palomuurissasi on säännöt IPv4:lle, mutta palvelimellasi on myös IPv6-osoite. Redis kuuntelee osoitteessa [::]:6379. Mikä on riski?



Tehtävä

Tehtävä Z5.1: Tietokantaportit suljettu ulkoa. Aja palvelimellasi sudo ss -tulpn ja selvitä, missä osoitteissa palvelusi kuuntelevat. Anna sen jälkeen kurssiohjelman tarkistaa ulkopuolelta, että palvelimesi portit 3306, 5432, 6379, 9200 ja 27017 eivät ole tavoitettavissa, IPv4:llä ja (jos palvelimellasi on AAAA-tietue) IPv6:lla. Kirjoita myös, mitkä palvelut kuuntelevat sinulla osoitteessa 0.0.0.0 tai [::]. Ohjelma vain avaa yhteyden noihin viiteen porttiin eikä lähetä mitään.

Tehtävä Z5.1: Tietokantaportit suljettu ulkoa

Emme kirjaudu sisään emmekä kokeile salasanaa tai avainta. Osoita ensin, että palvelin on sinun: napsauta "Näytä koodini" ja tallenna isäntänimesi verkkopalvelimelle tiedosto /.well-known/weboke-cursus-<code>.txt, jossa on pelkkä tämä koodi. Haemme sen suoraan jokaisesta tarkistamastamme IP-osoitteesta (IPv4 ja IPv6 erikseen); TXT-tietue ei kelpaa tähän. Tarkistus tulee osoitteesta heavy.webawere.nl (185.158.167.16 ja 2a07:ae80:100:0:185:158:167:16), ei meidän verkkopalvelimeltamme. Vain kirjautuneille kurssilaisille; enintään 6 tarkistusta tunnissa palvelinta kohden. Avaamme vain TCP-yhteyden portteihin 3306, 5432, 6379, 9200, 27017 ja 2375 (IPv4 ja IPv6) emmekä lähetä mitään.




Sitä, mitä kirjoitat ja mitä löydämme, ei tallenneta. Selaimesi muistaa vastauksesi ja sen, oletko suorittanut tehtävän. Jos olet kirjautunut sisään, tallennamme kohtaan Omat kurssit vain sen, että tehtävä oli (lähes) oikein; voit poistaa sen myös sieltä.

Lue lisää

Hetkinen…

Määritä verkkotunnuksesi

Määritä kullekin verkkotunnukselle nimipalvelimet, liitos webhotelliin ja se, kuka tulee omistajaksi.

Ladataan verkkotunnuksia…