HSTS a bezpečnostné hlavičky pre váš web
Pri každej stránke posiela váš webový server aj hlavičky: krátke riadky s pokynmi pre prehliadač. Do istej miery určujú, ako bezpečne prehliadač s vaším webom zaobchádza. Tu sa dozviete, čo je HSTS, aké ďalšie bezpečnostné hlavičky existujú a ako ich nastaviť a otestovať.
Najprv musí mať váš web funkčný certifikát a presmerovať návštevníkov na https. Viac sa dočítate v článkoch Aktivácia a obnovenie SSL certifikátu a riešenie problémov a Povinné presmerovanie návštevníkov na https.
Čo robí HSTS?
Presmerovanie na https má jedno slabé miesto: prvá požiadavka cez http ešte nie je šifrovaná. Niekto v tej istej sieti, napríklad na verejnej wifi, môže túto požiadavku zachytiť. HSTS (HTTP Strict Transport Security) tento problém rieši. Váš web posiela cez https túto hlavičku:
Strict-Transport-Security: max-age=31536000
Prehliadač si potom zapamätá, že váš web smie otvárať iba cez https. Ak návštevník neskôr zadá http://, prehliadač to sám zmení na https ešte predtým, ako niečo odošle do siete. Hlavičku HSTS prijatú cez obyčajné http prehliadač ignoruje.
| Časť | Význam |
|---|---|
max-age | Ako dlho si to prehliadač pamätá, v sekundách. Test na internet.nl považuje za dostatočný aspoň jeden rok (31536000). |
includeSubDomains | Platí aj pre všetky subdomény, napríklad shop.vasadomena.sk a mail.vasadomena.sk. |
preload | Žiadate o zaradenie do zoznamu zabudovaného v prehliadačoch (hstspreload.org). Potom je chránená aj úplne prvá návšteva. Podmienkou je okrem iného jeden rok, includeSubDomains a https na všetkých subdoménach. Vyradenie zo zoznamu trvá dlho. |
max-age=0 | Zapamätaný pokyn opäť vymaže, a to pri ďalšej návšteve cez https. |
includeSubDomains to platí aj pre každú subdoménu, napríklad starú stránku kamery alebo tlačiarne bez certifikátu. Preto postupujte postupne: začnite krátkym max-age, napríklad jeden deň (86400), overte, či všetko funguje, a hodnotu postupne zvyšujte až na jeden rok.HSTS vo WebOké
Na väčšine našich serverov webový server štandardne posiela HSTS pre každú webovú stránku otvorenú cez https: Strict-Transport-Security: max-age=31536000. Ide o jeden rok, bez includeSubDomains a bez preload. Nemusíte na to nič robiť. Na niekoľkých serveroch to štandardne zapnuté nie je; tam si to zapnete sami. Či váš web už HSTS posiela a s akým max-age, zistíte v nástrojoch pre vývojárov vo vašom prehliadači alebo v teste na internet.nl (pozri nižšie).
Prepínač HSTS v DirectAdmin
V DirectAdmin prejdite do časti Domains a kliknite na názov svojej domény. Ak je zapnuté Secure SSL, pri HSTS uvidíte prepínač Enable HTTP Strict Transport Security. Potom kliknite na Save, aby sa zmena uložila. Podrobný postup nájdete v článku Presmerovanie návštevníkov vždy na https.
Ak váš web už HSTS posiela, prepínač nepotrebujete. Zapnite ho iba vtedy, ak váš web HSTS ešte neposiela. HSTS nastavte iba na jednom mieste: v DirectAdmin alebo v .htaccess, nie na oboch. Ak prehliadač dostane dve hlavičky HSTS, použije iba prvú.
Ďalšie bezpečnostné hlavičky
| Hlavička | Proti čomu chráni | Hodnota na začiatok |
|---|---|---|
X-Content-Type-Options | Prehliadač sám háda, o aký súbor ide, takže nahratý „obrázok“ sa môže spustiť ako skript. | nosniff (jediná platná hodnota) |
Content-Security-Policy: frame-ancestors alebo X-Frame-Options | Clickjacking: iný web nenápadne načíta vašu stránku do rámca, takže návštevníci bez povšimnutia klikajú na vaše tlačidlá. | frame-ancestors 'self' alebo staršia hlavička X-Frame-Options: SAMEORIGIN |
Referrer-Policy | Pri kliknutí na iný web prehliadač pošle adresu predchádzajúcej stránky, niekedy aj s hľadaným výrazom alebo číslom objednávky. | strict-origin-when-cross-origin, prípadne prísnejšie same-origin alebo no-referrer. Internet.nl považuje za dobré iba prísne hodnoty. |
Permissions-Policy | Určuje, ktoré funkcie prehliadača môže vaša stránka a vložené rámce používať, napríklad kameru, mikrofón a polohu. | camera=(), microphone=(), geolocation=() tieto tri funkcie vypne. Ak váš web niektorú z nich používa, vynechajte ju. |
Content-Security-Policy (úplná) | Obmedzuje, odkiaľ sa smú načítavať skripty, štýly a obrázky. Výrazne tak sťažuje vloženie škodlivých skriptov (XSS). | Riešenie na mieru pre každý web. Vyhnite sa unsafe-inline, unsafe-eval a zástupným znakom. |
Nastavenie v .htaccess
Tieto riadky vložte na začiatok súboru .htaccess v priečinku public_html vašej domény. Najprv si súbor zálohujte.
<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=()" # Iba ak váš web ešte neposiela HSTS (pozri vyššie): # Header always set Strict-Transport-Security "max-age=31536000" </IfModule>
includeSubDomains pridajte až vtedy, keď máte istotu, že každá subdoména má https. Ak používate WordPress, hlavičky môžete nastaviť aj pomocou pluginu. Zvoľte známy plugin, ktorý sa stále aktualizuje, a každú hlavičku nastavte iba na jednom mieste: v plugine alebo v .htaccess.
Content-Security-Policy-Report-Only. Tá nič neblokuje, ale v konzole prehliadača ukáže, čo by sa zablokovalo. Ak si nie ste istí, nechajte to na svojho tvorcu webu alebo začnite iba s frame-ancestors.Na VPS s nginx alebo Caddy
Na VPS nepoužívate DirectAdmin a často ani .htaccess. Hlavičky potom nastavíte v konfigurácii svojho webového servera. Ani jeden z nich neposiela HSTS ani tieto hlavičky automaticky.
nginx: v bloku server pre port 443:
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;
Vďaka always sa hlavičky posielajú aj pri chybových stránkach. Pozor: ak samotný blok location obsahuje add_header, pravidlá z bloku server pre túto location už neplatia. V takom prípade ich tam zopakujte alebo ich umiestnite do samostatného súboru, ktorý všade vložíte pomocou include. Konfiguráciu otestujte príkazom nginx -t a načítajte príkazom systemctl reload nginx.
Caddy: v bloku vášho webu v súbore 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"
}
Zmenu načítajte príkazom systemctl reload caddy. Postup pri zostavení webu s nginx alebo Caddy nájdete v návode k VPS v článkoch nginx s certifikátom od Let's Encrypt a Caddy: webová stránka s automatickým https.
Testovanie
- Internet.nl: zadajte svoju doménu do testu webových stránok na internet.nl.
- Váš prehliadač: otvorte svoj web, stlačte F12 (alebo zvoľte Preskúmať), prejdite na kartu Sieť, znova načítajte stránku a kliknite na prvú požiadavku. V časti Hlavičky odpovede (Response Headers) uvidíte všetko, čo váš server posiela.
- Príkazový riadok:
curl -sI https://vasadomena.sk/zobrazí hlavičky.
Po každej zmene skontrolujte, či váš web, formuláre a platobná stránka stále fungujú. Okrem toho udržiavajte svoj CMS, pluginy a témy aktualizované. Pozrite si článok Zabezpečenie wp-login.php vo WordPresse.
Ďalšie čítanie
- MDN: Strict-Transport-Security (v angličtine)
- MDN: Content-Security-Policy (v angličtine)
- MDN: Permissions-Policy (v angličtine)
- Zoznam HSTS preload (v angličtine)
Chcete sa dozvedieť viac? Absolvujte bezplatný kurz Bezpečne online pre podnikateľov, lekciu 4.2 Váš web: https, HSTS a bezpečnostné hlavičky, alebo bezplatný kurz WordPressu, lekciu 7.4 Spevnenie webu: oprávnenia, hlavičky a bezpečnostné pluginy.
