Modul 5 · 5.1
Slovenčina
Porty a počúvajúce služby
Modul 5: Ochrana siete · Čas čítania: 10 minút
Cieľ lekcie: Po tejto lekcii dokážete zistiť, ktoré služby na vašom serveri počúvajú a na akej adrese, vysvetliť rozdiel medzi 0.0.0.0 a 127.0.0.1 a zvonku overiť, čo z vášho servera vidí ktokoľvek na internete.
Kľúčové pojmy: port, TCP a UDP, počúvanie, ss -tulpn, 0.0.0.0 a [::], 127.0.0.1 a [::1], bind-address, otvorený, zatvorený a filtrovaný, útočná plocha, skenery
IP adresa so 65 535 dverami
Váš server má IP adresu, napríklad 192.0.2.10 a 2001:db8::10. Na tejto adrese môže byť súčasne dostupných viacero programov, každý na vlastnom porte: je to číslo od 1 do 65 535. Program, ktorý prijíma spojenia, na porte počúva. Niekoľko známych portov:
| Port | Protokol | Služba |
|---|---|---|
| 22 | TCP | SSH |
| 80 | TCP | http (webový server) |
| 443 | TCP a UDP | https (UDP pre HTTP/3) |
| 25 | TCP | pošta medzi poštovými servermi (SMTP) |
| 3306 | TCP | MySQL a MariaDB |
| 5432 | TCP | PostgreSQL |
| 6379 | TCP | Redis |
TCP je protokol pre spojenia, pri ktorých musia dáta spoľahlivo doraziť (web, SSH, databázy). UDP slúži na rýchle samostatné pakety (DNS, VPN ako WireGuard, HTTP/3). Služba počúva na TCP, na UDP alebo na oboch.
Každý počúvajúci port sú dvere do vášho servera. Za každými dverami je softvér, ktorý môže obsahovať chyby. Súhrn všetkých dverí dostupných zvonku sa nazýva útočná plocha. Čím je menšia, tým lepšie: server s webovou stránkou potrebuje zvonku len porty 22, 80 a 443.
Čo počúva: ss
Príkaz ss (socket statistics) ukazuje, čo na vašom serveri počúva. S voľbami -t (TCP), -u (UDP), -l (len počúvajúce), -p (ktorý program) a -n (čísla namiesto názvov):
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))Najdôležitejší je stĺpec Local Address: adresa, na ktorej program počúva.
| Adresa | Význam |
|---|---|
0.0.0.0 | Všetky IPv4 adresy servera, teda aj verejná adresa: dostupné zvonku (pokiaľ to nezastaví firewall) |
[::] | Všetky IPv6 adresy: to isté pre IPv6 |
127.0.0.1 alebo [::1] | Len samotný server (loopback): zvonku nikdy nedostupné |
127.0.0.53, 127.0.0.54 | Tiež loopback; tu počúva lokálny pomocník DNS zo systemd-resolved |
192.0.2.10 | Len táto jedna adresa |
V príklade vyššie je MariaDB v poriadku: počúva na 127.0.0.1, takže sa k nej dostanú len programy na samotnom serveri (vaša webová stránka). Redis však počúva na 0.0.0.0:6379. Ak firewall nie je správne nastavený, dostane sa k nemu celý internet. Presne o takejto chybe je táto lekcia.
Počúvanie na správnej adrese
Databáza, cache alebo administračný panel by takmer nikdy nemali byť dostupné zvonku. Prvou a najlepšou obranou je, aby služba počúvala len na loopbacku. Firewall (lekcia 5.2) je druhá vrstva; ten môže byť omylom vypnutý alebo sa nemusí uplatňovať (napríklad pri Dockeri, lekcia 9.3).
Kde sa to nastavuje, závisí od programu:
| Program | Nastavenie | Súbor (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 a protected-mode yes | /etc/redis/redis.conf |
Balíky v Debiane a Ubuntu nastavujú tieto služby štandardne na localhost. Problém zvyčajne vznikne, keď niekto postupuje podľa návodu, ktorý hovorí "nastavte bind-address na 0.0.0.0, aby ste sa mohli pripojiť zvonku". Ak sa chcete k databáze pripojiť zo svojho notebooku, použite SSH tunel (lekcia 2.3): port zostane zatvorený a pripojiť sa môže len ten, kto vojde cez SSH.
Po zmene službu reštartujte a znova skontrolujte pomocou ss -tulpn.
Otvorený, zatvorený a filtrovaný
Pri pohľade zvonku môže byť port v jednom z troch stavov:
- Otvorený (open): niečo počúva a spojenie sa podarí.
- Zatvorený (closed): nič nepočúva, alebo firewall aktívne odmieta. Server okamžite pošle späť "nie" (pri TCP paket RST). Spojenie hneď zlyhá s hlásením "Connection refused".
- Filtrovaný (filtered): firewall paket potichu zahodí. Spojenie visí, kým nevyprší časový limit (time-out).
Pre vašu databázu sú zatvorený aj filtrovaný stav v poriadku: nikto sa k nej nedostane. Rozdiel vám len prezradí prečo: filtrovaný takmer vždy znamená, že to zastavuje váš firewall.
Pohľad zvonku
ss ukazuje, čo na serveri počúva, ale nie to, čo je dostupné zvonku. Medzi tým je ešte firewall a u poskytovateľa niekedy aj sieťový firewall. Jediná skutočná kontrola preto je: pozrite sa zvonku, z iného počítača.
Z vášho vlastného počítača (nie zo samotného servera, pretože tam by ste išli cez loopback) to pre jeden port urobíte pomocou 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!Vo Windows urobí to isté PowerShell s Test-NetConnection 192.0.2.10 -Port 6379. Skener portov ako nmap dokáže skontrolovať viac portov naraz; takýto skener používajte len na vlastnom serveri.
Nezabudnite na IPv6. Častou chybou je firewall, ktorý má pravidlá len pre IPv4, zatiaľ čo služba počúva aj na [::]. Otestujte preto aj IPv6 adresu: nc -6 -vz -w 3 2001:db8::10 6379.
Prečo je to také dôležité
Váš server je skenovaný od prvej minúty. Vyhľadávače zariadení a služieb na internete aj boty kriminálnikov neustále skúšajú všetky IPv4 adresy na známych portoch. Otvorený Redis bez hesla, cluster Elasticsearch alebo MongoDB bez riadenia prístupu sa nájde za krátky čas. Úniky dát cez otvorené databázy a otvorené vyhľadávacie clustre sa pravidelne objavujú v správach a takmer vždy ide presne o túto chybu: služba určená na interné použitie počúvala na všetkých adresách.
Aj na port SSH niekto klope celý deň. To je normálne a s kľúčmi (lekcia 2.2) a fail2ban (lekcia 5.3) to nie je problém.
Kontrola v kurze
V úlohe k tejto lekcii program kurzu zvonku skontroluje päť pevne daných databázových portov vášho servera: 3306 (MySQL/MariaDB), 5432 (PostgreSQL), 6379 (Redis), 9200 (Elasticsearch/OpenSearch) a 27017 (MongoDB). Program len skúša, či sa nadviaže spojenie, neposiela žiadne dáta a nikam sa neprihlasuje. Iné porty neskenuje. Kontroly prichádzajú z IP adresy uvedenej v úlohe, aby ste ich vo svojom logu spoznali. Jednu adresu možno skontrolovať len niekoľkokrát za hodinu.
V AlmaLinux a Rocky Linux
ss funguje rovnako. Súbory služieb sú na iných miestach (napríklad /etc/my.cnf.d/ pre MariaDB, /var/lib/pgsql/data/postgresql.conf pre PostgreSQL). Okrem toho môže SELinux zablokovať službu, ktorá chce počúvať na nezvyčajnom porte; to potom uvidíte v journalctl (lekcia 6.2), a nie v ss.
Zhrnutie
- Každý počúvajúci port sú dvere; zvonku nechajte otvorené len to, čo je naozaj potrebné (zvyčajne 22, 80 a 443).
sudo ss -tulpnukazuje, ktorý program počúva na ktorej adrese a ktorom porte.0.0.0.0a[::]znamenajú "všetky adresy",127.0.0.1a[::1]znamenajú "len samotný server". Databázy, cache a vyhľadávacie clustre patria na loopback.- Zatvorený aj filtrovaný stav sú pre databázu v poriadku; otvorený je chyba.
- Vždy kontrolujte zvonku, pre IPv4 aj IPv6, pretože
ssfirewall nevidí.
Kvíz
Úloha
Úloha Z5.1: Databázové porty zatvorené zvonku. Spustite na svojom serveri sudo ss -tulpn a zistite, na ktorých adresách vaše služby počúvajú. Potom nechajte program kurzu zvonku overiť, že porty 3306, 5432, 6379, 9200 a 27017 vášho servera nie sú dostupné, pre IPv4 a (ak má váš server záznam AAAA) aj pre IPv6. Uveďte tiež, ktoré služby u vás počúvajú na 0.0.0.0 alebo [::]. Program sa len pripojí k týmto piatim portom a nič neposiela.
