HSTS a bezpečnostní hlavičky pro Váš web
U každé stránky Váš webový server odesílá hlavičky (headers): krátké řádky s instrukcemi pro prohlížeč. Částečně určují, jak bezpečně prohlížeč s Vaším webem zachází. Zde se dozvíte, co je HSTS, jaké další bezpečnostní hlavičky existují a jak je nastavit a otestovat.
Nejprve musí mít Váš web funkční certifikát a přesměrovávat návštěvníky na https. To si přečtete v článcích Aktivace, obnovení a řešení problémů se SSL certifikátem a Povinné přesměrování návštěvníků na https.
Co dělá HSTS?
Přesměrování na https má jeden slabý moment: první požadavek přes http jde ještě nešifrovaně. Někdo ve stejné síti, například na veřejné wifi, může tento požadavek zachytit. HSTS (HTTP Strict Transport Security) toto řeší. Váš web přes https odesílá tuto hlavičku:
Strict-Transport-Security: max-age=31536000
Prohlížeč si pak zapamatuje, že Váš web smí otevírat pouze přes https. Zadá li návštěvník později http://, prohlížeč z toho sám udělá https, ještě předtím, než cokoli projde sítí. Hlavičku HSTS, která přijde přes obyčejné http, prohlížeč ignoruje.
| Součást | Význam |
|---|---|
max-age | Jak dlouho si to prohlížeč pamatuje, v sekundách. Test internet.nl považuje za dostatečný alespoň rok (31536000). |
includeSubDomains | Platí také pro všechny subdomény, například shop.vasedomena.cz a mail.vasedomena.cz. |
preload | Žádáte o zařazení do seznamu, který je zabudovaný v prohlížečích (hstspreload.org). Pak je chráněna i úplně první návštěva. K tomu je mimo jiné potřeba rok, includeSubDomains a https na všech subdoménách. Odstranění ze seznamu trvá dlouho. |
max-age=0 | Smaže zapamatovanou instrukci, při příští návštěvě přes https. |
includeSubDomains to platí i pro každou subdoménu, například starou stránku kamery nebo tiskárny bez certifikátu. Postupujte proto postupně: začněte s krátkým max-age, například jeden den (86400), zkontrolujte, zda vše funguje, a postupně navyšujte až na rok.Přepínač HSTS v DirectAdminu
V DirectAdminu přejděte do sekce Domains a klikněte na název své domény. Je li zapnuté Secure SSL Connection, uvidíte u HSTS přepínač Enable HTTP Strict Transport Security. Poté klikněte na Save, čímž nastavení uložíte. Jak to probíhá krok za krokem, přečtete si v článku Vždy přesměrovat návštěvníky na https.
Chcete li zjistit, jaké max-age Váš web odesílá, podívejte se do vývojářských nástrojů svého prohlížeče nebo do testu internet.nl (viz níže). HSTS nastavujte pouze na jednom místě: v DirectAdminu nebo v souboru .htaccess, nikoli na obou. Dostane li prohlížeč dvě hlavičky HSTS, použije pouze tu první.
Další bezpečnostní hlavičky
| Hlavička | Proti čemu | Hodnota pro začátek |
|---|---|---|
X-Content-Type-Options | Prohlížeč si sám hádá, čím soubor je, kvůli čemuž může být nahraný "obrázek" spuštěn jako skript. | nosniff (jediná platná hodnota) |
Content-Security-Policy: frame-ancestors nebo X-Frame-Options | Clickjacking: jiný web neviditelně načte Vaši stránku do rámce (frame), takže návštěvníci nepozorovaně klikají na Vaše tlačítka. | frame-ancestors 'self', nebo starší hlavička X-Frame-Options: SAMEORIGIN |
Referrer-Policy | Při kliknutí na jiný web prohlížeč odesílá adresu předchozí stránky, někdy i s vyhledávaným výrazem nebo číslem objednávky. | strict-origin-when-cross-origin, nebo přísnější same-origin či no-referrer. Internet.nl uznává za vyhovující pouze přísné hodnoty. |
Permissions-Policy | Určuje, které funkce prohlížeče smí Vaše stránka a vložené rámce využívat, například kameru, mikrofon a polohu. | camera=(), microphone=(), geolocation=() tyto tři funkce vypne. Používá li Váš web některou z nich, vynechejte ji. |
Content-Security-Policy (úplná) | Omezuje, odkud smí skripty, styly a obrázky načítat. Díky tomu je vložení škodlivých skriptů (XSS) mnohem obtížnější. | Řešení na míru podle webu. Vyhněte se hodnotám unsafe-inline, unsafe-eval a zástupným znakům. |
Nastavení v .htaccess
Vložte tyto řádky na začátek souboru .htaccess ve složce public_html Vaší domény. Nejprve si soubor 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=()" # Pouze pokud je přepínač HSTS v DirectAdminu vypnutý: # Header always set Strict-Transport-Security "max-age=31536000" </IfModule>
includeSubDomains přidejte až ve chvíli, kdy si budete jisti, že každá subdoména má https. Používáte li WordPress, můžete hlavičky nastavit také pomocí pluginu. Zvolte známý plugin, který je stále aktualizovaný, a každou hlavičku nastavte pouze na jednom místě: buď v pluginu, nebo v souboru .htaccess.
Content-Security-Policy-Report-Only. Ta nic neblokuje, ale v konzoli prohlížeče ukáže, co by bylo zablokováno. V případě pochybností to nechte na svém tvůrci webu, nebo začněte pouze s frame-ancestors.Testování
- Internet.nl: zadejte svou doménu do testu webu na internet.nl.
- Váš prohlížeč: otevřete svůj web, stiskněte F12 (nebo zvolte Prozkoumat), přejděte na kartu Síť (Network), znovu načtěte stránku a klikněte na první požadavek. Pod Hlavičky odpovědi (Response Headers) uvidíte vše, co Váš server odesílá.
- Příkazová řádka:
curl -sI https://vasedomena.cz/zobrazí hlavičky.
Po každé úpravě zkontrolujte, zda Váš web, formuláře a platební stránka stále fungují. Kromě toho udržujte svůj CMS, pluginy a šablony aktuální. Viz Zabezpečení wp-login.php ve WordPressu.
Doporučené čtení
- MDN: Strict-Transport-Security (anglicky)
- MDN: Content-Security-Policy (anglicky)
- MDN: Permissions-Policy (anglicky)
- Seznam HSTS preload (anglicky)
