HSTS a bezpečnostní hlavičky pro Váš web
Při každé stránce odesílá Váš webový server 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. O tom si přečtěte v článcích Aktivace, obnovení a řešení problémů s 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ý okamžik: první požadavek přes http je 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) tento problém ř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č sám převede adresu na https, ještě než se cokoliv odešle po síti. Hlavičku HSTS přijatou 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 počítá alespoň jeden rok (31536000) jako dostatečný. |
includeSubDomains | Platí také pro všechny subdomény, jako shop.vasedomena.cz a mail.vasedomena.cz. |
preload | Žádáte o zařazení do seznamu zabudovaného v prohlížečích (hstspreload.org). Pak je chráněna i úplně první návštěva. K tomu je potřeba mimo jiné jeden rok, includeSubDomains a https na všech subdoménách. Odstranění ze seznamu trvá dlouho. |
max-age=0 | Při příští návštěvě přes https smaže zapamatovanou instrukci. |
includeSubDomains to platí i pro každou subdoménu, například starou stránku kamery nebo tiskárny bez certifikátu. Postupujte proto krok za krokem: začněte s krátkým max-age, například jeden den (86400), zkontrolujte, zda vše funguje, a postupně zvyšujte až na jeden rok.HSTS u WebOké
Na většině našich serverů odesílá webový server HSTS standardně pro každý web otevřený přes https: Strict-Transport-Security: max-age=31536000. To je jeden rok, bez includeSubDomains a bez preload. Nemusíte proto nic dělat. Na několika serverech to standardně zapnuté není, tam si to zapnete sami. Zda Váš web již HSTS odesílá a s jakým max-age, zjistíte ve vývojářských nástrojích prohlížeče nebo v testu internet.nl (viz níže).
Přepínač HSTS v DirectAdmin
V DirectAdmin přejděte na Domény a klikněte na název domény. Je-li zapnuto Zabezpečené SSL připojení, uvidíte u HSTS přepínač Zapnout HTTP Strict Transport Security. Poté klikněte na Upravit, aby se nastavení uložilo. Jak postupovat krok za krokem, si přečtěte v článku Vždy přesměrovávat návštěvníky na https.
Pokud Váš web již HSTS odesílá, přepínač nepotřebujete. Zapněte ho pouze tehdy, pokud Váš web HSTS ještě neodesílá. Nastavte HSTS pouze na jednom místě: v DirectAdmin nebo v souboru .htaccess, nikoliv na obou. Dostane-li prohlížeč dvě hlavičky HSTS, použije pouze tu první.
Ostatní bezpečnostní hlavičky
| Hlavička | Proti čemu | Hodnota, kterou začít |
|---|---|---|
X-Content-Type-Options | Prohlížeč sám odhaduje, co je soubor, čímž 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ě vloží Vaši stránku do rámce, takže návštěvníci nevědomky 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 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 počítá jako dobré pouze přísné hodnoty. |
Permissions-Policy | Určuje, které funkce prohlížeče smí Vaše stránka a vložené rámce používat, například kameru, mikrofon a polohu. | camera=(), microphone=(), geolocation=() tyto tři funkce vypne. Používá-li Váš web některou z těchto funkcí, vynechejte ji. |
Content-Security-Policy (úplná) | Omezuje, odkud smí být načítány skripty, styly a obrázky. Díky tomu je vložení škodlivých skriptů (XSS) mnohem obtížnější. | Individuální nastavení pro každý web. Vyhněte se hodnotám unsafe-inline, unsafe-eval a zástupným znakům (wildcards). |
Nastavení v souboru .htaccess
Vložte tyto řádky na začátek souboru .htaccess ve složce public_html Vaší domény. Nejprve si vytvořte kopii souboru.
<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 Váš web ještě neodesílá HSTS (viz výše): # Header always set Strict-Transport-Security "max-age=31536000" </IfModule>
Přidejte includeSubDomains teprve ve chvíli, kdy máte jistotu, že každá subdoména má https. Používáte-li WordPress, můžete hlavičky nastavit také pomocí pluginu. Vyberte známý plugin, který je stále aktualizován, a nastavte každou hlavičku pouze na jednom místě: v pluginu nebo v souboru .htaccess.
Content-Security-Policy-Report-Only. Ta nic neblokuje, ale v konzoli prohlížeče zobrazí, co by bylo zablokováno. V případě pochybností to nechte na svém webovém vývojáři, nebo začněte pouze s frame-ancestors.Testování
- Internet.nl: zadejte svou doménu do webového testu 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 Odpovědní hlavičky (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é změně zkontrolujte, zda Váš web, formuláře a platební stránka stále fungují. Zároveň udržujte svůj CMS, pluginy a šablony aktualizované. Viz Zabezpečení wp-login.php ve WordPressu.
Další čtení
- MDN: Strict-Transport-Security (anglicky)
- MDN: Content-Security-Policy (anglicky)
- MDN: Permissions-Policy (anglicky)
- Seznam HSTS preload (anglicky)
