Aktuális helyzet: PHP2Shell. Két kritikus PHP-rés (CVSS 9,2) lehetővé teszi kártékony kód futtatását bejelentkezés nélkül. Javítások 2026. 10. 21. óta.Mi a teendő most →

Tűzfal webszerverekhez: csak a szükséges portokat nyissa meg

Egy webszervernek kifelé többnyire csak két portra van szüksége. Mégis sok szerveren adatbázisok, PHP-FPM vagy kezelőfelületek hallgatnak az interneten. Így találja meg a nyitott szolgáltatásokat, és zárja le, amire nincs szükség.

Állapot 5 perc olvasási időKeményítés és konfiguráció

Röviden: A webszerverek tűzfala bejövően csak a TCP 80-at és 443-at engedi, HTTP/3 esetén ezenkívül az UDP 443-at, az SSH-t pedig csak ismert hálózatokból. Minden mást eldob: az adatbázisok, gyorsítótárak, a PHP-FPM és a kezelőfelületek nem valók az internetre. Először az ss -tulpn paranccsal ellenőrizze, mi hallgat, majd építsen egy „eldobás” alapértelmezésű szabályrendszert, és tesztelje az eredményt kívülről. A kimenő kapcsolatok korlátozása ezenkívül mérsékli egy behatolás következményeit.

Az elfelejtett ajtók a bejárati ajtó mellett

A PHP2Shellnél a tekintet magára a webszerverre irányult, a 80-as és 443-as portokra. Ezeknek nyitva kell lenniük, különben nincs weboldal. Az ilyen rések utáni állapotfelméréseknél azonban gyakran valami más tűnik fel: a bejárati ajtó mellett további ajtók állnak nyitva. Egy adatbázis az összes hálózati interfészen hallgat, egy PHP-FPM-pool a 9000-es porton, egy jelszó nélküli gyorsítótár-szolgáltatás, egy kezelőfelület a beüzemelési fázisból.

Mindegyik ilyen ajtó saját támadási felület saját résekkel. Egy tűzfal, amely csak a szükségeset engedi át, néhány szabállyal lezárja őket. Ez egyike a saját szerver biztosítása leghatékonyabb intézkedéseinek, ahogyan a Root szerver és vServer saját biztosítása oldal is leírja.

Mi tartozik a nyitottak közé, és mi nem?

Az alapelv egy engedélyezési lista: minden zárva van, és csak a tudatosan engedélyezett szolgáltatások érhetők el. A következő áttekintés segít a besorolásban.

Szolgáltatás Tipikus port Kívülről elérhető?
HTTP és HTTPS TCP 80, TCP 443 igen
HTTP/3 (QUIC) UDP 443 csak ha használják
SSH TCP 22 csak ismert hálózatokból vagy VPN-nel
Tárhelypanel terméktől függően csak ismert hálózatokból
MySQL/MariaDB, PostgreSQL TCP 3306, TCP 5432 nem
Redis, Memcached TCP 6379, TCP 11211 nem
PHP-FPM TCP 9000 vagy Unix-socket nem, jobb csak socket
Levelezőszerver TCP 25, 465, 587, 993 csak ha a szerver leveleket fogad vagy biztosít

Egy szolgáltatásnak, amelynek nem kell kifelé elérhetőnek lennie, ezenkívül csak a 127.0.0.1-en vagy egy Unix-socketen szabad hallgatnia. Ekkor a tűzfal meghibásodása esetén is elérhetetlen marad. A kezelői hozzáféréshez IP-engedélyezések vagy VPN alkalmasak; részletek az Adminisztrációs területek elzárása IP-vel, VPN-nel vagy kiegészítő védelemmel cikkben.

1. lépés: megállapítani, mi hallgat

Mielőtt szabályokat írna, szerezzen áttekintést. A következő parancsok csak olvasnak:

# Az összes hallgató TCP- és UDP-port a folyamattal
sudo ss -tulpn
# Az nftables aktuális szabályrendszere
sudo nft list ruleset
# Az ufw állapota, ha használják
sudo ufw status verbose

Az ss kimenetében figyeljen a port előtti címre. A 0.0.0.0 vagy a [::] azt jelenti: a szolgáltatás az összes interfészen hallgat. A 127.0.0.1 azt jelenti: csak helyben. Jegyezze fel minden szolgáltatásnál, hogy kívülről elérhetőnek kell-e lennie. Ez a lista egyúttal a szerverleltára egy része.

Tűzfal webszerverhez nftablesszel

Az nftables a Linux aktuális csomagszűrője. A következő szabályrendszer a hivatalos nftables-wiki példájához igazodik, és kiegészít egy csak egy kezelői hálózatból érvényes SSH-engedélyezéssel. A címek dokumentációs példák, és le kell cserélni őket.

#!/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

        # Az IPv6-nak szüksége van a szomszédfelderítésre
        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

        # Weboldal
        tcp dport { 80, 443 } accept
        # csak HTTP/3 esetén:
        # udp dport 443 accept

        # SSH csak a kezelői hálózatból
        ip saddr @verwaltung_v4 tcp dport 22 accept
    }

    chain forward {
        type filter hook forward priority 0; policy drop;
    }
}

A szabályrendszert betöltés előtt ellenőrizze az nft -c -f /etc/nftables.conf paranccsal. Az első sor, a flush ruleset, törli az összes meglévő szabályt, azokat is, amelyeket a Docker vagy a Fail2ban jegyzett be. Azokon a szervereken, amelyeken Docker vagy más, saját szabályokat felállító szolgáltatások futnak, ezért igazítsa a szabályrendszert, ahelyett hogy átalányban lecserélné. Hogyan működik együtt a Fail2ban a tűzfallal, azt a A Fail2ban beállítása webszerverekhez írja le.

Aki egyszerűbbet szeret, Ubuntun az ufw-t használja. A sorrend fontos: először az SSH-engedélyezés, utána a bekapcsolás.

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
Fontos

A tűzfalszabályokat távoli szervereken csak második hozzáférési úttal módosítsa, például a szolgáltatója konzoljával. Egy hibás SSH-szabály különben kizárja Önt.

Kimenő kapcsolatok: az alulbecsült fele

A legtöbb tűzfal kimenően mindent engedélyez. Egy webszerver számára ez nagyvonalú. Egy behatolás után a támadók a kimenő kapcsolatokat eszközök letöltésére, adatok kiszivárogtatására vagy parancsok fogadására használják. Azok a webszerver- vagy PHP-folyamatok, amelyek váratlan kapcsolatokat építenek fel, ezért figyelmeztető jelnek számítanak.

A kimenő kapcsolatok korlátozása költségesebb, mert minden jogos kapcsolatot ismerni kell: frissítések csomagforrásait, fizetési szolgáltatókat, felületeket, levélküldést, időszervereket. Pragmatikus út, hogy először naplózza a kimenő kapcsolatokat, utána engedélyezési listát alakít ki, és csak ezután tilt. Hogyan ellenőrizze a meglévő kapcsolatokat, azt a Egy szerver kimenő kapcsolatainak ellenőrzése írja le; hogy más nyomok mire utalnak még egy behatolásra, az a Megtámadtak már? oldalon áll.

Végül tesztelje kívülről, egy másik számítógépről és csak a saját rendszerei ellen, mely portok érhetők el ténylegesen. Csak ez a teszt mutatja meg, hogy a Docker, a szolgáltatói tűzfal és a szerverszabályok együtt a kívánt képet adják-e.

Összegzés: kevés szabály, nagy hatás

Egy webszerver-tűzfalnak nem kell bonyolultnak lennie. A webportok nyitva, a kezelés csak ismert hálózatokból, minden más eldobva: ezekkel az alapszabályokkal az adatbázisok, gyorsítótárak és elfelejtett szolgáltatások eltűnnek az internetről. Ez az egyik legjobb ráfordítás-haszon arányú intézkedés.

A webszerveren vagy magában a PHP-ban lévő rések ellen a tűzfal nem segít, mert éppen ezeknek a portoknak nyitva kell maradniuk. Erőssége abban rejlik, hogy a többi támadási felületet kicsin tartja, és a kimenő kapcsolatok korlátozásával mérsékli egy behatolás következményeit.

A gondozás a döntő. Minden új szolgáltatás, minden konténer és a szolgáltatónál történő minden módosítás eltolhatja a képet. Ezért minden nagyobb módosítás után és rögzített időközönként, például negyedévente, ismételje meg a kívülről végzett ellenőrzést.

Hogyan segít konkrétan a PHP SOS?

  • A készlet felvétele: Felmérjük az összes hallgató szolgáltatást, és kívülről ellenőrizzük, mi érhető el ténylegesen.
  • A szabályrendszer felépítése: Engedélyezési listát készítünk a bejövő és, ahol értelmes, a kimenő kapcsolatokra, a Dockerrel, a Fail2bannel és a szolgáltatói tűzfallal egyeztetve.
  • Biztonságos átállítás: A módosításokat második hozzáférési úttal és visszaesési tervvel hajtjuk végre.
  • Dokumentálás: A portokat, engedélyezéseket és az indokokat a szerverkeményítés keretében rögzítjük.

Gyakori kérdések

Mely portokra van szüksége egy webszervernek?

A látogatók számára általában csak a TCP 80 és 443, HTTP/3 esetén ezenkívül az UDP 443. Az SSH-nak és a kezelőfelületeknek csak ismert hálózatokból vagy VPN-en keresztül szabad elérhetőnek lenniük. Az adatbázis-, gyorsítótár- és PHP-FPM-portok nem valók az internetre.

Véd egy tűzfal a PHP2Shell ellen?

Nem. A PHP2Shellt a webszerveren keresztül használják ki, tehát éppen azokon a portokon, amelyeknek nyitva kell lenniük. A tűzfal viszont csökkenti a többi támadási felületet, és a kimenő kapcsolatok korlátozása mérsékelheti egy behatolás következményeit.

Miért mutat az ufw zártnak olyan portokat, amelyek mégis elérhetők?

Ismert eset a Docker-konténerek: a Docker a közzétett portokat közvetlenül a csomagszűrő szabályaiba írja be, az ufw megkerülésével. Ezért a nyitott portokat mindig ellenőrizze kívülről is.

Elég a tárhelyszolgáltatóm tűzfala?

A szolgáltató előtte álló tűzfala jó második réteg. A szerveren lévő tűzfalat azonban nem pótolja, mert a szolgáltatói konfiguráció hibája vagy belső kapcsolatok esetén nem hat. A legjobb, ha mindkettőt ugyanazokkal az alapszabályokkal használja.

Források

Azonnali kapcsolat

Minden óra számít. Írjon nekünk most.

Ismertesse röviden a rendszert, a PHP-verziót és a megfigyelését. Jelentkezünk, tisztázzuk a helyzetet, és távolról dolgozunk, amíg az incidens le nem zárul és dokumentálva nem lesz.

Azonnali segítség