HSTS ir saugumo antraštės Jūsų svetainei
Su kiekvienu puslapiu Jūsų žiniatinklio serveris siunčia antraštes (headers): trumpas eilutes su nurodymais naršyklei. Iš dalies nuo jų priklauso, kaip saugiai naršyklė elgiasi su Jūsų svetaine. Čia sužinosite, kas yra HSTS, kokių dar yra saugumo antraščių ir kaip jas nustatyti bei patikrinti.
Pirmiausia Jūsų svetainė turi turėti veikiantį sertifikatą ir nukreipti lankytojus į https. Apie tai skaitykite straipsniuose SSL sertifikato aktyvavimas, atnaujinimas ir problemų sprendimas ir Privalomas lankytojų nukreipimas į https.
Ką daro HSTS?
Nukreipimas į https turi vieną silpną vietą: pirmoji užklausa per http dar siunčiama nešifruota. Kas nors tame pačiame tinkle, pavyzdžiui, viešajame Wi-Fi, gali tą užklausą perimti. HSTS (HTTP Strict Transport Security) šią problemą išsprendžia. Jūsų svetainė per https siunčia šią antraštę:
Strict-Transport-Security: max-age=31536000
Tada naršyklė įsimena, kad Jūsų svetainę galima atidaryti tik per https. Jei lankytojas vėliau įves http://, naršyklė pati pakeis jį į https, dar prieš tai, kai kas nors bus išsiųsta tinklu. HSTS antraštę, gautą per paprastą http, naršyklė ignoruoja.
| Dalis | Reikšmė |
|---|---|
max-age | Kiek laiko naršyklė tai įsimena, sekundėmis. Internet.nl testas pakankamu laiko bent vienus metus (31536000). |
includeSubDomains | Taikoma ir visiems subdomenams, pavyzdžiui, shop.jusu-domenas.lt ir mail.jusu-domenas.lt. |
preload | Prašote įtraukti Jūsų domeną į naršyklėse įdiegtą sąrašą (hstspreload.org). Tada apsaugotas net pats pirmasis apsilankymas. Tam, be kita ko, reikia vienų metų, includeSubDomains ir https visuose subdomenuose. Pašalinimas iš sąrašo užtrunka ilgai. |
max-age=0 | Ištrina įsimintą nurodymą per kitą apsilankymą per https. |
includeSubDomains tas pats galioja ir kiekvienam subdomenui, pavyzdžiui, senam kameros ar spausdintuvo puslapiui be sertifikato. Todėl diekite palaipsniui: pradėkite nuo trumpo max-age, pavyzdžiui, vienos dienos (86400), patikrinkite, ar viskas veikia, ir laipsniškai didinkite iki vienų metų.HSTS pas WebOké
Daugelyje mūsų serverių žiniatinklio serveris pagal numatytuosius nustatymus siunčia HSTS kiekvienai svetainei, atidaromai per https: Strict-Transport-Security: max-age=31536000. Tai vieneri metai, be includeSubDomains ir be preload. Jums nieko daryti nereikia. Keliuose serveriuose tai pagal numatytuosius nustatymus neįjungta; ten tai įjungiate patys. Ar Jūsų svetainė jau siunčia HSTS ir su kokiu max-age, galite pamatyti naršyklės kūrėjo įrankiuose arba internet.nl teste (žr. toliau).
HSTS jungiklis DirectAdmin
DirectAdmin eikite į Domains ir spustelėkite savo domeno vardą. Jei įjungta Secure SSL, prie HSTS matysite jungiklį Enable HTTP Strict Transport Security. Tada spustelėkite Save, kad išsaugotumėte. Kaip tai padaryti žingsnis po žingsnio, skaitykite straipsnyje Lankytojų nukreipimas visada į https.
Jei Jūsų svetainė jau siunčia HSTS, jungiklio Jums nereikia. Įjunkite jį tik tada, kai Jūsų svetainė dar nesiunčia HSTS. Nustatykite HSTS vienoje vietoje: DirectAdmin arba .htaccess, bet ne abiejose. Jei naršyklė gauna dvi HSTS antraštes, ji naudoja tik pirmąją.
Kitos saugumo antraštės
| Antraštė | Nuo ko apsaugo | Pradinė reikšmė |
|---|---|---|
X-Content-Type-Options | Naršyklė pati ima spėlioti, koks tai failas, todėl įkeltas „paveikslėlis“ gali būti vykdomas kaip scenarijus. | nosniff (vienintelė galiojanti reikšmė) |
Content-Security-Policy: frame-ancestors arba X-Frame-Options | Clickjacking: kita svetainė nematomai įkelia Jūsų puslapį į rėmelį, kad lankytojai nepastebimai spaustų Jūsų mygtukus. | frame-ancestors 'self' arba senesnė antraštė X-Frame-Options: SAMEORIGIN |
Referrer-Policy | Paspaudus nuorodą į kitą svetainę, naršyklė perduoda ankstesnio puslapio adresą, kartais su paieškos žodžiu ar užsakymo numeriu. | strict-origin-when-cross-origin arba griežtesnės same-origin ar no-referrer. Internet.nl geromis laiko tik griežtąsias reikšmes. |
Permissions-Policy | Nustato, kurias naršyklės funkcijas gali naudoti Jūsų puslapis ir įterpti rėmeliai, pavyzdžiui, kamerą, mikrofoną ir vietą. | camera=(), microphone=(), geolocation=() išjungia šias tris. Jei Jūsų svetainė naudoja kurią nors iš šių funkcijų, jos nenurodykite. |
Content-Security-Policy (visa) | Riboja, iš kur galima įkelti scenarijus, stilius ir paveikslėlius. Taip įterptus kenkėjiškus scenarijus (XSS) panaudoti tampa daug sunkiau. | Pritaikoma kiekvienai svetainei atskirai. Venkite unsafe-inline, unsafe-eval ir pakaitos simbolių (wildcards). |
Nustatymas .htaccess faile
Įrašykite šias eilutes failo .htaccess pradžioje, savo domeno aplanke public_html. Prieš tai pasidarykite failo kopiją.
<IfModule mod_headers.c> Header always set X-Content-Type-Options "nosniff" Header always set Content-Security-Policy "frame-ancestors 'self'" Header always set Referrer-Policy "strict-origin-when-cross-origin" Header always set Permissions-Policy "camera=(), microphone=(), geolocation=()" # Tik jei Jūsų svetainė dar nesiunčia HSTS (žr. aukščiau): # Header always set Strict-Transport-Security "max-age=31536000" </IfModule>
Pridėkite includeSubDomains tik tada, kai esate tikri, kad kiekvienas subdomenas turi https. Jei naudojate WordPress, antraštes galite nustatyti ir įskiepiu. Pasirinkite žinomą įskiepį, kuris vis dar atnaujinamas, ir kiekvieną antraštę nustatykite vienoje vietoje: įskiepyje arba .htaccess.
Content-Security-Policy-Report-Only. Ji nieko neblokuoja, bet naršyklės konsolėje parodo, kas būtų užblokuota. Jei abejojate, patikėkite tai savo svetainės kūrėjui arba pradėkite tik nuo frame-ancestors.VPS su nginx arba Caddy
VPS serveryje nenaudojate DirectAdmin, o dažnai ir .htaccess. Tada antraštes nustatote savo žiniatinklio serverio nustatymuose. Nė vienas iš jų pats nesiunčia HSTS ar šių antraščių.
nginx: server bloke, skirtame 443 prievadui:
add_header Strict-Transport-Security "max-age=31536000" always; add_header X-Content-Type-Options "nosniff" always; add_header Content-Security-Policy "frame-ancestors 'self'" always; add_header Referrer-Policy "strict-origin-when-cross-origin" always;
Su always antraštės siunčiamos ir su klaidų puslapiais. Atkreipkite dėmesį: jei location bloke yra sava add_header eilutė, server bloko taisyklės tai location nebetaikomos. Tokiu atveju pakartokite jas ten arba įrašykite į atskirą failą, kurį visur įterpiate su include. Patikrinkite nustatymus komanda nginx -t ir įkelkite juos komanda systemctl reload nginx.
Caddy: savo svetainės bloke faile Caddyfile:
header {
Strict-Transport-Security "max-age=31536000"
X-Content-Type-Options "nosniff"
Content-Security-Policy "frame-ancestors 'self'"
Referrer-Policy "strict-origin-when-cross-origin"
}
Įkelkite pakeitimą komanda systemctl reload caddy. Apie svetainės kūrimą su nginx arba Caddy skaitykite VPS vadovo straipsniuose nginx su Let's Encrypt sertifikatu ir Caddy: svetainė su automatiniu https.
Tikrinimas
- Internet.nl: įveskite savo domeną svetainės teste adresu internet.nl.
- Jūsų naršyklė: atidarykite savo svetainę, paspauskite F12 (arba pasirinkite „Tikrinti“), eikite į skirtuką Tinklas (Network), iš naujo įkelkite puslapį ir spustelėkite pirmąją užklausą. Skiltyje Atsako antraštės (Response Headers) matysite viską, ką siunčia Jūsų serveris.
- Komandinė eilutė:
curl -sI https://jusu-domenas.lt/parodo antraštes.
Po kiekvieno pakeitimo patikrinkite, ar Jūsų svetainė, formos ir mokėjimo puslapis vis dar veikia. Be to, nuolat atnaujinkite savo TVS, įskiepius ir temas. Žr. WordPress wp-login.php apsauga.
Daugiau informacijos
- MDN: Strict-Transport-Security (anglų k.)
- MDN: Content-Security-Policy (anglų k.)
- MDN: Permissions-Policy (anglų k.)
- HSTS preload sąrašas (anglų k.)
Norite sužinoti daugiau? Išklausykite nemokamą kursą „Saugiai internete verslininkams“, pamoką 4.2 Jūsų svetainė: https, HSTS ir saugumo antraštės, arba nemokamą WordPress kursą, pamoką 7.4 Svetainės sustiprinimas: teisės, antraštės ir saugumo įskiepiai.
