Tento článek patří do seriálu Security headers. Ostatní články seriálu:
- Security headers - Co jsou a jak na ně
- HTTPS nestačí, jak na HSTS a HPKP
- Bezpečnost a expirace sessions v PHP
- Content Security Policy
- Report URI - Správce reportů z prohlížeče
Proč používat HTTPS je snad jasné. Aby nikdo nemohl číst, či hůře měnit, data mezi klientem a serverem. Jenže pouze přidat k webu HTTPS certifikát nestačí. Je potřeba zabezpečené spojení vynutit, nastavit session cookie pouze pro šifrované spojení, zamezit mixed contentu a další.
Krok 1 - Certifikát, cookies a přesměrování
Jak na svůj web přidat HTTPS certifikáty je velmi odlišné hosting od hostingu, a určitě bude v jeho nápovědě. Tím to ale pouze začíná. Následně je důležité uživatele přesměrovat na HTTPS, protože to https:// na začátku nikdo psát nebude. Jednoduše to jde pomocí htaccess nebo middlewaru v použitém frameworku.
RewriteCond % off RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Důležité je vybrat typ přesměrování s kódem 301, tj permanentní, protože tyto informace si prohlížeč ukládá. Při dalším navštívení se již nebude dotazovat ani serveru a přesměrování provede okamžitě. Takže hned první komunikace již bude zabezpečená.
Jak je již popsáno v článku Zabezpečení session, je vhodné zakázat odesílání session cookie jinak než po zabezpečeném připojení. Takže hurá do toho
ini_set("session.cookie_secure", true);
Zablokovaný mixed content
Pokud je web načten přes HTTPS, prohlížeče budou blokovat načítání po nezabezpečeném připojení. Proto je nutné všechny obrázky, CSS i JS soubory apod. načítat také pouze po HTTPS. A je úplně jedno, jestli to jsou soubory ze stejné, nebo úplně jiné domény.
Krok 2 - Pozor při nastavení hlavičky HSTS
HSTS je zkratka pro strict transport security, neboli vynucená zabezpečená komunikace. Pokud uživatel bude chtít navštívit stránku na HTTP, prohlížeč automaticky provede interní přesměrování na HTTPS s kódem 307. Je to podobné jako přesměrování s kódem 301, ale lepší. Navíc certifikát musí být podepsán známou certifikační autoritou.
POZOR! To ale není vše, do doby vypršení této hlavičky prohlížeč nedovolí přístup na nezabezpečené připojení, což může být velký problém. Pokud se například nepovede obnovit certifikát, nebo se na webu certifikát zruší, lidem se úplně znemožní přístup! Viz obrázek níže.
Pokud je na webu jen nepodepsaný certifikát, je zde možnost přijmout toto riziko a na web pokračovat. Pokud je ale nastaveno HSTS, už ani toto nepůjde.
Nastavit HSTS lze pomocí htaccess, PHP atd. podobně jako přesměrování s kódem 301. Do hlavičky se udává její životnost, jestli platí i pro subdomény a jestli se má web zapsat do preload listu. Důležité je nezapomenout, že www je také subdoména. Proto je velmi výhodné dodat includeSubdomains, pokud to žádný systém na subdoméně nerozbije. Je to ale trochu složitější a detailněji rozepsáno níže. I zde opět platí upozornění, dobře si rozmyslet, co se nastavuje a jak.
// Čisté HSTS pro aktuální doménu, vypršení je na dobu 1 roku header('strict-transport-security: max-age=31536000'); // Platí také pro všechny subdomény a web by se měl zapsat do preload listu header('strict-transport-security: max-age=31536000; includeSubdomains; preload');
HSTS Preload list
HSTS je fajn, ale není TOFU (trust on first use). Pokud stránku uživatel navštíví poprvé bez HTTPS a bude na infikované síti, lze mu přesměrování podvrhnout a neustále dodávat nešifrovaný obsah. Tomu zamezuje preload list přímo v prohlížeči, který i bez prvního navštívení informuje, že tento web má nastaveno strict transport security. Celý seznam preload listu pro Chrome a Firefox je na stránce Chromium v JSON formátu.
Problém subdomén i www. u HSTS
Pokud web běží na doméně www.xx.cz a odešle se HSTS i se zapnutým includeSubDomains, pravidlo se aplikuje pouze na www.xx.cz a *.www.xx.cz. Pokud někdo v budoucnu navštíví pouze xx.cz, může zde dojít k útoku, protože první požadavek nebude zabezpečen. Řešení je, a pro preload list to je nutné, prvně provést přesměrování na HTTPS, odeslat HSTS a až poté provést přesměrování na www subdoménu.
Pokud ale uživatel navštěvuje web s www a jednoho dne jej navštíví bez www, je zde stejný problém jako výše. Proto je zde další krok, přidání jednoho zdroje, který se bude načítat bez www a pro hlavní doménu nastaví i HSTS. Toto řešení používá mimo jiné Facebook a jmenuje se HSTS pixel.
Úprava 23.2. Vyčištění HSTS cache lze provést v Chrome na adrese
chrome://net-internals/#hsts
Potřebuji HSTS a zároveň Redirect 301?
Ano, určitě ano. Důvodů je hned několik:
- HSTS pokrývá celou doménu, případně i subdomény, redirect 301 pouze konkrétní URL. Pokud uživatel příště jde na jinou podstránku, první request je opět nešifrovaný, než přijde přesměrování. Protože redirect 301 je konkrétní URL na konkrétní URL. HSTS se postará o všechny možné URL.
- Přesto, že redirect 301 je velmi dlouho cachovaný v prohlížeči, při vymazání cache může dojít k jeho odstranění. HSTS je cachováno v jiné cache a k jeho vymazání jen tak nedojde. Případně po mnohem větší době.
- HSTS může být přednačteno v prohlížeči viz preload list.
- Pokud přijde HSTS hlavička na nezabezpečeném připojení, je ignorována. Proto pro první použití je nutné uživatele přesměrovat na HTTPS a až poté mu poslat HSTS.
Krok 3 - HPKP, nebo raději ne? - Určitě ne
Aktualizace 7.9. - Téměř od začátku roku 2018 Google prohlásil, že HPKP je deprecated, takže už ani nemá smysl o něm uvažovat a prostě nepoužívat.
Další ochrana bojuje proti podvržení certifikátu. V požadavku se tak posílají otisky klíčů, které prohlížeč přijme. Pokud by se náhodou otisk neshodoval, opět ke spojení nedojde. Zde je ale ještě větší riziko absolutního znepřístupnění webu. Stačí špatně vyměnit certifikáty, něco špatně nastavit a uživatel už se na web nepodívá. Osobně jsem tento krok na žádném webu neudělal a ani to v brzké době nemám v plánu.
Hlubší vysvětlení
Pro zájemce o detailnější vysvětlení jak a proč mít či nemít HSTS a HPKP tu jsou články na root.cz a jakpsatweb.cz
Osobní zkušenosti s HTTPS a certifikáty, HSTS i HPKP můžete sdílet v komentářích.
K tomuto článku již není možné přidávat další komentáře