Moduuli 5 · 5.1
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:
| Portti | Protokolla | Palvelu |
|---|---|---|
| 22 | TCP | SSH |
| 80 | TCP | http (verkkopalvelin) |
| 443 | TCP ja UDP | https (UDP HTTP/3:a varten) |
| 25 | TCP | sähköposti postipalvelinten välillä (SMTP) |
| 3306 | TCP | MySQL ja MariaDB |
| 5432 | TCP | PostgreSQL |
| 6379 | TCP | Redis |
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.
| Osoite | Merkitys |
|---|---|
0.0.0.0 | Kaikki 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.54 | Myös loopback; tässä kuuntelee systemd-resolvedin paikallinen DNS-apu |
192.0.2.10 | Vain 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:
| Ohjelma | Asetus | Tiedosto (Debian/Ubuntu) |
|---|---|---|
| MariaDB/MySQL | bind-address = 127.0.0.1 | /etc/mysql/mariadb.conf.d/50-server.cnf |
| PostgreSQL | listen_addresses = 'localhost' | /etc/postgresql/<versie>/main/postgresql.conf |
| Redis | bind 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 -tulpnnäyttää, mikä ohjelma kuuntelee missä osoitteessa ja portissa.0.0.0.0ja[::]tarkoittavat "kaikki osoitteet",127.0.0.1ja[::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
ssei näe palomuuria.
Tietovisa (quiz)
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.
Lue lisää
- VPS:n suojaaminen: ensimmäiset viisi minuuttia
- Ohjesivu
ss(8)(englanniksi): https://manpages.debian.org/trixie/iproute2/ss.8.en.html - Redis, Security (englanniksi): https://redis.io/docs/latest/operate/oss_and_stack/management/security/
