Lühidalt: Turvapäised on veebiserveri juhised brauserile, mis kaitsevad külastajaid rünnakute eest nagu Cross-Site-Scripting, Clickjacking ja krüpteerimata ühendused. Olulisimad on HSTS, Content-Security-Policy, X-Content-Type-Options, kaitse võõraste raamide vastu, Referrer-Policy ja Permissions-Policy. Need on mõistlik karastamine, kuid ei asenda uuendusi serveris.
Mida turvapäised annavad ja mida mitte
Iga lehepäringu korral saadab veebiserver sisu kõrval kaasa ka päised. Mõned neist juhivad brauseri turvafunktsioone. Nii saab näiteks määrata, et leht laaditakse ainult HTTPS-i kaudu või et brauser ei käivita skripte võõrastelt domeenidelt.
Haldajate jaoks on piiritlus oluline: päised kaitsevad eelkõige külastajaid, näiteks sessioonide kinnihaaramise või manipuleeritud vormide eest. Need ei sulge servri turvauke. Nõrkus PHP-s, sisuhaldussüsteemis või laienduses jääb alles, olenemata sellest, kui hästi päised on seatud. Koos puhta koodiga piiravad need aga paljude vigade tagajärgi oluliselt.
Olulisimad turvapäised ülevaates
| Päis | Eesmärk | Soovitus lähtepunktiks |
|---|---|---|
| Strict-Transport-Security (HSTS) | nõuab HTTPS-i tulevaste päringute jaoks | max-age=31536000; includeSubDomains |
| Content-Security-Policy (CSP) | määrab lubatud allikad skriptidele, piltidele, raamidele | individuaalne, esmalt Report-Only |
| X-Content-Type-Options | takistab brauseril failitüüpe arvamast | nosniff |
| X-Frame-Options või CSP frame-ancestors | takistab manustamist võõrastele lehtedele (Clickjacking) | SAMEORIGIN või frame-ancestors 'self' |
| Referrer-Policy | piirab, milline aadress edastatakse teistele lehtedele | strict-origin-when-cross-origin |
| Permissions-Policy | lülitab välja brauserifunktsioonid nagu kaamera või asukoht | lubada ainult vajalikud funktsioonid |
HSTS-i peaksite seadma alles siis, kui kõik alamdomeenid on usaldusväärselt HTTPS-i kaudu kättesaadavad. Brauser jätab juhise märgitud ajaks meelde; viga ei saa siis kohe tagasi võtta. Alustage vajaduse korral lühikese kehtivusajaga ja pikendage seda pärast edukaid teste. Lisavalik preload kannab domeeni püsivalt brauseritootjate nimekirjadesse ja seda tuleks seada ainult pärast hoolikat kontrolli.
Päised ei ole ka ainus koht, kus brauser kaitset pakub. Küpsistel peaksid olema atribuudid Secure, HttpOnly ja SameSite, et sessioone ei saaks krüpteerimata ühenduste ega skriptide kaudu kätte saada. Kuidas seda PHP-s seada, kirjeldab sessioonide juhend.
Turvapäised Nginxis seada
Nginxis kuuluvad päised vastava veebisaidi server-plokki. Lisand always tagab, et need saadetakse ka vealehtede korral.
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;
}
Nginxi eripära: kui location-plokk seab oma add_header käsud, ei võeta server-plokis olevaid päiseid seal üle. Kontrollige seetõttu ka alamlehti ja staatilisi faile. Selle kombinatsiooni edasist karastamist kirjeldab Nginxi ja PHP-FPM-i turvamine.
Turvapäised Apache'is seada
Apache'is vajate moodulit mod_headers. Käsud kuuluvad VirtualHost'i või, kui sellele juurdepääsu ei ole, faili .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 ja ServerSignature kuuluvad põhiseadistusse. Need takistavad, et server nimetaks vastustes ja vealehtedel oma täpset versiooni. Failis php.ini saavutate sama PHP jaoks käsuga expose_php = Off.
Content-Security-Policy järk-järgult kasutusele võtta
Content-Security-Policy on kõige tõhusam, kuid ka kõige nõudlikum päis. See määrab, millistest allikatest tohib skripte, laadilehti, pilte, fonte ja raame laadida. Kui sissetoodud skript laaditakse võõralt domeenilt, blokeerib brauser selle.
Kaasaegsed veebisaidid integreerivad sageli analüüsitööriistu, maksepakkujaid, kaarditeenuseid või videoid. Liiga range poliitika pidurdab siis funktsioone. Toimige seetõttu etappidena:
- Alustage esmalt päisega
Content-Security-Policy-Report-Only. Brauser teatab rikkumistest arendajakonsoolis või kogumisaadressile, kuid ei blokeeri midagi. - Koguge kokku kõik vajalikud allikad ja lubage need sihipäraselt, selle asemel et kasutada üldisi metamärke.
- Viige sisseehitatud skriptid järk-järgult faili(desse) või varustage need nonce'idega, et saaks
'unsafe-inline'-ist loobuda. - Lülituge alles pärast testperioodi ilma ootamatute teadeteta üle päisele
Content-Security-Policy.
CSP täiendab puhast põgenemist (escaping) koodis, kuid ei asenda seda. Kuidas väljundeid PHP-s õigesti turvata, on kirjas juhendis Cross-Site-Scriptingu vältimine PHP-s.
Päiste kontroll ja tüüpiliste vigade vältimine
Pärast iga muudatust peaksite kontrollima, kas päised tegelikult kohale jõuavad. See käib ilma lisatööriistadeta käsuga curl:
# Seadistust testida ja uuesti laadida
nginx -t && systemctl reload nginx
# Avalehe ja staatilise faili päiste kuvamine
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'
Tüüpilised vead on topelt seatud päised, kui veebiserver ja rakendus saadavad samu päiseid, eelnev CDN, mis päiseid eemaldab või üle kirjutab, ning päised, mis ilmuvad ainult avalehel, kuid mitte ümbersuunamistel või vealehtedel. Kontrollige lisaks pärast sisuhaldussüsteemi või turvalaienduste uuendusi, kas päised on muutunud.
Määrake seetõttu üks koht, kus päiseid hooldatakse, parim on veebiserver või eelnev teenus. Paljud sisuhaldussüsteemi laiendused pakuvad samuti turvapäiste seadeid. See on mugav, kuid viib kergesti topelt- või vastuoluliste andmeteni, kui lisaks seab päiseid ka server. Üksikuteks testideks sobivad ka brauseri arendajatööriistad: võrgu-vahekaardil näete iga päringu vastuse päiseid ja konsool näitab Content-Security-Policy rikkumisi.
Kuidas PHP SOS konkreetselt aitab?
- Kontrollime kõigi teie veebisaitide praeguseid päiseid, ka CDN-i ja proksi taga, ning näitame lünki ja vastuolusid.
- Seame päised tsentraalselt veebiserveris serveri karastamise raames ning testime avalehte, alamlehti ja vealehti.
- Võtame Content-Security-Policy kasutusele Report-Only-režiimis, analüüsime teateid ja lülitame selle pärast kooskõlastust jõustuma.
- Kus koodimuudatused ei ole kohe võimalikud, täiendame kaitset WAF-reeglite ja virtuaalse paikamisega.
Korduma kippuvad küsimused
Mis on turvapäised (Security Header)?
Turvapäised on veebiserveri vastuses olevad lisaandmed. Need ütlevad brauserile näiteks, et ta peab lehe laadima ainult HTTPS-i kaudu, mitte käivitama võõraid skripte või mitte kuvama lehte võõrastes raamides. Need kaitsevad eelkõige külastajaid.
Kas turvapäised kaitsevad PHP2Shelli eest?
Ei. PHP2Shell on turvaauk PHP-s serveris, päised toimivad külastaja brauseris. PHP2Shelli vastu aitab uuendus parandatud PHP versioonile ja kõigi töötajate taaskäivitamine. Päised on täiendav karastamine muude rünnakuliikide vastu.
Kas Content-Security-Policy võib mu veebisaidi rikkuda?
Jah, liiga range poliitika blokeerib vajalikke skripte, fonte või manustatud sisu. Seetõttu võetakse see esmalt kasutusele Report-Only-režiimis, hinnatakse teateid ja lülitatakse alles seejärel jõustamisele.
Kas X-XSS-Protection on veel mõistlik?
Ei. Praegused brauserid seda päist enam ei hinda ja soovitus on see ära jätta või seada väärtusele 0. Kaitset Cross-Site-Scriptingu vastu pakuvad puhas põgenemine (escaping) koodis ja Content-Security-Policy.