Īsi sakot: Ugunsmūris tīmekļa serveriem ienākošajā virzienā atļauj tikai TCP 80 un 443, HTTP/3 gadījumā papildus UDP 443, un SSH tikai no zināmiem tīkliem. Viss pārējais tiek atmests: datubāzes, kešatmiņas, PHP-FPM un pārvaldības saskarnes nepieder internetā. Vispirms ar ss -tulpn pārbaudiet, kas klausās, tad izveidojiet noteikumu kopu ar noklusējumu „atmest" un testējiet rezultātu no ārpuses. Izejošo savienojumu ierobežošana papildus ierobežo ielaušanās sekas.
Aizmirstās durvis blakus ārdurvīm
PHP2Shell gadījumā skatiens bija vērsts uz pašu tīmekļa serveri, uz portiem 80 un 443. Tiem jābūt atvērtiem, citādi vietnes nav. Taču inventarizācijās pēc šādām ievainojamībām bieži izceļas kas cits: blakus ārdurvīm ir atvērtas arī citas durvis. Datubāze klausās uz visām tīkla saskarnēm, PHP-FPM pūls uz porta 9000, kešatmiņas pakalpojums bez paroles, pārvaldības saskarne no iestatīšanas posma.
Katras no šīm durvīm ir sava uzbrukuma virsma ar savām ievainojamībām. Ugunsmūris, kas atļauj tikai nepieciešamo, tās aizver ar dažiem noteikumiem. Tas ir viens no efektīvākajiem pasākumiem sava servera nostiprināšanā, kā to apraksta arī lapa Root servera un vServer paša nostiprināšana.
Kas jāatver un kas ne?
Princips ir atļauto saraksts: viss ir aizvērts, un sasniedzami ir tikai apzināti atļauti pakalpojumi. Turpmākais pārskats palīdz ierindošanā.
| Pakalpojums | Tipisks ports | Vai sasniedzams no ārpuses? |
|---|---|---|
| HTTP un HTTPS | TCP 80, TCP 443 | jā |
| HTTP/3 (QUIC) | UDP 443 | tikai ja tiek lietots |
| SSH | TCP 22 | tikai no zināmiem tīkliem vai caur VPN |
| Hostinga panelis | atkarībā no produkta | tikai no zināmiem tīkliem |
| MySQL/MariaDB, PostgreSQL | TCP 3306, TCP 5432 | nē |
| Redis, Memcached | TCP 6379, TCP 11211 | nē |
| PHP-FPM | TCP 9000 vai Unix socket | nē, labāk tikai socket |
| Pasta serveris | TCP 25, 465, 587, 993 | tikai ja serveris saņem vai sniedz pastu |
Pakalpojumam, kam uz āru nav jābūt sasniedzamam, papildus jāklausās tikai uz 127.0.0.1 vai Unix socket. Tad tas paliek nesasniedzams arī ugunsmūra kļūmes gadījumā. Pārvaldības piekļuvēm der IP atļaujas vai VPN; detaļas rakstā Administratoru zonu aizsardzība ar IP, VPN vai papildu aizsardzību.
1. solis: noskaidrot, kas klausās
Pirms rakstāt noteikumus, gūstiet pārskatu. Turpmākās komandas tikai lasa:
# Visi klausošies TCP un UDP porti ar procesu
sudo ss -tulpn
# Pašreizējā nftables noteikumu kopa
sudo nft list ruleset
# ufw statuss, ja tiek lietots
sudo ufw status verbose
ss izvadē pievērsiet uzmanību adresei pirms porta. 0.0.0.0 vai [::] nozīmē: pakalpojums klausās uz visām saskarnēm. 127.0.0.1 nozīmē: tikai lokāli. Katram pakalpojumam pierakstiet, vai tam jābūt sasniedzamam no ārpuses. Šis saraksts vienlaikus ir daļa no jūsu serveru inventāra.
Ugunsmūris tīmekļa serverim ar nftables
nftables ir aktuālais paketes filtrs zem Linux. Turpmākā noteikumu kopa orientējas uz piemēru oficiālajā nftables wiki un papildina to ar SSH atļauju tikai no pārvaldības tīkla. Adreses ir dokumentācijas piemēri, un tās jāaizstāj.
#!/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 vajadzīga kaimiņu atklāšana
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
# Vietne
tcp dport { 80, 443 } accept
# tikai HTTP/3 gadījumā:
# udp dport 443 accept
# SSH tikai no pārvaldības tīkla
ip saddr @verwaltung_v4 tcp dport 22 accept
}
chain forward {
type filter hook forward priority 0; policy drop;
}
}
Noteikumu kopu pirms ielādes pārbaudiet ar nft -c -f /etc/nftables.conf. Pirmā rinda flush ruleset izdzēš visus esošos noteikumus, arī tos, ko ierakstījuši Docker vai Fail2ban. Serveros ar Docker vai citiem pakalpojumiem, kas iestata savus noteikumus, noteikumu kopu tāpēc pielāgojiet, nevis vispārīgi aizstājiet. Kā Fail2ban sadarbojas ar ugunsmūri, rakstīts sadaļā Fail2ban ieviešana tīmekļa serveriem.
Kas vēlas vienkāršāk, Ubuntu izmanto ufw. Svarīga ir secība: vispirms SSH atļauja, tad ieslēgšana.
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
Ugunsmūra noteikumus attālos serveros mainiet tikai ar otru piekļuves ceļu, piemēram, sniedzēja konsoli. Nepareizs SSH noteikums citādi izslēdz jūs pašus.
Izejošie savienojumi: nenovērtētā puse
Lielākā daļa ugunsmūru izejošajā virzienā atļauj visu. Tīmekļa serverim tas ir devīgi. Pēc ielaušanās uzbrucēji izmanto izejošos savienojumus, lai ielādētu rīkus, aizvilktu datus vai saņemtu komandas. Tīmekļa servera vai PHP procesi, kas veido negaidītus savienojumus, tāpēc ir brīdinājuma signāls.
Izejošo savienojumu ierobežošana ir darbietilpīgāka, jo jābūt zināmam katram leģitīmajam savienojumam: pakotņu avoti atjauninājumiem, maksājumu pakalpojumi, saskarnes, pasta sūtīšana, laika serveri. Pragmatisks ceļš ir sākumā izejošos savienojumus protokolēt, tad izveidot atļauto sarakstu un tikai pēc tam bloķēt. Kā pārbaudīt esošos savienojumus, apraksta Servera izejošo savienojumu pārbaude; kuras pēdas citādi norāda uz ielaušanos, atrodams sadaļā Vai esmu jau kompromitēts?.
Noslēgumā no ārpuses, no cita datora un tikai pret savām sistēmām, testējiet, kuri porti faktiski ir sasniedzami. Tikai šis tests parāda, vai Docker, sniedzēja ugunsmūris un servera noteikumi kopā dod vēlamo ainu.
Secinājums: dažas regulas, liela ietekme
Tīmekļa servera ugunsmūrim nav jābūt sarežģītam. Tīmekļa porti atvērti, pārvaldība tikai no zināmiem tīkliem, viss pārējais atmests: ar šiem pamatnoteikumiem datubāzes, kešatmiņas un aizmirsti pakalpojumi pazūd no interneta. Tas ir viens no pasākumiem ar labāko piepūles un ieguvuma attiecību.
Pret ievainojamībām tīmekļa serverī vai pašā PHP ugunsmūris nepalīdz, jo tieši šiem portiem jāpaliek atvērtiem. Tā stiprā puse ir pārējās uzbrukuma virsmas saglabāšana mazu un, ierobežojot izejošos savienojumus, ielaušanās seku ierobežošana.
Izšķiroša ir uzturēšana. Katrs jauns pakalpojums, katrs konteiners un katra izmaiņa pie sniedzēja var pārbīdīt ainu. Pārbaudi no ārpuses tāpēc atkārtojiet pēc katras lielākas izmaiņas un noteiktos intervālos, piemēram, reizi ceturksnī.
Kā PHP SOS palīdz konkrēti?
- Uzskaitīt esošo stāvokli: mēs uzskaitām visus klausošos pakalpojumus un no ārpuses pārbaudām, kas faktiski ir sasniedzams.
- Izveidot noteikumu kopu: mēs veidojam atļauto sarakstu ienākošajiem un, kur jēgpilni, izejošajiem savienojumiem, saskaņotu ar Docker, Fail2ban un sniedzēja ugunsmūri.
- Droši pārslēgt: izmaiņas mēs īstenojam ar otru piekļuves ceļu un atkāpšanās plānu.
- Dokumentēt: portus, atļaujas un iemeslus mēs fiksējam serveru nostiprināšanas ietvaros.
Biežāk uzdotie jautājumi
Kādi porti vajadzīgi tīmekļa serverim?
Apmeklētājiem parasti tikai TCP 80 un 443, HTTP/3 gadījumā papildus UDP 443. SSH un pārvaldības saskarnēm jābūt sasniedzamām tikai no zināmiem tīkliem vai caur VPN. Datubāzu, kešatmiņas un PHP-FPM porti nepieder internetā.
Vai ugunsmūris aizsargā pret PHP2Shell?
Nē. PHP2Shell tiek izmantota caur tīmekļa serveri, tātad caur tieši tiem portiem, kuriem jābūt atvērtiem. Taču ugunsmūris samazina pārējo uzbrukuma virsmu, un izejošo savienojumu ierobežošana var ierobežot ielaušanās sekas.
Kāpēc ufw rāda portus kā aizvērtus, lai gan tie ir sasniedzami?
Zināms gadījums ir Docker konteineri: Docker publicētos portus ieraksta tieši paketes filtra noteikumos, apejot ufw. Tāpēc atvērtos portus vienmēr papildus pārbaudiet no ārpuses.
Vai pietiek ar mana hostinga sniedzēja ugunsmūri?
Sniedzēja priekšā novietots ugunsmūris ir laba otrā aizsardzības līnija. Taču tas neaizstāj ugunsmūri serverī, jo kļūdas gadījumā sniedzēja konfigurācijā vai iekšējiem savienojumiem tas neiedarbojas. Vislabāk izmantot abus ar tiem pašiem pamatnoteikumiem.