Modul 5 · 5.1
Priključci i usluge koje slušaju
Modul 5: Zaštita mreže · Vrijeme čitanja: 10 minuta
Cilj učenja: Nakon ove lekcije moći ćete vidjeti koje usluge slušaju na Vašem poslužitelju i na kojoj adresi, objasniti razliku između 0.0.0.0 i 127.0.0.1 te izvana provjeriti što svatko na internetu vidi od Vašeg poslužitelja.
Ključni pojmovi: priključak (port), TCP i UDP, slušanje, ss -tulpn, 0.0.0.0 i [::], 127.0.0.1 i [::1], bind-address, otvoren, zatvoren i filtriran, površina napada, skeneri
IP adresa sa 65.535 vrata
Vaš poslužitelj ima IP adresu, na primjer 192.0.2.10 i 2001:db8::10. Na toj adresi istodobno može biti dostupno više programa, svaki na svojem priključku (portu): broju od 1 do 65.535. Program koji prihvaća veze sluša na priključku. Nekoliko poznatih:
| Priključak | Protokol | Usluga |
|---|---|---|
| 22 | TCP | SSH |
| 80 | TCP | http (web-poslužitelj) |
| 443 | TCP i UDP | https (UDP za HTTP/3) |
| 25 | TCP | pošta između poslužitelja e-pošte (SMTP) |
| 3306 | TCP | MySQL i MariaDB |
| 5432 | TCP | PostgreSQL |
| 6379 | TCP | Redis |
TCP je protokol za veze koje moraju pouzdano stići (web, SSH, baze podataka). UDP služi za brze pojedinačne pakete (DNS, VPN-ovi poput WireGuarda, HTTP/3). Usluga sluša na TCP-u, UDP-u ili na oba.
Svaki priključak koji sluša su vrata prema Vašem poslužitelju. Iza svakih vrata nalazi se softver koji može sadržavati pogreške. Skup svih vrata dostupnih izvana naziva se Vaša površina napada. Što manja, to bolje: poslužitelju s web-stranicom izvana trebaju samo 22, 80 i 443.
Pogledajte što sluša: ss
Naredba ss (socket statistics) prikazuje što sluša na Vašem poslužitelju. S opcijama -t (TCP), -u (UDP), -l (samo oni koji slušaju), -p (koji program) i -n (brojevi, ne nazivi):
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))Najvažniji stupac je Local Address: adresa na kojoj program sluša.
| Adresa | Značenje |
|---|---|
0.0.0.0 | Sve IPv4 adrese poslužitelja, dakle i javna adresa: dostupno izvana (osim ako to ne zaustavi vatrozid) |
[::] | Sve IPv6 adrese: isto, za IPv6 |
127.0.0.1 ili [::1] | Samo sam poslužitelj (loopback): izvana nikad nije dostupno |
127.0.0.53, 127.0.0.54 | Također loopback; ovdje sluša lokalni DNS pomoćnik servisa systemd-resolved |
192.0.2.10 | Samo ta jedna adresa |
U gornjem primjeru MariaDB je u redu: sluša na 127.0.0.1, pa joj mogu pristupiti samo programi na samom poslužitelju (Vaša web-stranica). No Redis sluša na 0.0.0.0:6379. Ako vatrozid nije dobro postavljen, može mu pristupiti cijeli internet. Upravo o takvoj pogrešci govori ova lekcija.
Slušanje na pravoj adresi
Baza podataka, predmemorija (cache) ili upravljačka ploča gotovo nikad ne smiju biti dostupni izvana. Prva i najbolja obrana je da usluga sluša samo na loopbacku. Vatrozid (lekcija 5.2) je drugi sloj; on može slučajno biti isključen ili ne vrijediti (na primjer kod Dockera, lekcija 9.3).
Gdje se to postavlja, ovisi o programu:
| Program | Postavka | Datoteka (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 i protected-mode yes | /etc/redis/redis.conf |
Paketi za Debian i Ubuntu te usluge prema zadanim postavkama već postavljaju na localhost. Problem obično nastaje kad netko slijedi upute koje kažu "postavite bind-address na 0.0.0.0 da biste se spojili izvana". Želite li sami pristupiti bazi podataka sa svojeg prijenosnog računala, upotrijebite SSH tunel (lekcija 2.3): priključak ostaje zatvoren, a pristupiti može samo onaj tko uđe putem SSH-a.
Nakon izmjene ponovno pokrenite uslugu i ponovno provjerite naredbom ss -tulpn.
Otvoren, zatvoren i filtriran
Gledano izvana, priključak može biti u jednom od tri stanja:
- Otvoren (open): nešto sluša i veza uspijeva.
- Zatvoren (closed): ništa ne sluša ili vatrozid aktivno odbija. Poslužitelj odmah vraća "ne" (kod TCP-a paket RST). Veza odmah ne uspijeva s porukom "Connection refused".
- Filtriran (filtered): vatrozid tiho odbacuje paket. Veza visi dok ne istekne vrijeme čekanja (time-out).
Za Vašu bazu podataka i zatvoren i filtriran su dobri: nitko joj ne može pristupiti. Razlika Vam govori samo zašto: filtriran gotovo uvijek znači da ga zaustavlja Vaš vatrozid.
Gledajte izvana
ss pokazuje što sluša na poslužitelju, ali ne i što je dostupno izvana. Između se nalazi još vatrozid, a kod Vašeg pružatelja usluge ponekad i mrežni vatrozid. Jedina prava provjera stoga je: gledajte izvana, s drugog računala.
S vlastitog računala (ne sa samog poslužitelja, jer tada idete preko loopbacka) to možete učiniti alatom nc (netcat) za jedan priključak:
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!Na Windowsu isto radi PowerShell naredbom Test-NetConnection 192.0.2.10 -Port 6379. Skener priključaka poput nmap može pregledati više priključaka odjednom; takav skener koristite samo na vlastitom poslužitelju.
Ne zaboravite IPv6. Česta pogreška je vatrozid koji ima pravila samo za IPv4, dok usluga sluša i na [::]. Zato testirajte i IPv6 adresu: nc -6 -vz -w 3 2001:db8::10 6379.
Zašto je to toliko važno
Vaš se poslužitelj skenira od prve minute. Tražilice za uređaje i usluge na internetu, kao i botovi kriminalaca, neprestano isprobavaju sve IPv4 adrese na poznatim priključcima. Otvoreni Redis bez lozinke, Elasticsearch klaster ili MongoDB bez kontrole pristupa pronađu se u kratkom roku. Curenja podataka zbog otvorenih baza podataka i otvorenih klastera za pretraživanje redovito se pojavljuju u vijestima, a gotovo uvijek riječ je upravo o ovoj pogrešci: usluga namijenjena internoj upotrebi slušala je na svim adresama.
I na priključak za SSH kuca se cijeli dan. To je normalno i uz ključeve (lekcija 2.2) i fail2ban (lekcija 5.3) nije problem.
Provjera u tečaju
U zadatku uz ovu lekciju program tečaja izvana provjerava pet fiksnih priključaka baza podataka Vašeg poslužitelja: 3306 (MySQL/MariaDB), 5432 (PostgreSQL), 6379 (Redis), 9200 (Elasticsearch/OpenSearch) i 27017 (MongoDB). Program samo pokušava uspostaviti vezu, ne šalje nikakve podatke i nigdje se ne prijavljuje. Ne skenira druge priključke. Provjere dolaze s IP adrese navedene u zadatku, tako da ih možete prepoznati u vlastitom zapisniku. Jedna se adresa može provjeriti samo nekoliko puta na sat.
Na AlmaLinuxu i Rocky Linuxu
ss radi jednako. Datoteke usluga nalaze se na drugim mjestima (na primjer /etc/my.cnf.d/ za MariaDB, /var/lib/pgsql/data/postgresql.conf za PostgreSQL). Osim toga, SELinux može zaustaviti uslugu koja želi slušati na neuobičajenom priključku; to tada vidite u journalctl (lekcija 6.2), a ne u ss.
Sažetak
- Svaki priključak koji sluša su vrata; izvana ostavite otvorenim samo ono što je zaista potrebno (obično 22, 80 i 443).
sudo ss -tulpnpokazuje koji program sluša na kojoj adresi i kojem priključku.0.0.0.0i[::]znače "sve adrese",127.0.0.1i[::1]znače "samo sam poslužitelj". Baze podataka, predmemorije i klasteri za pretraživanje trebaju biti na loopbacku.- Zatvoren i filtriran su oba dobri za bazu podataka; otvoren je pogrešno.
- Uvijek provjeravajte izvana, za IPv4 i za IPv6, jer
ssne vidi vatrozid.
Kviz
Zadatak
Zadatak Z5.1: Priključci baza podataka zatvoreni izvana. Pokrenite sudo ss -tulpn na svojem poslužitelju i utvrdite na kojim adresama slušaju Vaše usluge. Zatim neka program tečaja izvana provjeri da priključci 3306, 5432, 6379, 9200 i 27017 Vašeg poslužitelja nisu dostupni, za IPv4 i (ako Vaš poslužitelj ima AAAA zapis) IPv6. Upišite i koje usluge kod Vas slušaju na 0.0.0.0 ili [::]. Program uspostavlja samo vezu prema tih pet priključaka i ništa ne šalje.
