Ukratko: Sigurnosna zaglavlja su upute web-poslužitelja pregledniku koje štite posjetitelje od napada poput cross-site scriptinga, clickjackinga i nešifriranih veza. Najvažnija su HSTS, Content-Security-Policy, X-Content-Type-Options, zaštita od tuđih okvira, Referrer-Policy i Permissions-Policy. Smisleno su ojačavanje, ali ne zamjenjuju ažuriranja na poslužitelju.
Što sigurnosna zaglavlja postižu, a što ne
Pri svakom pozivu stranice web-poslužitelj uz sadržaj šalje i zaglavlja. Neka od njih upravljaju sigurnosnim funkcijama preglednika. Tako se primjerice može odrediti da se stranica učitava samo preko HTTPS-a ili da preglednik ne izvršava skripte s tuđih domena.
Za operatere je važno razvrstavanje: zaglavlja štite ponajprije posjetitelje, primjerice od presretanja sesija ili manipuliranih obrazaca. Ne zatvaraju ranjivosti na poslužitelju. Slabost u PHP-u, u CMS-u ili u ekstenziji ostaje, koliko god dobro zaglavlja bila postavljena. U kombinaciji s urednim kodom, međutim, znatno ograničavaju posljedice mnogih pogrešaka.
Najvažnija sigurnosna zaglavlja ukratko
| Zaglavlje | Svrha | Preporuka kao polazište |
|---|---|---|
| Strict-Transport-Security (HSTS) | nameće HTTPS za buduće pozive | max-age=31536000; includeSubDomains |
| Content-Security-Policy (CSP) | određuje dopuštene izvore za skripte, slike, okvire | individualno, najprije kao Report-Only |
| X-Content-Type-Options | sprječava da preglednik pogađa vrste datoteka | nosniff |
| X-Frame-Options odnosno CSP frame-ancestors | sprječava ugradnju u tuđe stranice (clickjacking) | SAMEORIGIN odnosno frame-ancestors 'self' |
| Referrer-Policy | ograničava koja se adresa prenosi drugim stranicama | strict-origin-when-cross-origin |
| Permissions-Policy | isključuje funkcije preglednika poput kamere ili lokacije | dopustiti samo potrebne funkcije |
HSTS biste trebali postaviti tek kad su sve poddomene pouzdano dostupne preko HTTPS-a. Preglednik pamti uputu za navedeno vrijeme; pogrešku tada nije moguće odmah povući. Po potrebi počnite s kratkim trajanjem i povećajte ga nakon uspješnih testova. Dodatna opcija preload trajno upisuje domenu u popise proizvođača preglednika i treba je postaviti tek nakon pažljive provjere.
Zaglavlja uz to nisu jedino mjesto na kojem preglednik nudi zaštitu. Kolačići bi trebali nositi atribute Secure, HttpOnly i SameSite kako se sesije ne bi presretale preko nešifriranih veza ili skripti. Kako to postaviti u PHP-u, opisuje vodič o sesijama.
Postavljanje sigurnosnih zaglavlja u Nginxu
U Nginxu zaglavlja pripadaju u server blok pojedine web-stranice. Dodatak always osigurava da se šalju i na stranicama s pogreškama.
server {
# ...
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always;
add_header Content-Security-Policy-Report-Only "default-src 'self'; img-src 'self' data:; object-src 'none'; base-uri 'self'; frame-ancestors 'self'; form-action 'self'" always;
server_tokens off;
}
Posebnost Nginxa: ako location blok postavlja vlastite add_header naredbe, zaglavlja iz server bloka tamo se ne preuzimaju. Zato provjerite i podstranice i statične datoteke. Daljnje ojačavanje za tu kombinaciju opisuje Zaštita Nginxa s PHP-FPM-om.
Postavljanje sigurnosnih zaglavlja u Apacheu
Na Apacheu trebate modul mod_headers. Naredbe pripadaju u VirtualHost ili, ako nemate pristup, u .htaccess.
<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
Header always set X-Content-Type-Options "nosniff"
Header always set X-Frame-Options "SAMEORIGIN"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
Header always set Permissions-Policy "camera=(), microphone=(), geolocation=()"
Header always set Content-Security-Policy-Report-Only "default-src 'self'; object-src 'none'; base-uri 'self'; frame-ancestors 'self'"
</IfModule>
ServerTokens Prod
ServerSignature Off
ServerTokens i ServerSignature pripadaju u glavnu konfiguraciju. Sprječavaju da poslužitelj u odgovorima i stranicama s pogreškama navodi svoju točnu verziju. U php.ini isto za PHP postižete s expose_php = Off.
Postupno uvođenje Content-Security-Policy
Content-Security-Policy je najučinkovitije, ali i najzahtjevnije zaglavlje. Određuje iz kojih se izvora smiju učitavati skripte, stilovi, slike, fontovi i okviri. Ako se ubačena skripta naknadno učitava s tuđe domene, preglednik je blokira.
Moderne web-stranice često ugrađuju alate za analitiku, pružatelje plaćanja, usluge karata ili videe. Prestroga politika tada onesposobljava funkcije. Zato postupajte u koracima:
- Najprije započeti s
Content-Security-Policy-Report-Only. Preglednik prijavljuje povrede u konzoli za razvojne programere ili na zbirnu adresu, ali ništa ne blokira. - Zabilježiti sve potrebne izvore i ciljano ih odobriti, umjesto da se koriste paušalni zamjenski znakovi.
- Inline skripte postupno izdvojiti u datoteke ili opremiti nonceovima kako bi se moglo odustati od
'unsafe-inline'. - Tek nakon probne faze bez neočekivanih poruka prijeći na
Content-Security-Policy.
CSP dopunjuje uredan escaping u kodu, ali ga ne zamjenjuje. Kako ispravno osigurati izlaze u PHP-u, nalazi se u vodiču Sprječavanje cross-site scriptinga u PHP-u.
Provjera zaglavlja i izbjegavanje tipičnih pogrešaka
Nakon svake promjene provjerite stižu li zaglavlja zaista. To ide bez dodatnih alata s curl:
# Testirati konfiguraciju i ponovno učitati
nginx -t && systemctl reload nginx
# Prikazati zaglavlja početne stranice i jedne statične datoteke
curl -sI https://www.example.de/ | grep -iE 'strict|content-security|x-content|x-frame|referrer|permissions|server'
curl -sI https://www.example.de/favicon.ico | grep -iE 'strict|x-content'
Tipične pogreške su dvostruko postavljena zaglavlja kad web-poslužitelj i aplikacija šalju ista zaglavlja, CDN ispred koji uklanja ili prepisuje zaglavlja te zaglavlja koja se pojavljuju samo na početnoj stranici, ali ne kod preusmjeravanja ili stranica s pogreškama. Provjerite i nakon ažuriranja CMS-a ili sigurnosnih ekstenzija jesu li se zaglavlja promijenila.
Zato odredite jedno mjesto na kojem se zaglavlja održavaju, najbolje web-poslužitelj ili usluga ispred. Mnoge CMS ekstenzije također nude postavke za sigurnosna zaglavlja. To je zgodno, ali lako vodi do dvostrukih ili proturječnih podataka ako zaglavlja dodatno postavlja i poslužitelj. Za pojedinačne testove prikladni su i alati za razvojne programere u pregledniku: u kartici mreže uz svaki zahtjev vidite zaglavlja odgovora, a konzola prikazuje povrede Content-Security-Policy.
Kako PHP SOS konkretno pomaže?
- Provjeravamo aktualna zaglavlja svih Vaših web-stranica, i iza CDN-a i proxyja, te pokazujemo praznine i proturječja.
- Zaglavlja postavljamo središnje u web-poslužitelju u okviru ojačavanja poslužitelja i testiramo početnu stranicu, podstranice i stranice s pogreškama.
- Content-Security-Policy uvodimo u načinu Report-Only, analiziramo poruke i nakon dogovora je aktiviramo.
- Gdje izmjene koda nisu odmah moguće, zaštitu dopunjujemo WAF pravilima i virtualnim zakrpanjem.
Česta pitanja
Što su sigurnosna zaglavlja?
Sigurnosna zaglavlja dodatni su podaci u odgovoru web-poslužitelja. Pregledniku primjerice kažu da stranicu smije učitati samo preko HTTPS-a, da ne smije izvršavati strane skripte ili da stranicu ne smije prikazati u tuđim okvirima. Štite ponajprije posjetitelje.
Štite li sigurnosna zaglavlja od PHP2Shella?
Ne. PHP2Shell je ranjivost u PHP-u na poslužitelju, a zaglavlja djeluju u pregledniku posjetitelja. Protiv PHP2Shella pomaže ažuriranje na ispravljenu verziju PHP-a i ponovno pokretanje svih workera. Zaglavlja su dopunsko ojačavanje za druge vrste napada.
Može li Content Security Policy pokvariti moju web-stranicu?
Da, prestroga politika blokira potrebne skripte, fontove ili ugrađene sadržaje. Zato se najprije uvodi u načinu Report-Only, analiziraju se poruke i tek se tada prelazi na provedbu.
Je li X-XSS-Protection još smislen?
Ne. Aktualni preglednici više ne analiziraju to zaglavlje, a preporuka je izostaviti ga ili postaviti na 0. Zaštitu od cross-site scriptinga pružaju uredan escaping u kodu i Content Security Policy.