Lista otvorenih portova je lista načina da se dosegne vaš server. Sve ostalo — zaštitni zidovi, WAF-ovi, otkrivanje upada — gradi se na njoj. Zato „šta ovde osluškuje" dolazi prvo u svakoj proveri, i zato je to ujedno provera koja najčešće daje neprijatan odgovor: polovinu onoga što se pojavi niste otvorili vi nego instalacioni program nekog paketa.

Čitanje izlaza

sudo ss -tulpn

Zastavice: t za TCP, u za UDP, l samo za ono što osluškuje, p za proces, n da brojevi ostanu brojevi. Bez sudo kolona procesa je prazna i vežba gubi smisao.

Bitna je kolona Local Address:Port, a razlika tamo je suštinska:

  • 127.0.0.1:3306 — servis je dostupan samo sa same mašine. To je dobro;
  • 0.0.0.0:3306 — sa svake IPv4 adrese, dakle sa interneta. To treba proveriti;
  • [::]:3306 — isto to za IPv6. Zaseban red, i redovno se previđa;
  • 203.0.113.25:443 — na određenoj adresi, obično namerno.

Zatim za svaki red sa 0.0.0.0 ili [::] postavite jedno pitanje: treba li stranac da može ovde da dosegne. Za 80 i 443 odgovor je da. Za gotovo sve ostalo je ne.

Uobičajeni nalazi

Redis, port 6379. Najopasniji red tamo. Podrazumevano Redis ne zahteva lozinku, a njegove komande dozvoljavaju upisivanje fajla na disk — to jest tuđi ključ u authorized_keys. Između pojavljivanja Redis-a na javnoj adresi i njegove upotrebe prolaze sati, ponekad i manje. Proverite ima li bind 127.0.0.1 i protected-mode yes u konfiguraciji.

Memcached, 11211/UDP. Čak i ako unutra nema ničega vrednog, vaš server postaje pojačivač za tuđe napade — a žalba će stići od vašeg provajdera.

MySQL i PostgreSQL, 3306 i 5432. Lozinka postoji, ali pogađanje protiv nje ide neprekidno, a verzije baza ažuriraju se ređe nego što bi se želelo. Gotovo nikada ne moraju da gledaju napolje: aplikacija živi na istoj mašini, a za vaš sopstveni rad dovoljan je SSH tunel.

Elasticsearch 9200, MongoDB 27017. Istorijski podrazumevano bez autentifikacije. Njihove javne instance stalan su izvor vesti o curenju podataka.

Docker API, 2375. Otvoren port za upravljanje Docker-om jeste root na domaćinu bez ikakve lozinke. Obično se pojavljuje posle eksperimenata sa udaljenim pristupom Docker-u.

Kontrolni paneli i phpMyAdmin na sopstvenim portovima: 8080, 8083, 10000. Ne kažemo da se nikada ne smeju otvarati, ali upravo oni skupljaju najveći deo pokušaja.

Popravite to na servisu, ne na zaštitnom zidu

Poriv da svaki nalaz zatvorite UFW pravilom je razumljiv, ali to je druga linija, a ne prva. Pravilo može biti obrisano greškom, zaštitni zid može biti privremeno isključen tokom otklanjanja grešaka, a Docker objavljuje portove potpuno zaobilazeći UFW. Podešavanje vezivanja u sopstvenoj konfiguraciji servisa preživljava sve to:

  • MySQL/MariaDB — bind-address = 127.0.0.1;
  • PostgreSQL — listen_addresses = 'localhost';
  • Redis — bind 127.0.0.1 ::1;
  • Docker Compose — objavite kao "127.0.0.1:5432:5432".

Zaštitni zid ide odozgo kao osiguranje, a ne umesto ovoga.

Pronalaženje procesa kada nije jasno

ss daje naziv i pid. Zatim:

sudo systemctl status <pid>
sudo lsof -i :8080

Prva komanda imenuje systemd jedinicu kojoj proces pripada — obično dovoljno da shvatite šta je to i da li je potrebno. Nepoznat proces koji osluškuje na visokom portu i pokrenut je izvan sistemskih direktorijuma — recimo iz /tmp ili /dev/shm — više nije pitanje konfiguracije nego osnov za zasebnu istragu.

Provera spolja je obavezna

ss odgovara na „šta osluškuje", a ne na „šta je dostupno". Između njih stoje zaštitni zid, NAT i sopstvena pravila provajdera. Jedini pošten odgovor dolazi od skeniranja sa druge mašine:

nmap -Pn -p- 203.0.113.25
nmap -Pn -p- -6 2001:db8::1

Nemojte preskočiti drugu komandu: gotovo svaki VPS ima IPv6 adresu, njena pravila pišu se posebno, a servis osluškuje na obe verzije protokola istovremeno.

Ovo nije jednokratna provera

Lista otvorenih portova menja se sama od sebe. Instalirali ste paket i on je doneo servis i otvorio port. Ažurirali ste panel i on je vratio podrazumevanu vrednost. Pokrenuli ste kontejner i on je objavio port zaobilazeći zaštitni zid. Jednokratna provera odgovara za danas i ništa više.

Vrednost nije u samoj listi nego u njenim promenama: novi port kojeg juče nije bilo kratak je i izuzetno informativan signal. Upravo tako je vredi pratiti — kao snimak sa istorijom, a ne kao izlaz ss-a prizvan iz pamćenja. Demo stranica ispod pokazuje upravo to.