Moodul 5 · 5.1
Pordid ja kuulavad teenused
Moodul 5: Võrgu kaitsmine · Lugemisaeg: 10 minutit
Õpieesmärk: Pärast seda õppetundi näed, millised teenused su serveris kuulavad ja millisel aadressil, oskad selgitada erinevust 0.0.0.0 ja 127.0.0.1 vahel ning kontrollida väljastpoolt, mida kõik internetis su serverist näevad.
Põhimõisted: port, TCP ja UDP, kuulamine, ss -tulpn, 0.0.0.0 ja [::], 127.0.0.1 ja [::1], bind-address, avatud, suletud ja filtreeritud, ründepind, skannerid
Üks IP-aadress ja 65 535 ust
Su serveril on IP-aadress, näiteks 192.0.2.10 ja 2001:db8::10. Sellel aadressil võivad korraga olla kättesaadavad mitu programmi, igaüks oma pordil: number vahemikus 1 kuni 65 535. Programm, mis võtab vastu ühendusi, kuulab mingit porti. Mõned tuntumad:
| Port | Protokoll | Teenus |
|---|---|---|
| 22 | TCP | SSH |
| 80 | TCP | http (veebiserver) |
| 443 | TCP ja UDP | https (UDP HTTP/3 jaoks) |
| 25 | TCP | e-post meiliserverite vahel (SMTP) |
| 3306 | TCP | MySQL ja MariaDB |
| 5432 | TCP | PostgreSQL |
| 6379 | TCP | Redis |
TCP on protokoll ühenduste jaoks, mis peavad kindlalt kohale jõudma (veeb, SSH, andmebaasid). UDP on kiirete üksikute pakettide jaoks (DNS, VPN-id nagu WireGuard, HTTP/3). Teenus kuulab TCP-d, UDP-d või mõlemat.
Iga kuulav port on uks su serverisse. Iga ukse taga on tarkvara, milles võib olla vigu. Kõiki uksi, mis on väljastpoolt kättesaadavad, nimetatakse kokku su ründepinnaks. Mida väiksem, seda parem: veebisaidiga server vajab väljastpoolt ainult porte 22, 80 ja 443.
Vaata, mis kuulab: ss
Käsk ss (socket statistics) näitab, mis su serveris kuulab. Valikutega -t (TCP), -u (UDP), -l (ainult kuulavad), -p (milline programm) ja -n (numbrid, mitte nimed):
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))Kõige olulisem veerg on Local Address: aadress, millel programm kuulab.
| Aadress | Tähendus |
|---|---|
0.0.0.0 | Kõik serveri IPv4-aadressid, seega ka avalik aadress: kättesaadav väljastpoolt (kui tulemüür seda ei takista) |
[::] | Kõik IPv6-aadressid: sama IPv6 jaoks |
127.0.0.1 või [::1] | Ainult server ise (loopback): väljastpoolt ei ole kunagi kättesaadav |
127.0.0.53, 127.0.0.54 | Samuti loopback; siin kuulab systemd-resolved'i kohalik DNS-abiline |
192.0.2.10 | Ainult see üks aadress |
Ülaltoodud näites on MariaDB korras: see kuulab aadressil 127.0.0.1, seega pääsevad sellele ligi ainult serveris endas olevad programmid (su veebisait). Redis aga kuulab aadressil 0.0.0.0:6379. Kui tulemüür pole õigesti seadistatud, pääseb sellele ligi kogu internet. Just sellist viga see õppetund käsitlebki.
Kuula õigel aadressil
Andmebaas, vahemälu või halduspaneel ei tohiks peaaegu kunagi olla väljastpoolt kättesaadav. Esimene ja parim kaitse on see, et teenus kuulab ainult loopbackil. Tulemüür (õppetund 5.2) on teine kiht; see võib kogemata välja lülitatud olla või mitte kehtida (näiteks Dockeri puhul, õppetund 9.3).
Kus seda seadistad, sõltub programmist:
| Programm | Seadistus | Fail (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 |
Debiani ja Ubuntu paketid seadistavad need teenused vaikimisi juba localhostile. Tavaliselt läheb asi viltu siis, kui keegi järgib juhendit, mis ütleb: "sea bind-address väärtuseks 0.0.0.0, et väljastpoolt ühendust luua". Kui tahad ise oma sülearvutist andmebaasile ligi pääseda, kasuta SSH-tunnelit (õppetund 2.3): port jääb suletuks ja ligi pääseb ainult see, kes tuleb sisse SSH kaudu.
Pärast muudatust taaskäivita teenus ja kontrolli uuesti käsuga ss -tulpn.
Avatud, suletud ja filtreeritud
Väljastpoolt vaadates võib port olla kolmes olekus:
- Avatud (open): midagi kuulab ja ühendus õnnestub.
- Suletud (closed): midagi ei kuula või tulemüür keeldub aktiivselt. Server saadab kohe tagasi "ei" (TCP puhul RST-paketi). Ühendus ebaõnnestub kohe teatega "Connection refused".
- Filtreeritud (filtered): tulemüür viskab paketi vaikselt minema. Ühendus jääb rippuma, kuni saabub aegumine (time-out).
Andmebaasi jaoks on nii suletud kui ka filtreeritud head: keegi ei pääse ligi. Erinevus ütleb sulle ainult, miks: filtreeritud tähendab peaaegu alati, et seda takistab su tulemüür.
Vaata väljastpoolt
ss näitab, mis serveris kuulab, aga mitte seda, mis on väljastpoolt kättesaadav. Vahepeal on veel tulemüür, teenusepakkuja juures mõnikord ka võrgutulemüür. Ainus tõeline kontroll on seega: vaata väljastpoolt, mõnest teisest arvutist.
Oma arvutist (mitte serverist endast, sest siis käib ühendus loopbacki kaudu) saad ühte porti kontrollida käsuga 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!Windowsis teeb PowerShell sama käsuga Test-NetConnection 192.0.2.10 -Port 6379. Pordiskanner, näiteks nmap, saab vaadata korraga rohkem porte; kasuta sellist skannerit ainult oma serveri peal.
Ära unusta IPv6-te. Levinud viga on tulemüür, millel on reeglid ainult IPv4 jaoks, samal ajal kui teenus kuulab ka aadressil [::]. Testi seega ka IPv6-aadressi: nc -6 -vz -w 3 2001:db8::10 6379.
Miks see nii oluline on
Sinu serverit skannitakse alates esimesest minutist. Interneti seadmete ja teenuste otsingumootorid ning kurjategijate robotid proovivad pidevalt kõiki IPv4-aadresse tuntud portidel. Avatud Redis ilma paroolita, Elasticsearchi klaster või MongoDB ilma juurdepääsukontrollita leitakse lühikese ajaga. Avatud andmebaaside ja otsinguklastrite tõttu tekkinud andmelekked jõuavad regulaarselt uudistesse ja peaaegu alati on põhjuseks just see viga: sisekasutuseks mõeldud teenus kuulas kõigil aadressidel.
Ka SSH porti koputatakse terve päev. See on normaalne ning võtmete (õppetund 2.2) ja fail2bani (õppetund 5.3) korral pole see probleem.
Kursuse kontroll
Selle õppetunni ülesandes kontrollib kursuseprogramm väljastpoolt su serveri viit kindlat andmebaasiporti: 3306 (MySQL/MariaDB), 5432 (PostgreSQL), 6379 (Redis), 9200 (Elasticsearch/OpenSearch) ja 27017 (MongoDB). Programm proovib ainult, kas ühendus tekib, ei saada andmeid ega logi kuhugi sisse. Teisi porte see ei skanni. Kontrollid tulevad ülesandes toodud IP-aadressilt, et saaksid need oma logis ära tunda. Ühte aadressi saab kontrollida vaid paar korda tunnis.
AlmaLinuxis ja Rocky Linuxis
ss töötab samamoodi. Teenuste failid asuvad teistes kohtades (näiteks /etc/my.cnf.d/ MariaDB jaoks, /var/lib/pgsql/data/postgresql.conf PostgreSQL-i jaoks). Lisaks võib SELinux takistada teenust, mis tahab kuulata ebatavalisel pordil; seda näed siis logis journalctl (õppetund 6.2), mitte käsu ss väljundis.
Kokkuvõte
- Iga kuulav port on uks; hoia väljastpoolt avatuna ainult see, mis on tõesti vajalik (tavaliselt 22, 80 ja 443).
sudo ss -tulpnnäitab, milline programm millisel aadressil ja pordil kuulab.0.0.0.0ja[::]tähendavad "kõik aadressid",127.0.0.1ja[::1]tähendavad "ainult server ise". Andmebaasid, vahemälud ja otsinguklastrid kuuluvad loopbackile.- Andmebaasi jaoks on nii suletud kui ka filtreeritud head; avatud on vale.
- Kontrolli alati väljastpoolt, nii IPv4 kui ka IPv6 jaoks, sest
sstulemüüri ei näe.
Test
Ülesanne
Ülesanne Z5.1: Andmebaasipordid on väljast suletud. Käivita oma serveris sudo ss -tulpn ja selgita välja, millistel aadressidel su teenused kuulavad. Seejärel lase kursuseprogrammil väljastpoolt kontrollida, et su serveri pordid 3306, 5432, 6379, 9200 ja 27017 ei ole kättesaadavad, nii IPv4 kui ka (kui su serveril on AAAA-kirje) IPv6 kaudu. Märgi ka, millised teenused kuulavad sinu juures aadressil 0.0.0.0 või [::]. Programm loob ühenduse ainult nende viie pordiga ega saada midagi.
Loe edasi
- Oma VPS-i turvamine: esimesed viis minutit
- Käsu
ss(8)kasutusjuhend: https://manpages.debian.org/trixie/iproute2/ss.8.en.html - Redis, Security: https://redis.io/docs/latest/operate/oss_and_stack/management/security/
