Ukratko: Vatrozid za web-poslužitelje dopušta dolazno samo TCP 80 i 443, kod HTTP/3 dodatno UDP 443, i SSH samo iz poznatih mreža. Sve ostalo se odbacuje: baze podataka, predmemorije, PHP-FPM i administratorska sučelja ne pripadaju na internet. Najprije pomoću ss -tulpn provjerite što sluša, zatim izgradite skup pravila sa zadanim „odbaciti“ i testirajte rezultat izvana. Ograničavanje odlaznih veza dodatno ograničava posljedice provale.
Zaboravljena vrata pokraj ulaznih
Kod PHP2Shella pogled je bio usmjeren na sam web-poslužitelj, na portove 80 i 443. Oni moraju biti otvoreni, inače nema web-stranice. Kod inventura nakon takvih ranjivosti često se ipak primijeti nešto drugo: pokraj ulaznih vrata stoje otvorena i druga vrata. Baza podataka sluša na svim mrežnim sučeljima, PHP-FPM pool na portu 9000, usluga predmemorije bez lozinke, administratorsko sučelje iz faze postavljanja.
Svaka od tih vrata zasebna je napadna površina s vlastitim ranjivostima. Vatrozid koji dopušta samo nužno zatvara ih s nekoliko pravila. To je jedna od najdjelotvornijih mjera pri osiguravanju vlastitog poslužitelja, kako opisuje i stranica Samostalno osigurati root poslužitelj i vServer.
Što pripada otvoreno, a što ne?
Načelo je popis dopuštenog: sve je zatvoreno, a dostupne su samo svjesno odobrene usluge. Sljedeći pregled pomaže pri svrstavanju.
| Usluga | Tipičan port | Dostupno izvana? |
|---|---|---|
| HTTP i HTTPS | TCP 80, TCP 443 | da |
| HTTP/3 (QUIC) | UDP 443 | samo ako se koristi |
| SSH | TCP 22 | samo iz poznatih mreža ili putem VPN-a |
| Hosting panel | ovisno o proizvodu | samo iz poznatih mreža |
| MySQL/MariaDB, PostgreSQL | TCP 3306, TCP 5432 | ne |
| Redis, Memcached | TCP 6379, TCP 11211 | ne |
| PHP-FPM | TCP 9000 ili Unix socket | ne, bolje samo socket |
| Poslužitelj e-pošte | TCP 25, 465, 587, 993 | samo ako poslužitelj prima ili pruža e-poštu |
Usluga koja ne mora prema van trebala bi uz to slušati samo na 127.0.0.1 ili Unix socketu. Tada ostaje nedostupna čak i pri kvaru vatrozida. Za administratorske pristupe prikladne su IP dozvole ili VPN; pojedinosti su u članku Zaštititi administratorska područja IP-om, VPN-om ili dodatnom zaštitom.
Korak 1: utvrditi što sluša
Prije nego napišete pravila, steknite pregled. Sljedeće naredbe samo čitaju:
# Svi portovi TCP i UDP koji slušaju, s procesom
sudo ss -tulpn
# Trenutačni skup pravila nftablesa
sudo nft list ruleset
# Status ufw-a, ako se koristi
sudo ufw status verbose
U ispisu naredbe ss pazite na adresu ispred porta. 0.0.0.0 ili [::] znači: usluga sluša na svim sučeljima. 127.0.0.1 znači: samo lokalno. Za svaku uslugu zabilježite mora li biti dostupna izvana. Taj je popis ujedno dio Vašeg inventara poslužitelja.
Vatrozid za web-poslužitelje s nftables
nftables je aktualni filtar paketa pod Linuxom. Sljedeći skup pravila oslanja se na primjer u službenom nftables wikiju i dodaje odobrenje za SSH samo iz administrativne mreže. Adrese su primjeri iz dokumentacije i moraju se zamijeniti.
#!/usr/sbin/nft -f
flush ruleset
table inet filter {
set verwaltung_v4 {
type ipv4_addr
flags interval
elements = { 203.0.113.0/28 }
}
chain input {
type filter hook input priority 0; policy drop;
ct state vmap { established : accept, related : accept, invalid : drop }
iifname lo accept
# IPv6 treba otkrivanje susjeda
icmpv6 type { nd-neighbor-solicit, nd-router-advert, nd-neighbor-advert } accept
icmp type echo-request limit rate 5/second accept
icmpv6 type echo-request limit rate 5/second accept
# Web-stranica
tcp dport { 80, 443 } accept
# samo kod HTTP/3:
# udp dport 443 accept
# SSH samo iz administrativne mreže
ip saddr @verwaltung_v4 tcp dport 22 accept
}
chain forward {
type filter hook forward priority 0; policy drop;
}
}
Skup pravila prije učitavanja provjerite naredbom nft -c -f /etc/nftables.conf. Prvi redak flush ruleset briše sva postojeća pravila, i ona koja su upisali Docker ili Fail2ban. Na poslužiteljima s Dockerom ili drugim uslugama koje postavljaju vlastita pravila skup pravila stoga prilagodite umjesto da ga paušalno zamijenite. Kako Fail2ban surađuje s vatrozidom, piše u članku Postaviti Fail2ban za web-poslužitelje.
Tko želi jednostavnije, pod Ubuntuom koristi ufw. Važan je redoslijed: najprije odobrenje za SSH, zatim uključivanje.
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow proto tcp from 203.0.113.0/28 to any port 22
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw status verbose
Pravila vatrozida na udaljenim poslužiteljima mijenjajte samo uz drugi pristupni put, primjerice konzolu Vašeg pružatelja. Pogrešno SSH pravilo inače zaključava Vas same.
Odlazne veze: podcijenjena polovica
Većina vatrozida odlazno dopušta sve. Za web-poslužitelj to je velikodušno. Nakon provale napadači koriste odlazne veze za učitavanje alata, izvlačenje podataka ili primanje naredbi. Procesi web-poslužitelja ili PHP-a koji uspostavljaju neočekivane veze stoga se smatraju znakom upozorenja.
Ograničavanje odlaznih veza zahtjevnije je jer svaka legitimna veza mora biti poznata: izvori paketa za ažuriranja, usluge plaćanja, sučelja, slanje e-pošte, vremenski poslužitelji. Pragmatičan je put najprije zapisivati odlazne veze, zatim sastaviti popis dopuštenog i tek nakon toga blokirati. Kako provjeriti postojeće veze, opisuje članak Provjeriti odlazne veze poslužitelja; koji drugi tragovi upućuju na provalu, piše na stranici Jesam li već kompromitiran?.
Za kraj testirajte izvana, s drugog računala i samo prema vlastitim sustavima, koji su portovi doista dostupni. Tek taj test pokazuje daju li Docker, vatrozid pružatelja i pravila poslužitelja zajedno željenu sliku.
Zaključak: malo pravila, velik učinak
Vatrozid web-poslužitelja ne mora biti složen. Web portovi otvoreni, administracija samo iz poznatih mreža, sve ostalo odbačeno: s tim osnovnim pravilima baze podataka, predmemorije i zaboravljene usluge nestaju s interneta. To je jedna od mjera s najboljim omjerom truda i koristi.
Protiv ranjivosti u web-poslužitelju ili u samom PHP-u vatrozid ne pomaže jer upravo ti portovi moraju ostati otvoreni. Njegova je snaga u tome da ostatak napadne površine drži malim i da ograničenjem odlaznih veza ublaži posljedice provale.
Odlučujuća je njega. Svaka nova usluga, svaki kontejner i svaka izmjena kod pružatelja može pomaknuti sliku. Provjeru izvana stoga ponavljajte nakon svake veće izmjene i u fiksnim razmacima, primjerice jednom kvartalno.
Kako PHP SOS konkretno pomaže?
- Zabilježiti stanje: bilježimo sve usluge koje slušaju i izvana provjeravamo što je doista dostupno.
- Izgraditi skup pravila: izrađujemo popis dopuštenog za dolazne i, gdje je smisleno, odlazne veze, usklađen s Dockerom, Fail2banom i vatrozidom pružatelja.
- Sigurno prijeći: izmjene provodimo uz drugi pristupni put i plan povratka.
- Dokumentirati: portove, odobrenja i razloge bilježimo u sklopu ojačavanja poslužitelja.
Česta pitanja
Koji portovi trebaju web-poslužitelju?
Za posjetitelje u pravilu samo TCP 80 i 443, kod HTTP/3 dodatno UDP 443. SSH i administratorska sučelja trebala bi biti dostupna samo iz poznatih mreža ili putem VPN-a. Portovi baze podataka, predmemorije i PHP-FPM-a ne pripadaju na internet.
Štiti li vatrozid od PHP2Shella?
Ne. PHP2Shell se iskorištava preko web-poslužitelja, dakle preko upravo onih portova koji moraju biti otvoreni. Vatrozid ipak smanjuje ostatak napadne površine, a ograničenje odlaznih veza može ublažiti posljedice provale.
Zašto ufw prikazuje portove kao zatvorene, a oni su ipak dostupni?
Poznat slučaj su Docker kontejneri: Docker objavljene portove upisuje izravno u pravila filtriranja paketa, mimo ufw-a. Otvorene portove stoga uvijek dodatno provjerite izvana.
Je li dovoljan vatrozid mog hosting pružatelja?
Vatrozid pružatelja ispred poslužitelja dobar je drugi sloj. Ipak ne zamjenjuje vatrozid na poslužitelju jer ne djeluje pri pogrešci u konfiguraciji pružatelja ili kod internih veza. Najbolje je koristiti oba s istim osnovnim pravilima.