Najbolji sigurnosni savjeti za ojačavanje PHP-a za Linux poslužitelje


Nije pametno da je PHP jedan od najčešće korištenih poslužiteljskih skriptnih programskih jezika. Ima smisla da napadač pronađe različite načine na koje može manipulirati PHP-om jer je on često uparen s MySQL i omogućiti pristup privatnim podacima vaših korisnika.

Ni u kojem slučaju ne tvrdimo da je PHP ranjiv ili ima neke ozbiljne probleme prema zadanim postavkama, ali moramo se pobrinuti da podesimo PHP na takav način da se može robusniji nego ikad prije.

1. Uklonite nepotrebne PHP module

Prema zadanim postavkama dobivate skup PHP modula koji mogu biti od pomoći u raznim zadacima, ali neki nepotrebni moduli možda neće biti korisni za svaki projekt. Za popis dostupnih PHP modula, upotrijebite danu naredbu:

php -m

Moduli se nalaze u direktoriju /etc/php.d/ i mogu lako promijeniti naš trenutni direktorij u /etc/php.d/ pomoću sljedeće naredbe cd.

cd /etc/php.d/

Razlog zašto mijenjamo direktorij kako bismo uklonili module je taj što se moduli nazivaju sasvim drugačije u izvornom direktoriju. Sada popišite dostupne module zadanom naredbom:

ls

Na primjer, uklonimo modul curl korištenjem dane naredbe:

sudo rm -r 20-curl.ini

2. Onemogućite daljinsko izvršavanje PHP koda

U većini slučajeva udaljenim se vezama ne može vjerovati. Onemogućavanjem pristupa fopen omotima, mogu pristupiti samo lokalnim datotekama. Da bismo onemogućili fopen, moramo otvoriti PHP konfiguracijsku datoteku korištenjem zadane naredbe:

sudo nano /etc/php.ini

Sada upotrijebite CRTL + w i upišite allow_url_fopen što će nas dovesti do određenih linija odakle ćemo onemogućiti te opcije.

allow_url_fopen=Off
allow_url_include=Off

Nakon što završite s promjenama, spremite konfiguracijsku datoteku pomoću CTRL + O i pritisnite Enter.

3. Onemogućite curenje PHP informacija

Kada nije onemogućeno, svijet može lako prepoznati koju verziju PHP trenutno koristi naš web poslužitelj. Ovo možda ne zvuči kao velika stvar, ali davanje napadaču do znanja točne verzije može biti opasno.

sudo nano /etc/php.ini

Sada promijenite zadane postavke na “Isključeno”.

expose_php=Off

4. Onemogućite zapisnike PHP pogrešaka

Standardno je svaka pogreška našeg web poslužitelja vidljiva našim posjetiteljima, uključujući i napadače. Kako bismo osigurali da nijedna od pogrešaka nije vidljiva nikome, moramo unijeti promjene u našu PHP konfiguracijsku datoteku.

sudo nano /etc/php.ini

I promijenite zadanu postavku prikaza zapisnika grešaka na “Isključeno”.

display_errors = Of

Ali što ako ste programer i trebate imati zapisnike pogrešaka kako biste prevladali razvojne probleme? Ne brinite, postoji način da dobijete svoje zapisničke datoteke tako što ćete napraviti malu promjenu u istoj konfiguracijskoj datoteci.

Samo moramo omogućiti log_errors i dati put do error_log gdje će biti pohranjene naše datoteke dnevnika.

log_errors=On
error_log=/var/log/httpd/php_scripts_error.log

5. Kontrola PHP resursa

Prema nama, upravljanje resursima je najbitniji dio kada se osigurava PHP. Ovdje ćemo dodijeliti fiksnu količinu vremena izvršenja, vremena unosa i ograničenja memorije tako da ako na neki način naša skripta bude ugrožena, izvršenje će biti zaustavljeno nakon određenog vremena.

Odabrali smo 25 sekundi za vrijeme izvršenja i unosa i ograničenje memorije od 30MB. Naravno, možete ga prilagoditi svojim potrebama.

max_execution_time = 25
max_input_time = 25
memory_limit = 30M

6. Ograničite pristup PHP datoteci

Kako bismo ograničili pristup datoteci, omogućit ćemo open_basedir koji će osigurati da PHP može uključivati samo datoteke iz naših navedenih direktorija.

Važno: ovo će blokirati sve ostale direktorije i zahtijeva od nas da ručno dodamo važne direktorije, što također uključuje dodavanje privremenih datoteka i direktorija sesija.

open_basedir = "/home/sagar/public_html:/var/lib/php/tmp_upload:/var/lib/php/session"

7. Konfigurirajte učitavanje PHP datoteka

Ako vaša aplikacija ne zahtijeva učitavanje datoteka s strane korisnika, uvijek se savjetuje da onemogućite učitavanje datoteka. To sprječava napadače da učitaju opasne skripte koje bi na kraju mogle oštetiti cijelu aplikaciju.

file_uploads = Off

Ali što ako je vaša aplikacija dizajnirana za preuzimanje datoteka od strane korisnika? U tom slučaju morate omogućiti prijenos datoteka, ali pokušajte smanjiti maksimalni prostor i smanjiti maksimalan broj datoteka koje se mogu učitati iz jednog zahtjeva.

file_uploads = On
upload_max_filesize = 1M
max_file_uploads = 1

U PHP-u, prema zadanim postavkama, privremene datoteke smještene su u direktorij u koji mogu pisati svi korisnici sustava. Zadanu lokaciju morate prebaciti na sigurnije mjesto i provjerite da se ne nalazi unutar web korijena.

Kako smo koristili open_basedir, koristit ćemo istu lokaciju koju smo već stavili na popis dopuštenih.

upload_tmp_dir = /var/lib/php/tmp_upload

8. Onemogućite opasne PHP funkcije

PHP ima razne funkcije omogućene prema zadanim postavkama i može biti od pomoći u razvojne svrhe. Ali hakeri mogu koristiti mnoge funkcije za iskorištavanje našeg web poslužitelja, a njihovo onemogućavanje će dodati sloj sigurnosti.

Imamo onemogućen skup funkcija i obavezno ih unakrsno provjerimo prije izmjena konfiguracijske datoteke.

disable_functions = exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source

9. Promijenite direktorij SOAP predmemorije

Kako smo promijenili zadani privremeni direktorij i sesiju, isto se odnosi i na SOAP predmemoriju jer se ne bi trebala spremati u zadani direktorij. Provjerite je li spremljeno na sigurno mjesto.

soap.wsdl_cache_dir = /var/lib/php/soap_cache

10. Kontrolirajte PHP POST veličinu

Kontroliranjem POST veličine, možemo zaštititi naš poslužitelj od hakera koji pokušavaju zauzeti resurse poslužitelja slanjem ogromnih datoteka. To nas spašava od neželjenih padova poslužitelja i sporog vremena odgovora.

post_max_size=4M

11. Zaštitite PHP konfiguracije

Dok uklanjamo nepotrebne datoteke, često uklanjamo neke ključne datoteke ili čak direktorije. Stoga moramo podesiti postavke na takav način da ih čak ni root korisnici ne mogu izbrisati. Za izradu datoteka i direktorija koristit ćemo chattr s različitim oznakama.

Nakon što upotrijebite zadanu naredbu, više ne možete modificirati određenu datoteku niti je ukloniti.

sudo chattr +i /etc/php.ini

Dok pokušavate ukloniti nepromjenjivu datoteku, pokazat će pogrešku "Operacija nije dopuštena".

sudo rm -r /etc/php.ini

Ali što ako želite nastaviti pisati te datoteke dok ih učinite nepromjenjivima? To možete lako postići korištenjem oznake +a umjesto +i.

sudo chattr +a /etc/php.ini

Mogu postojati neki slučajevi kada vam više ne treba stara konfiguracijska datoteka i u tom slučaju moramo poništiti postavljanje atributa.

sudo chattr -i /etc/php.ini

Slično, ako ste koristili atribute +a u procesu stvaranja nepromjenjivih datoteka, možete to poništiti korištenjem dane naredbe:

sudo chattr -a /etc/php.ini

12. Koristite SSL certifikate za HTTPS

Danas svaki moderni preglednik kao što su Google Chrome, Firefox, Opera i drugi preporučuju korištenje HTTPS za web poslužitelje. Budući da HTTPS pruža siguran i šifriran pristupni kanal za nepouzdane stranice, možemo pružiti pouzdano iskustvo našim korisnicima.

Dodavanjem HTTPS možemo se zaštititi od XSS napada uključujući sprječavanje hakera da čitaju prenesene podatke pomoću kodova.

Kako bismo omogućili HTTPS, instalirat ćemo i koristiti besplatni Let’s Encrypt SSL Certificate na poslužitelju.

sudo dnf install epel-release 
sudo dnf install certbot python3-certbot-apache mod_ssl
sudo certbot --apache -d domain.com   [For Apache]
sudo certbot --nginx -d domain.com    [For Nginx]

13. Redovito ažurirajte PHP

Budući da je to jezik otvorenog koda, krpa se gotovo svakodnevno. To se možda ne čini previše važnim korakom, ali vas može spasiti od velike ranjivosti. Stoga pazite da svoje PHP pakete održavate ažurnima što će vas spasiti od mnogih mogućih ranjivosti.

yum update & yum upgrade    [On RHEL-based systems]
apt update && apt upgrade   [On Debian-based systems]

Ovo je naš pogled na to kako možete jednostavno poboljšati sigurnost PHP-a u Linux sustavima. Kroz ovaj vodič pokušali smo pojednostaviti stvari koliko god možemo, a ako još uvijek imate bilo kakvih nedoumica, javite nam u komentarima.