Ajankohtainen tilanne: PHP2Shell. Kaksi kriittistä PHP-haavoittuvuutta (CVSS 9.2) sallii haittakoodin suorittamisen ilman kirjautumista. Korjaukset 21.10.2026 alkaen.Mitä nyt on tehtävä →

Palomuuri verkkopalvelimelle: avatkaa vain tarvittavat portit

Verkkopalvelin tarvitsee ulospäin yleensä vain kaksi porttia. Silti monella palvelimella tietokannat, PHP-FPM tai hallintakäyttöliittymät kuuntelevat internetissä. Näin löydätte avoimet palvelut ja suljette sen, mitä ei tarvita.

Tilanne Lukuaika 5 minKoventaminen ja asetukset

Lyhyesti: Verkkopalvelimen palomuuri päästää sisään vain TCP 80 ja 443, HTTP/3:n kanssa lisäksi UDP 443, ja SSH:n vain tunnetuista verkoista. Kaikki muu hylätään: tietokantojen, välimuistien, PHP-FPM:n ja hallintakäyttöliittymien paikka ei ole internetissä. Tarkistakaa ensin komennolla ss -tulpn, mikä kuuntelee, rakentakaa sitten sääntöjoukko oletuksella ”hylkää” ja testatkaa tulos ulkopuolelta. Lähtevien yhteyksien rajaaminen rajaa lisäksi murron seurauksia.

Unohdetut ovet etuoven vieressä

PHP2Shellin kohdalla katse kohdistui itse verkkopalvelimeen, portteihin 80 ja 443. Niiden täytyy olla auki, muuten ei ole verkkosivustoa. Tällaisten aukkojen jälkeisissä inventaarioissa huomataan kuitenkin usein jotain muuta: etuoven vieressä on muitakin ovia auki. Tietokanta kuuntelee kaikilla verkkoliitännöillä, PHP-FPM-pooli portissa 9000, välimuistipalvelu ilman salasanaa, hallintakäyttöliittymä käyttöönottovaiheesta.

Jokainen näistä ovista on oma hyökkäyspintansa omine aukkoineen. Palomuuri, joka sallii vain tarpeellisen, sulkee ne muutamalla säännöllä. Se on yksi tehokkaimmista toimenpiteistä oman palvelimen suojaamisessa, kuten myös sivu Root-palvelimen ja vServerin suojaaminen itse kuvaa.

Mikä kuuluu olla auki, mikä ei?

Periaate on sallittujen lista: kaikki on kiinni, ja vain tietoisesti sallitut palvelut ovat saavutettavissa. Seuraava yleiskatsaus auttaa luokittelussa.

Palvelu Tyypillinen portti Saavutettavissa ulkopuolelta?
HTTP ja HTTPS TCP 80, TCP 443 kyllä
HTTP/3 (QUIC) UDP 443 vain jos käytössä
SSH TCP 22 vain tunnetuista verkoista tai VPN:llä
Hosting-paneeli tuotteen mukaan vain tunnetuista verkoista
MySQL/MariaDB, PostgreSQL TCP 3306, TCP 5432 ei
Redis, Memcached TCP 6379, TCP 11211 ei
PHP-FPM TCP 9000 tai Unix-socket ei, mieluummin vain socket
Postipalvelin TCP 25, 465, 587, 993 vain jos palvelin vastaanottaa tai tarjoaa sähköpostia

Palvelun, jonka ei tarvitse olla ulkopuolelta tavoitettavissa, pitäisi lisäksi kuunnella vain osoitteessa 127.0.0.1 tai Unix-socketissa. Silloin se pysyy tavoittamattomana myös palomuurin vikatilanteessa. Hallintayhteyksiin sopivat IP-sallinnat tai VPN; yksityiskohdat ovat kirjoituksessa Ylläpitoalueiden suojaus IP:llä, VPN:llä tai lisäsuojalla.

Vaihe 1: selvittäkää, mikä kuuntelee

Ennen kuin kirjoitatte sääntöjä, hankkikaa yleiskuva. Seuraavat komennot vain lukevat:

# Kaikki kuuntelevat TCP- ja UDP-portit prosesseineen
sudo ss -tulpn
# nftablesin nykyinen sääntöjoukko
sudo nft list ruleset
# ufw:n tila, jos käytössä
sudo ufw status verbose

Kiinnittäkää ss-tulosteessa huomiota portin edellä olevaan osoitteeseen. 0.0.0.0 tai [::] tarkoittaa: palvelu kuuntelee kaikilla liitännöillä. 127.0.0.1 tarkoittaa: vain paikallisesti. Kirjatkaa jokaisesta palvelusta, onko sen oltava tavoitettavissa ulkopuolelta. Tämä lista on samalla osa palvelinluetteloanne.

Verkkopalvelimen palomuuri nftablesilla

nftables on Linuxin nykyinen pakettisuodatin. Seuraava sääntöjoukko noudattaa virallisen nftables-wikin esimerkkiä ja lisää SSH:n sallinnan vain hallintaverkosta. Osoitteet ovat dokumentaatioesimerkkejä ja ne on korvattava.

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

        # Verkkosivusto
        tcp dport { 80, 443 } accept
        # vain HTTP/3:n kanssa:
        # udp dport 443 accept

        # SSH vain hallintaverkosta
        ip saddr @verwaltung_v4 tcp dport 22 accept
    }

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

Tarkistakaa sääntöjoukko ennen lataamista komennolla nft -c -f /etc/nftables.conf. Ensimmäinen rivi flush ruleset poistaa kaikki olemassa olevat säännöt, myös ne, jotka Docker tai Fail2ban on kirjannut. Palvelimilla, joilla on Docker tai muita omia sääntöjä asettavia palveluja, mukauttakaa sääntöjoukkoa siksi sen sijaan, että korvaisitte sen kokonaan. Miten Fail2ban toimii yhdessä palomuurin kanssa, kerrotaan kohdassa Fail2banin käyttöönotto verkkopalvelimille.

Joka haluaa yksinkertaisemman tavan, käyttää Ubuntulla ufw-työkalua. Tärkeää on järjestys: ensin SSH-sallinta, sitten käyttöönotto.

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
Tärkeää

Muuttakaa palomuurisääntöjä etäpalvelimilla vain toisen pääsytien kanssa, esimerkiksi palveluntarjoajanne konsolin. Väärä SSH-sääntö sulkee muuten teidät itsenne ulos.

Lähtevät yhteydet: aliarvostettu puolikas

Useimmat palomuurit sallivat lähtevästi kaiken. Verkkopalvelimelle se on antelias. Murron jälkeen hyökkääjät käyttävät lähteviä yhteyksiä työkalujen lataamiseen, tietojen siirtämiseen tai komentojen vastaanottamiseen. Verkkopalvelimen tai PHP:n prosessit, jotka muodostavat odottamattomia yhteyksiä, ovat siksi varoitusmerkki.

Lähtevien yhteyksien rajaus on työläämpää, koska jokaisen oikeutetun yhteyden on oltava tiedossa: pakettilähteet päivityksille, maksupalvelut, rajapinnat, sähköpostin lähetys, aikapalvelimet. Käytännöllinen tapa on kirjata lähtevät yhteydet ensin lokiin, muodostaa sitten sallittujen lista ja estää vasta sen jälkeen. Miten nykyiset yhteydet tarkistetaan, kuvaa Palvelimen lähtevien yhteyksien tarkistus; mitkä muut jäljet viittaavat murtoon, kerrotaan kohdassa Olenko jo vaarantunut?.

Lopuksi testaatte ulkopuolelta, toiselta koneelta ja vain omia järjestelmiänne vastaan, mitkä portit ovat todella tavoitettavissa. Vasta tämä testi näyttää, tuottavatko Docker, palveluntarjoajan palomuuri ja palvelimen säännöt yhdessä halutun kuvan.

Yhteenveto: vähän sääntöjä, suuri vaikutus

Verkkopalvelimen palomuurin ei tarvitse olla monimutkainen. Verkkoportit auki, hallinta vain tunnetuista verkoista, kaikki muu hylätty: näillä perussäännöillä tietokannat, välimuistit ja unohdetut palvelut katoavat internetistä. Se on yksi toimenpiteistä, joilla on paras vaivan ja hyödyn suhde.

Verkkopalvelimen tai itse PHP:n aukkoja vastaan palomuuri ei auta, sillä juuri nämä portit on pidettävä auki. Sen vahvuus on muun hyökkäyspinnan pitämisessä pienenä ja lähtevien yhteyksien rajauksella murron seurausten hillitsemisessä.

Ratkaisevaa on ylläpito. Jokainen uusi palvelu, jokainen kontti ja jokainen muutos palveluntarjoajalla voi siirtää kuvaa. Toistakaa tarkistus ulkopuolelta siksi jokaisen suuremman muutoksen jälkeen ja kiinteinä väleinä, esimerkiksi kerran neljännesvuodessa.

Miten PHP SOS auttaa konkreettisesti?

  • Nykytilan kartoitus: Kartoitamme kaikki kuuntelevat palvelut ja tarkistamme ulkopuolelta, mikä on todella tavoitettavissa.
  • Sääntöjoukon rakentaminen: Laadimme sallittujen listan sisääntuleville ja tarpeen mukaan lähteville yhteyksille, sovitettuna Dockeriin, Fail2baniin ja palveluntarjoajan palomuuriin.
  • Turvallinen siirtymä: Toteutamme muutokset toisen pääsytien ja varasuunnitelman kanssa.
  • Dokumentointi: Kirjaamme portit, sallinnat ja perustelut palvelimen koventamisen yhteydessä.

Usein kysytyt kysymykset

Mitä portteja verkkopalvelin tarvitsee?

Kävijöille yleensä vain TCP 80 ja 443, HTTP/3:n kanssa lisäksi UDP 443. SSH:n ja hallintakäyttöliittymien pitäisi olla saavutettavissa vain tunnetuista verkoista tai VPN:n kautta. Tietokanta-, välimuisti- ja PHP-FPM-porttien paikka ei ole internetissä.

Suojaako palomuuri PHP2Shelliltä?

Ei. PHP2Shelliä hyödynnetään verkkopalvelimen kautta, siis juuri niiden porttien kautta, joiden on oltava auki. Palomuuri kuitenkin pienentää muuta hyökkäyspintaa, ja lähtevien yhteyksien rajaus voi hillitä murron seurauksia.

Miksi ufw näyttää portteja suljetuiksi, vaikka ne ovat silti saavutettavissa?

Tunnettu tapaus ovat Docker-kontit: Docker kirjaa julkaistut portit suoraan pakettisuodatussääntöihin, ufw:n ohi. Tarkistakaa avoimet portit siksi aina lisäksi ulkopuolelta.

Riittääkö hosting-palveluntarjoajani palomuuri?

Palveluntarjoajan edessä oleva palomuuri on hyvä toinen kerros. Se ei kuitenkaan korvaa palvelimen omaa palomuuria, koska se ei toimi palveluntarjoajan asetusvirheessä tai sisäisissä yhteyksissä. Parasta on käyttää molempia samoilla perussäännöillä.

Lähteet

Pikayhteys

Jokainen tunti on tärkeä. Kirjoittakaa meille nyt.

Kuvatkaa lyhyesti järjestelmä, PHP-versio ja havainnot. Otamme yhteyttä, selvitämme tilanteen ja työskentelemme etänä, kunnes tapaus on käsitelty loppuun ja dokumentoitu.

Pikaapu