Siekiant išvengti virtualiai dedikuoto serverio darbo sutrikimo dėl trečiųjų šalių veiksmų, būtina nuolat stiprinti serverio saugumo lygį. Šiame straipsnyje pateikiami praktiniai patarimai, kurie padeda sustiprinti PHP saugumą serverio lygiu.
PHP konfigūraciniai failai šiuolaikinėse Debian ir Ubuntu operacinėse sistemose talpinami šiuose kataloguose:
/etc/php/PHP_VERSIJA/apache2/php.ini
/etc/php/PHP_VERSIJA/fpm/php.ini
/etc/php/PHP_VERSIJA/cli/php.ini
0. PHP versijos pasirinkimas
Rekomenduojama naudoti aktyviai palaikomas PHP versijas, pvz.:
PHP 8.1
PHP 8.2
PHP 8.3
PHP 8.4
Senesnių PHP versijų (pvz.: 5.x ar 7.0–7.3) palaikymas yra nutrauktas ir jų naudojimas laikomas nesaugiu.
1. allow_url_fopen
Ši funkcija PHP aplikacijose leidžia išgauti duomenis iš nutolusių šaltinių (FTP, HTTP). Jei trečiosios šalys gali manipuliuoti šia PHP direktyva, tuomet labai lengva įkrauti informaciją ar jos dalį iš nutolusio serverio netalpinant kenkėjiškų failų tiesiogiai jūsų serveryje.
Rekomenduojama reikšmė:
allow_url_fopen = Off
2. allow_url_include
Išjungus šią funkcija blokuojami failai kurie gali būti įkraunami iš išorinių nuorodų. Jei ši funkcija išjungta, tačiau palikta allow_url_fopen direktyvą įjungta, tuomet trečiosios šalys vis tiek gali įkrauti informaciją iš nutolusių serverių.
Rekomenduojama reikšmė:
allow_url_include = Off
3. disable_functions
Ši direktyva leidžia išjungti specifines PHP funkcijas, taip sumažinant riziką jog bus pasinaudojama PHP aplikacijos spragomis.
Rekomenduojama konfigūracija (pagal poreikį):
disable_functions = exec,passthru,shell_exec,system,proc_open,proc_close,popen,dl,symlink,show_source,fsockopen
Prieš išjungdami funkcijas, būtina patikrinti, ar jos nėra naudojamos jūsų tinklalapyje. Išjungiamų funkcijų paaiškinimas:
exec - išorinės komandos vykdymas
passthru - vykdoma išorinė programa ir pateikiami neformatuoti rezultatai
shell_exec - vykdoma shell komanda
system - įvykdoma išorinė programa ir pavaizduojamas rezultatas
proc_open - įvykdoma komanda ir atidaromas failas informacijos įvedimui / išvedimui
proc_close - uždaromas failas iššauktas proc_open komandos, pateikiamas uždarymo PID
popen - atidaroma vykdomo failo rodyklė
dl - įkraunamas PHP plėtinys PHP vykdymo metu
symlink - sukuriama nuoroda į failą
show_source - rodomas failo šaltinis
fsockopen - atidaromas unix arba www prievadas (port)
4. display_errors ir log_errors
Ši PHP direktyva pateikia PHP klaidas esant PHP aplikacijos kodo klaidoms. PHP aplikacijos klaidose gali būti pateikiama informacija aktuali trečiosioms šalims siekiančioms sukompromituoti jūsų tinklalapį ir/ar serverį.
Rekomenduojamos reikšmės:
display_errors = Off
ir
log_errors = On
5. expose_php
Ši direktyva nustato ar PHP versija yra rodoma trečiosioms šalims. Žinant PHP versiją galima išnaudoti žinomus pažeidžiamumus (ypač jei PHP versija nėra naujausia).
Rekomenduojama reikšmė:
expose_php = Off
6. memory_limit
Ši direktyva aprašo virtualios atminties kiekį skiriamą 1 PHP procesui. Pasirinkus neracionalų memory_limit dydį atveriamas kelias DoS tipo atakai. Ši direktyva konfigūruojama pagal specifinį poreikį. Didinkite ją virš rekomenduotinos reikšmės tik tada jei iš tiesų nėra kito pasirinkimo.
Rekomenduojama bazinė reikšmė:
memory_limit = 128M
7. open_basedir
open_basedir direktyva apriboja PHP failų naudojimą už vartotojo nustatyto aplanko ribų. Nustatykite open_basedir (jei naudojama) tik ties tuo aplanku kurį norite jog lankytojai matytų.
Pavyzdinė konfigūracija:
open_basedir = "/var/www/html/:/usr/local/php/"
arba
open_basedir = "/var/www/html/:/tmp/"
Naudoti reikėtų atsargiai, nes netinkama konfigūracija gali sugadinti svetainės veikimą.
8. post_max_size
Ši direktyva riboja duomenų kiekį perduodama POST metodu. Trečiosios šalys gali sukompromituoti serverio resursus siųsdami daugybę POST tipo užklausų ir taip išnaudodami serverio atmintį.
Rekomenduojama reikšmė:
post_max_size = 8M
9. session.save_path
Nurodo katalogą, kuriame saugomos PHP sesijos.
Rekomenduojama reikšmė:
session.save_path = "/var/lib/php/sessions"
Katalogas turi būti neprieinamas per web serverį.
10. upload_max_filesize
Ši direktyva nustato maksimalų 1 failo dydį kurį galima įkelti naudojant PHP aplikaciją. Trečiosios šalys mėgindamos sukompromituoti jūsų serverio sklandų darbą gali mėginti įkelti itin didelius failus taip visiškai išnaudodami jūsų serveryje esančius resursus.
Rekomenduojama reikšmė:
upload_max_filesize = 8M
11. upload_tmp_dir
Ši direktyva aprašo aplanko kelią, kuriame saugojami laikini failai su kuriais dirba PHP aplikacija. Aplankas Negali būti pasiekiamas įprastiems vartotojams.
Rekomenduojama reikšmė:
upload_tmp_dir = "/tmp"
Katalogas neturi būti prieinamas iš išorės.
12. session.use_trans_sid
Nurodo ar sesijos ID perduodamas URL parametruose.
Rekomenduojama reikšmė:
session.use_trans_sid = 0
Papildomos rekomendacijos
Taip pat rekomenduojama:
session.cookie_httponly = 1
session.cookie_secure = 1
session.use_strict_mode = 1
Pakeitimų pritaikymas
Atlikus pakeitimus, kad šie įsigaliotų, būtina perkrauti PHP tarnybą:
PHP-FPM atveju (pavyzdys 8.2 PHP versijai):
systemctl restart php8.2-fpm
Apache (web serverio) atveju:
systemctl restart apache2
