Aktuālā situācija: PHP2Shell. Divas kritiskas PHP ievainojamības (CVSS 9.2) ļauj izpildīt ļaunprātīgu kodu bez pieteikšanās. Ielāpi kopš 21.10.2026.Kas jādara tagad →

Ugunsmūris tīmekļa serveriem: atvērt tikai nepieciešamos portus

Tīmekļa serverim uz āru parasti vajag tikai divus portus. Tomēr daudzos serveros internetā klausās datubāzes, PHP-FPM vai pārvaldības saskarnes. Kā atrast atvērtos pakalpojumus un aizvērt nevajadzīgos.

Aktuāls uz 5 min lasīšanas laiksNostiprināšana un konfigurācija

Ī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
Svarīgi

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.

Avoti

Tūlītējs kontakts

Katra stunda ir svarīga. Rakstiet mums tūlīt.

Īsi aprakstiet sistēmu, PHP versiju un novēroto. Mēs sazināsimies, noskaidrosim situāciju un strādāsim attālināti, līdz incidents ir slēgts un dokumentēts.

Tūlītēja palīdzība