Lühidalt: Veebiserveri tulemüür lubab sissetulevalt ainult TCP 80 ja 443, HTTP/3 puhul lisaks UDP 443, ning SSH-i ainult tuntud võrkudest. Kõik muu visatakse ära: andmebaasid, vahemälud, PHP-FPM ja haldusliidesed ei kuulu internetti. Kontrollige esmalt käsuga ss -tulpn, mis kuulab, ehitage seejärel reeglistik vaikeväärtusega „viska ära“ ja testige tulemust väljastpoolt. Väljaminevate ühenduste piiramine piirab lisaks sissemurdmise tagajärgi.
Unustatud uksed peaukse kõrval
PHP2Shelli puhul suunati pilk veebiserverile endale, portidele 80 ja 443. Need peavad olema avatud, muidu poleks veebisaiti. Selliste aukude järgsetes inventuurides jääb aga sageli silma midagi muud: peaukse kõrval on lahti ka teisi uksi. Andmebaas kuulab kõigil võrguliidestel, PHP-FPM-i pool pordil 9000, vahemäluteenus ilma paroolita, seadistusfaasist pärit haldusliides.
Iga selline uks on oma ründepind oma aukudega. Tulemüür, mis lubab ainult vajaliku, sulgeb need mõne reegliga. See on üks tõhusamaid meetmeid oma serveri kindlustamisel, nagu kirjeldab ka leht Root-serveri ja vServeri ise turvamine.
Mis kuulub lahti, mis mitte?
Põhimõte on lubatud loend: kõik on kinni ja ainult teadlikult vabastatud teenused on kättesaadavad. Järgmine ülevaade aitab paigutada.
| Teenus | Tüüpiline port | Kas väljastpoolt kättesaadav? |
|---|---|---|
| HTTP ja HTTPS | TCP 80, TCP 443 | jah |
| HTTP/3 (QUIC) | UDP 443 | ainult kui kasutatakse |
| SSH | TCP 22 | ainult tuntud võrkudest või VPN-iga |
| Majutuspaneel | olenevalt tootest | ainult tuntud võrkudest |
| MySQL/MariaDB, PostgreSQL | TCP 3306, TCP 5432 | ei |
| Redis, Memcached | TCP 6379, TCP 11211 | ei |
| PHP-FPM | TCP 9000 või Unixi sokkel | ei, parem ainult sokkel |
| Meiliserver | TCP 25, 465, 587, 993 | ainult kui server võtab kirju vastu või väljastab neid |
Teenus, mis ei pea väljapoole nähtav olema, peaks lisaks kuulama ainult aadressil 127.0.0.1 või Unixi soklil. Siis jääb see ka tulemüüri tõrke korral kättesaamatuks. Haldusligipääsude jaoks sobivad IP-vabastused või VPN; üksikasjad on artiklis Haldusalade kaitsmine IP, VPN-i või lisakaitsega.
Samm 1: Selgitage välja, mis kuulab
Enne reeglite kirjutamist hankige ülevaade. Järgmised käsud ainult loevad:
# Kõik kuulavad TCP- ja UDP-pordid koos protsessiga
sudo ss -tulpn
# nftables'i praegune reeglistik
sudo nft list ruleset
# ufw olek, kui kasutatakse
sudo ufw status verbose
Pöörake ss väljundis tähelepanu pordi ees olevale aadressile. 0.0.0.0 või [::] tähendab: teenus kuulab kõigil liidestel. 127.0.0.1 tähendab: ainult kohalikult. Märkige iga teenuse kohta, kas see peab väljastpoolt kättesaadav olema. See loend on samas osa teie serveri inventarist.
Veebiserveri tulemüür nftables'iga
nftables on Linuxi praegune paketifilter. Järgmine reeglistik põhineb ametliku nftables'i viki näitel ja lisab SSH vabastuse ainult haldusvõrgust. Aadressid on dokumentatsiooninäited ja tuleb asendada.
#!/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 vajab naabrite tuvastamist
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
# Veebisait
tcp dport { 80, 443 } accept
# ainult HTTP/3 puhul:
# udp dport 443 accept
# SSH ainult haldusvõrgust
ip saddr @verwaltung_v4 tcp dport 22 accept
}
chain forward {
type filter hook forward priority 0; policy drop;
}
}
Kontrollige reeglistikku enne laadimist käsuga nft -c -f /etc/nftables.conf. Esimene rida flush ruleset kustutab kõik olemasolevad reeglid, ka need, mille on sisse kandnud Docker või Fail2ban. Dockeriga või teiste oma reegleid seadvate teenustega serverites kohandage reeglistikku seetõttu, selle asemel et seda üldiselt asendada. Kuidas Fail2ban tulemüüriga koos töötab, on kirjas artiklis Fail2ban veebiserverite jaoks seadistamine.
Kes eelistab lihtsamat, kasutab Ubuntus ufw-i. Oluline on järjekord: esmalt SSH vabastus, siis sisselülitamine.
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
Muutke tulemüüri reegleid kaugserverites ainult teise ligipääsuteega, näiteks teenusepakkuja konsooliga. Vale SSH-reegel lukustab teid muidu ise välja.
Väljaminevad ühendused: alahinnatud pool
Enamik tulemüüre lubab väljaminevalt kõike. Veebiserveri jaoks on see helde. Pärast sissemurdmist kasutavad ründajad väljaminevaid ühendusi tööriistade järelelaadimiseks, andmete väljaviimiseks või käskude vastuvõtmiseks. Veebiserveri või PHP protsessid, mis loovad ootamatuid ühendusi, loetakse seetõttu hoiatusmärgiks.
Väljaminevate ühenduste piiramine on töömahukam, sest iga legitiimne ühendus peab olema teada: paketiallikad uuenduste jaoks, maksete teenused, liidesed, meilide saatmine, ajaserverid. Pragmaatiline tee on esmalt väljaminevaid ühendusi logida, siis moodustada lubatud loend ja alles seejärel blokeerida. Kuidas olemasolevaid ühendusi kontrollida, kirjeldab Serveri väljaminevate ühenduste kontrollimine; millised muud jäljed viitavad sissemurdmisele, on lehel Kas olen juba kompromiteeritud?.
Lõpuks testige väljastpoolt, teiselt arvutilt ja ainult oma süsteemide vastu, millised pordid on tegelikult kättesaadavad. Alles see test näitab, kas Docker, teenusepakkuja tulemüür ja serveri reeglid annavad koos soovitud pildi.
Kokkuvõte: vähe reegleid, suur mõju
Veebiserveri tulemüür ei pea olema keeruline. Veebipordid lahti, haldus ainult tuntud võrkudest, kõik muu ära visatud: nende põhireeglitega kaovad internetist andmebaasid, vahemälud ja unustatud teenused. See on üks meetmeid parima vaeva ja kasu suhtega.
Veebiserveri või PHP enda aukude vastu tulemüür ei aita, sest just need pordid peavad jääma avatuks. Selle tugevus seisneb ülejäänud ründepinna väikesena hoidmises ja väljaminevate ühenduste piiramisega sissemurdmise tagajärgede tõkestamises.
Otsustav on hooldus. Iga uus teenus, iga konteiner ja iga muudatus teenusepakkuja juures võib pilti nihutada. Korrake kontrolli väljastpoolt seetõttu pärast iga suuremat muudatust ja kindlate intervallide järel, näiteks kord kvartalis.
Kuidas PHP SOS konkreetselt aitab?
- Seis üles võtta: kaardistame kõik kuulavad teenused ja kontrollime väljastpoolt, mis on tegelikult kättesaadav.
- Reeglistik üles ehitada: koostame lubatud loendi sissetulevatele ja, kus mõistlik, väljaminevatele ühendustele, kooskõlastatuna Dockeri, Fail2bani ja teenusepakkuja tulemüüriga.
- Turvaliselt ümber lülitada: viime muudatused ellu teise ligipääsutee ja tagasipöördumisplaaniga.
- Dokumenteerida: fikseerime pordid, vabastused ja põhjused serveri karastamise raames.
Korduma kippuvad küsimused
Milliseid porte veebiserver vajab?
Külastajate jaoks tavaliselt ainult TCP 80 ja 443, HTTP/3 puhul lisaks UDP 443. SSH ja haldusliidesed peaksid olema kättesaadavad ainult tuntud võrkudest või VPN-i kaudu. Andmebaasi-, vahemälu- ja PHP-FPM-i pordid ei kuulu internetti.
Kas tulemüür kaitseb PHP2Shelli vastu?
Ei. PHP2Shelli kasutatakse ära veebiserveri kaudu, seega just nende portide kaudu, mis peavad olema avatud. Tulemüür vähendab aga ülejäänud ründepinda ning väljaminevate ühenduste piiramine võib sissemurdmise tagajärgi tõkestada.
Miks näitab ufw porte suletuna, mis on siiski kättesaadavad?
Tuntud juhtum on Dockeri konteinerid: Docker kannab avaldatud pordid otse paketifiltri reeglitesse, ufw'st mööda. Kontrollige avatud porte seetõttu alati lisaks väljastpoolt.
Kas minu majutusteenuse pakkuja tulemüür piisab?
Teenusepakkuja eelnev tulemüür on hea teine kiht. See ei asenda aga serveris olevat tulemüüri, sest see ei rakendu pakkuja konfiguratsiooni vea või sisemiste ühenduste korral. Kõige parem on kasutada mõlemat samade põhireeglitega.