Trumpai: Security header yra žiniatinklio serverio nurodymai naršyklei, saugantys lankytojus nuo atakų, tokių kaip Cross-Site Scripting, clickjacking ir nešifruoti ryšiai. Svarbiausios yra HSTS, Content-Security-Policy, X-Content-Type-Options, apsauga nuo svetimų rėmų, Referrer-Policy ir Permissions-Policy. Tai prasmingas sutvirtinimas, bet jis nepakeičia atnaujinimų serveryje.
Ką security header duoda ir ko neduoda
Su kiekvienu puslapio iškvietimu žiniatinklio serveris kartu su turiniu siunčia ir antraštes. Kai kurios iš jų valdo naršyklės saugumo funkcijas. Taip, pavyzdžiui, galima nustatyti, kad puslapis būtų įkeliamas tik per HTTPS arba kad naršyklė nevykdytų skriptų iš svetimų domenų.
Operatoriams svarbus vertinimas: antraštės visų pirma saugo lankytojus, pavyzdžiui, nuo sesijų pagrobimo ar suklastotų formų. Jos neuždaro pažeidžiamumų serveryje. PHP, CMS ar plėtinio spraga lieka, nesvarbu, kaip gerai nustatytos antraštės. Kartu su tvarkingu kodu jos vis dėlto gerokai apriboja daugelio klaidų pasekmes.
Svarbiausios security header apžvalga
| Antraštė | Paskirtis | Rekomendacija kaip pradžios taškas |
|---|---|---|
| Strict-Transport-Security (HSTS) | priverčia naudoti HTTPS būsimiems iškvietimams | max-age=31536000; includeSubDomains |
| Content-Security-Policy (CSP) | nustato leistinus skriptų, paveikslėlių, rėmų šaltinius | individualiai, pirmiausia kaip Report-Only |
| X-Content-Type-Options | neleidžia naršyklei spėlioti failų tipų | nosniff |
| X-Frame-Options arba CSP frame-ancestors | neleidžia įterpti į svetimus puslapius (clickjacking) | SAMEORIGIN arba frame-ancestors 'self' |
| Referrer-Policy | riboja, koks adresas perduodamas kitiems puslapiams | strict-origin-when-cross-origin |
| Permissions-Policy | išjungia naršyklės funkcijas, tokias kaip kamera ar vietos nustatymas | leisti tik reikalingas funkcijas |
HSTS nustatykite tik tada, kai visi subdomenai patikimai pasiekiami per HTTPS. Naršyklė nurodymą įsimena nurodytam laikui; klaidos tuomet iš karto atšaukti nepavyks. Prireikus pradėkite nuo trumpos trukmės ir po sėkmingų testų ją didinkite. Papildoma parinktis preload domeną visam laikui įrašo į naršyklių gamintojų sąrašus ir turėtų būti nustatoma tik kruopščiai patikrinus.
Antraštės taip pat nėra vienintelė vieta, kur naršyklė suteikia apsaugą. Slapukai turėtų turėti atributus Secure, HttpOnly ir SameSite, kad sesijų nebūtų galima pagrobti per nešifruotus ryšius ar skriptus. Kaip tai nustatyti PHP, aprašo sesijų vadovas.
Security header nustatymas Nginx
Nginx antraštės priklauso atitinkamos svetainės server blokui. Priedas always užtikrina, kad jos būtų siunčiamos ir klaidų puslapiuose.
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;
}
Nginx ypatumas: jei location blokas nustato savo add_header nurodymus, server bloko antraštės ten neperimamos. Todėl patikrinkite ir poputslapius bei statinius failus. Tolesnį šio derinio sutvirtinimą aprašo Nginx su PHP-FPM apsauga.
Security header nustatymas Apache
Apache serveryje reikia modulio mod_headers. Nurodymai priklauso VirtualHost arba, jei prie jo prieigos nėra, .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 ir ServerSignature priklauso pagrindinei konfigūracijai. Jie neleidžia serveriui atsakymuose ir klaidų puslapiuose nurodyti tikslios versijos. PHP to paties pasieksite php.ini su expose_php = Off.
Content-Security-Policy palaipsnis įvedimas
Content-Security-Policy yra veiksmingiausia, bet ir sudėtingiausia antraštė. Ji nustato, iš kokių šaltinių leidžiama įkelti skriptus, stiliaus lenteles, paveikslėlius, šriftus ir rėmus. Jei įterptas skriptas bandomas įkelti iš svetimo domeno, naršyklė jį blokuoja.
Šiuolaikinės svetainės dažnai įtraukia analizės įrankius, mokėjimų teikėjus, žemėlapių paslaugas ar vaizdo įrašus. Per griežta politika tuomet sustabdo funkcijas. Todėl veikite etapais:
- Pirmiausia pradėkite su
Content-Security-Policy-Report-Only. Naršyklė praneša apie pažeidimus kūrėjo konsolėje arba surinkimo adresu, bet nieko neblokuoja. - Užfiksuokite visus reikalingus šaltinius ir leiskite juos tikslingai, užuot naudoję bendrus pakaitos simbolius.
- Įterptinius skriptus palaipsniui perkelkite į failus arba pažymėkite nonce, kad būtų galima atsisakyti
'unsafe-inline'. - Tik po bandomojo laikotarpio be netikėtų pranešimų perjunkite į
Content-Security-Policy.
CSP papildo tvarkingą escaping kode, bet jo nepakeičia. Kaip PHP saugiai tvarkyti išvestį, aprašo vadovas Kaip užkirsti kelią Cross-Site Scripting PHP.
Antraščių patikra ir tipinių klaidų vengimas
Po kiekvieno pakeitimo patikrinkite, ar antraštės tikrai pasiekia. Tai galima padaryti be papildomų įrankių su curl:
# Išbandyti konfigūraciją ir perkrauti
nginx -t && systemctl reload nginx
# Parodyti pradžios puslapio ir statinio failo antraštes
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'
Tipinės klaidos yra dukart nustatytos antraštės, kai žiniatinklio serveris ir programa siunčia tas pačias antraštes, prieš tai esantis CDN, kuris antraštes pašalina ar perrašo, ir antraštės, kurios rodomos tik pradžios puslapyje, bet ne peradresavimuose ar klaidų puslapiuose. Be to, po CMS ar saugumo plėtinių atnaujinimų patikrinkite, ar antraštės nepasikeitė.
Todėl nustatykite vieną vietą, kur antraštės prižiūrimos, geriausia žiniatinklio serverį arba prieš jį esančią paslaugą. Daugelis CMS plėtinių taip pat turi saugumo antraščių nustatymus. Tai patogu, bet lengvai lemia dvigubus ar prieštaringus duomenis, jei papildomai antraštes nustato serveris. Atskiriems testams tinka ir naršyklės kūrėjo įrankiai: tinklo skirtuke prie kiekvienos užklausos matote atsakymo antraštes, o konsolė rodo Content-Security-Policy pažeidimus.
Kaip PHP SOS padeda konkrečiai?
- Tikriname visų jūsų svetainių dabartines antraštes, taip pat už CDN ir tarpinio serverio, ir parodome spragas bei prieštaravimus.
- Antraštes nustatome centralizuotai žiniatinklio serveryje pagal serverio sutvirtinimą ir išbandome pradžios puslapį, poputslapius ir klaidų puslapius.
- Content-Security-Policy įvedame Report-Only režimu, analizuojame pranešimus ir po suderinimo įjungiame vykdymą.
- Kur kodo pakeitimai nėra iš karto įmanomi, apsaugą papildome WAF taisyklėmis ir virtualiu pataisymu.
Dažni klausimai
Kas yra security header?
Security header yra papildomi žiniatinklio serverio atsakymo duomenys. Jie, pavyzdžiui, nurodo naršyklei puslapį įkelti tik per HTTPS, nevykdyti svetimų skriptų ar nerodyti puslapio svetimuose rėmuose. Jie visų pirma saugo lankytojus.
Ar security header saugo nuo PHP2Shell?
Ne. PHP2Shell yra pažeidžiamumas PHP serveryje, antraštės veikia lankytojo naršyklėje. Nuo PHP2Shell padeda atnaujinimas iki ištaisytos PHP versijos ir visų darbinių procesų paleidimas iš naujo. Antraštės yra papildomas sutvirtinimas kitoms atakų rūšims.
Ar Content-Security-Policy gali sugadinti mano svetainę?
Taip, per griežta politika blokuoja reikalingus skriptus, šriftus ar įterptą turinį. Todėl ją pirmiausia įveskite Report-Only režimu, išanalizuokite pranešimus ir tik tada perjunkite į vykdymą.
Ar X-XSS-Protection dar prasmingas?
Ne. Dabartinės naršyklės šios antraštės nebevertina, o rekomendacija yra jos atsisakyti arba nustatyti 0. Apsaugą nuo Cross-Site Scripting suteikia tvarkingas escaping kode ir Content-Security-Policy.