Fil-qosor: Biex tikkonfigura Nginx għal PHP b'mod sigur, agħti lil PHP-FPM biss skripts li verament jeżistu, f'applikazzjonijiet b'front controller anke biss l-index.php. Magħhom jgħoddu dotfiles imblukkati bħal .git u .env, server standard għal ismijiet ta' host mhux magħrufa, limiti tad-daqs adattati u security.limit_extensions = .php fil-pool. Dan ma jipproteġix minn vulnerabbiltajiet f'PHP innifsu, imma jillimita dak li jista' jiġi eżegwit wara żball.
L-aktar linji perikolużi jinsabu fil-PHP-location
Minn PHP2Shell ħafna timijiet jivverifikaw il-verżjonijiet u l-pools tal-PHP-FPM tagħhom, kif tiddeskrivi l-paġna Issaħħaħ Nginx ma' PHP-FPM, u wara l-aġġornament jerġgħu jibdew il-workers kollha. It-tieni ħarsa tmur lejn il-konfigurazzjoni ta' Nginx innifsha. Hemmhekk jiġi deċiż liema fajls jiġu eżegwiti fil-fatt bħala PHP.
F'ħafna konfigurazzjonijiet hemm blokk li jgħaddi kull talba għal .php lil PHP-FPM, ikun fejn ikun il-fajl. Jekk fajl PHP introdott jispiċċa f'folder tal-upload, is-server jesegwih. Minn żball tal-fajls issir hekk backdoor.
Dan l-artikolu jikkonċentra fuq in-naħa ta' Nginx: liema direttivi jgħoddu, kif taħdem l-ordni tal-blokki location u kif tittestja r-riżultat.
Kif Nginx jiddeċiedi liema blokk japplika
Min irid jikkonfigura Nginx għal PHP b'mod sigur irid jaf kif jintgħażlu l-blokki location. Skont id-dokumentazzjoni ta' Nginx, dan jimxi hekk:
- Taqbila eżatta b'
location =itemm it-tiftix minnufih. - Fost il-prefix-locations tinżamm l-itwal waħda li taqbel. Jekk għandha
^~, ma jiġu vverifikati aktar espressjonijiet regolari. - Inkella l-espressjonijiet regolari (
~,~*) jiġu vverifikati fl-ordni tal-fajl tal-konfigurazzjoni; l-ewwel taqbila tirbaħ. - Jekk l-ebda espressjoni regolari ma taqbel, tgħodd il-prefix-location mżomma.
Minn hawn jinqalgħu żewġ regoli prattiċi. Blokk għal PHP f'folders tal-upload jrid jinħoloq jew bħala prefiss ^~ jew bħala espressjoni regolari qabel il-blokk ġenerali ta' PHP. U prefix-location normali bħal location /uploads/ ma tipproteġix, għax l-espressjoni regolari għal .php tegħlebha.
Konfigurazzjoni bażika sigura
L-eżempju li ġej juri blokk server għal applikazzjoni b'front controller, kif komuni ma' Laravel, Symfony, Shopware 6 jew ħafna żviluppi proprji. Mogħdijiet, socket u ċertifikati tadattahom int.
server {
listen 443 ssl;
server_name www.example.de;
root /var/www/seite1/public;
index index.php;
ssl_certificate /etc/ssl/seite1/fullchain.pem;
ssl_certificate_key /etc/ssl/seite1/privkey.pem;
server_tokens off;
client_max_body_size 32m;
# Ippermetti Let's Encrypt u mogħdijiet magħrufa oħra
location ^~ /.well-known/ {
try_files $uri =404;
}
# Ibblokka fajls u folders moħbija (.git, .env, .htaccess)
location ~ /\. {
deny all;
}
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
# Biss il-front controller jinbgħat lil PHP-FPM
location = /index.php {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT $realpath_root;
fastcgi_hide_header X-Powered-By;
fastcgi_pass unix:/run/php/seite1.sock;
}
# Kull fajl PHP ieħor ma jiġix eżegwit
location ~ \.php$ {
return 404;
}
}
$realpath_root isolvi links simboliċi. Dan huwa importanti f'deployments b'symlink li jinbidel lejn ir-release attwali, biex PHP-FPM u OPcache jaraw il-mogħdija t-tajba. Innota wkoll: skont id-dokumentazzjoni ta' Nginx, direttivi fastcgi_param jintirtu minn livelli ogħla biss jekk fil-livell attwali ma jkun hemm l-ebda proprji. Għalhekk include fastcgi_params; jappartjeni fl-istess blokk.
CMS klassiċi bħal WordPress, TYPO3 jew Contao għandhom diversi punti tad-dħul. Hemmhekk issostitwixxi l-blokk tal-front controller b'PHP-location ġenerali li tgħaddi biss fajls li jeżistu (try_files $uri =404;), u ibblokka l-eżekuzzjoni f'kull folder li jista' jinkiteb. Kif dan jirnexxi jinsab taħt Ipprojbixxi l-eżekuzzjoni ta' PHP f'folders tal-upload.
It-tieni protezzjoni f'PHP-FPM
Nginx jiddeċiedi x'jinbagħat 'il quddiem, PHP-FPM jiddeċiedi x'jesegwixxi. Skont il-manwal ta' PHP, PHP-FPM b'mod standard jesegwixxi fajls .php u .phar u hu stess jirrakkomanda li dan jiġi llimitat għal .php. Dan jaqbad żbalji ta' konfigurazzjoni fis-server tal-web.
; fil-pool, pereżempju /etc/php/8.3/fpm/pool.d/seite1.conf
security.limit_extensions = .php
listen = /run/php/seite1.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
Is-socket għandu jkun aċċessibbli biss għal Nginx. Ports FPM fin-netwerk, bħal 9000, m'għandhomx jinfetħu lejn barra. Kif is-server ġeneralment juri biss il-ports meħtieġa tiddeskrivih Firewall għal servers tal-web: iftaħ biss il-ports meħtieġa.
Ismijiet ta' host mhux magħrufa u vit oħra
Mingħajr server standard proprju, Nginx iwieġeb għal talbiet għal ismijiet ta' host mhux magħrufa bl-ewwel blokk server li jaqbel. Skans awtomatiċi li jindirizzaw biss l-indirizz IP imbagħad jispiċċaw direttament fl-applikazzjoni tiegħek. Server standard proprju jtemm talbiet bħal dawn mingħajr tweġiba.
server {
listen 80 default_server;
listen 443 ssl default_server;
server_name _;
ssl_reject_handshake on;
return 444;
}
Punti oħra li ppruvaw ruħhom:
| Vit | Rakkomandazzjoni | Skop |
|---|---|---|
server_tokens |
off |
l-ebda numru ta' verżjoni fl-headers u paġni ta' żball |
client_max_body_size |
adattat għal post_max_size |
irrifjuta talbiet kbar kmieni |
autoindex |
mitfi (standard) | l-ebda listi ta' direttorji |
fastcgi_hide_header |
X-Powered-By |
l-ebda verżjoni ta' PHP lejn barra |
| Paġni tal-istatus | pm.status_path biss internament |
l-ebda data operattiva pubblika |
| Fajls ta' backup | ibblokka jew neħħi .sql, .zip, .bak fil-webroot |
l-ebda download ta' databases |
Aktar dwar l-indikazzjonijiet tal-verżjoni jinsab fl-artikolu expose_php u Server-headers.
Vit ieħor jolqot il-metodi HTTP permessi. Il-biċċa l-kbira tal-websajts jeħtieġu biss GET, HEAD u POST. B'limit_except metodi oħra jistgħu jiġu rrifjutati f'location; skont id-dokumentazzjoni ta' Nginx, l-għoti ta' GET awtomatikament jippermetti wkoll HEAD. Ivverifika qabel jekk interfaces tal-applikazzjoni tiegħek jużawx PUT jew DELETE, għax REST-APIs spiss jagħmlu hekk.
Ittestja qabel ma tagħmel reload
Kull bidla tivverifikaha l-ewwel b'nginx -t u biss imbagħad terġa' tgħabbi Nginx. Wara ittestja l-imġiba minn barra b'talbiet normali lid-dominju tiegħek stess:
sudo nginx -t && sudo systemctl reload nginx
# Mistenni: 403 jew 404
curl -s -o /dev/null -w "%{http_code}\n" https://www.example.de/.git/HEAD
curl -s -o /dev/null -w "%{http_code}\n" https://www.example.de/.env
# Mistenni: 404, għax jiġi eżegwit biss il-front controller
curl -s -o /dev/null -w "%{http_code}\n" https://www.example.de/info.php
# Liema blokki jgħaddu lil PHP-FPM?
sudo nginx -T 2>/dev/null | grep -nE "location|fastcgi_pass"
Qabel kull bidla akbar salva l-output sħiħ ta' nginx -T bid-data. Fiha l-konfigurazzjoni effettiva kollha inklużi l-fajls kollha inklużi. Jekk wara bidla xi ħaġa tmur ħażin, it-tqabbil juri minnufih x'inbidel. Fil-vulnerabbiltà kritika li jmiss għandek ukoll bażi affidabbli għall-inventarju, mingħajr ma jkollok bżonn tiġbor il-fajls l-ewwel.
Ibdel il-konfigurazzjoni l-ewwel fuq ambjent ta' test jew fuq kopja tal-blokk server. Punt tad-dħul minsi, pereżempju callback tal-pagament, inkella jidher biss meta l-ordnijiet jieqfu.
Kif tgħin PHP SOS b'mod konkret?
- Naqraw il-konfigurazzjoni: nevalwaw il-konfigurazzjoni kollha ta' Nginx b'
nginx -Tu nassenjaw kull trasferiment lil PHP lill-websajt u lill-pool tiegħu. - Niddeterminaw il-punti tad-dħul: flimkien mal-iżviluppaturi tiegħek niddeċiedu liema skripts iridu jiġu eżegwiti u nibblokkaw il-bqija.
- Nimplimentaw u nittestjaw: nadattaw blokki server u pools, nivverifikaw b'
nginx -tu nittestjaw formoli, toroq tal-pagament u uploads. - Nassiguraw b'mod permanenti: il-konfigurazzjoni ssir parti mit-Tisħiħ tas-server tagħna u mid-dokumentazzjoni tas-server tiegħek.
Mistoqsijiet frekwenti
Nginx irid jerġa' jinbeda wara aġġornament ta' PHP?
Għall-patch ta' PHP le, għax Nginx ma fihx PHP. Iridu jerġgħu jinbdew is-servizzi PHP-FPM kollha. Jekk ibiddel ukoll il-konfigurazzjoni ta' Nginx, ivverifikaha qabel b'nginx -t u imbagħad erġa' tgħabbi Nginx.
Għaliex nibgħat lil PHP biss index.php?
Ħafna applikazzjonijiet moderni għandhom punt tad-dħul wieħed, il-front controller. Jekk biss dan il-fajl jinbgħat lil PHP-FPM, fajl PHP introdott f'post ieħor ma jistax jiġi eżegwit mill-browser. Fi sistemi b'ħafna punti tad-dħul dan il-mudell mhuwiex possibbli.
X'jagħti security.limit_extensions f'PHP-FPM?
L-issettjar jiddetermina liema estensjonijiet ta' fajls PHP-FPM jesegwixxi bħala skript. Skont il-manwal ta' PHP l-istandard huwa .php .phar; jirrakkomanda li jiġi llimitat għal .php. Dan jaqbad żbalji fil-konfigurazzjoni tas-server tal-web, imma ma jissostitwihiex.
Regoli ta' Nginx humiex protezzjoni kontra PHP2Shell?
Le. PHP2Shell jinsab fl-interpretatur ta' PHP u jingħalaq biss bl-aġġornament għal verżjoni rranġata u r-restart tal-workers kollha. Konfigurazzjoni sikura ta' Nginx tnaqqas is-superfiċje ta' attakk u tillimita d-dannu wara dħul.