Základní bezpečnostní HTTP hlavičky pro váš web

HTTP "security" headers jsou základním prvkem webové bezpečnosti. Když navštívíte jakoukoliv webovou stránku z vašeho prohlížeče, server vám společně s požadovaným obsahem pošle v odpovědi sadu HTTP hlaviček. Některé HTTP hlavičky říkají prohlížeči, jak se chovat při prohlížení webu. Správná konfigurace těchto hlaviček zajistí návštěvníkům mnohem bezpečnější prohlížení webové stránky a sníží riziko útoků proti nim.

Existuje celá řada HTTP hlaviček, kterých byste si měli být vědomi a pokud je to možné, doporučujeme je implementovat. Kontrola níže uvedených HTTP hlaviček také bývá prvním krokem během penetračního testu. Pojďme se na ně proto podívat blíže.

X-Frame-Options

HTTP hlavička X-Frame-Options říká prohlížeči, zde a za jakých okolností může konkrétní webovou stránku zobrazit v rámu. Samotné načtení stránky v iframe ještě nepředstavuje bezpečnostní riziko. Ovšem v určitých případech lze tuto funkcionalitu zneužít k různým útokům na klienta (např. clickjacking, podvodné hlasování v anketách, apod.).

Konkrétní nastavení má několik hodnot:

  • DENY

    • web nikdy není možné zobrazovat v iframe
  • SAMEORIGIN

    • web je možné zobrazit v iframe pouze na vlastní doméně
  • ALLOW-FROM https://tunasec.com

    • web je možné zobrazit v iframe pouze na povolených doménách

Ukázka konfigurace webového serveru:

Nginx add_header X-Frame-Options "DENY" always;

Apache Header always set X-Frame-Options "DENY"

V naprosté většině případů si vystačíte s hodnotou DENY, tedy zakázat možnost vkládání vaší webové stránky do iframe.

X-XSS-Protection

Hlavička X-XSS-Protection říká prohlížeči, zda a jak má použít vestavěný filtr proti XSS (Cross-Site Scripting) útokům. To se týkalo hlavně starších verzí Google Chrome, v současné době je doporučeno použít hlavičku CSP (Content-Security-Policy).

Konkrétní nastavení má několik hodnot:

  • 1; mode=block

    • při detekci XSS útoku prohlížeč zablokuje celou stránku
  • 1; report=

    • při detekci XSS se prohlížeč pokusí zablokovat pouze daný útok a zároveň odešle report
  • 1

    • při detekci XSS se prohlížeč pokusí zablokovat pouze daný útok
  • 0

    • XSS filter je vypnutý

Ukázka konfigurace webového serveru:

Nginx add_header X-XSS-Protection "1; mode=block" always;

Apache Header always set X-XSS-Protection "1; mode=block"

XSS Auditor původně představený v prohlížečích Chrome a Safari, měl pomoci zabránit běžným XSS útokům. V některých případech však způsoboval potíže a nebylo jej těžké obejít, dnes se tak používá více méně pro ochranu uživatelů používajících starší verze prohlížečů.

X-Content-Type-Options

Hlavička X-Content-Type-Options říká prohlížeči, aby respektoval MIME type hodnotu souborů podle hlavičky Content-Type a nezkoušel MIME type odhadnout na základě obsahu souboru. Zjednodušeně řešeno, prohlížeč bude interpretovat vzdálený JavaScript v HTML tagu script, pouze pokud načítaný soubor zasílat správnou hlavičku s Content-Type “application/javascript.

Konkrétní nastavení má pouze jednu hodnotu:

  • nosniff

    • Zakázání “content sniffingu” a interpretace souborů pouze podle MIME type (Content-Type).

Ukázka konfigurace webového serveru:

Nginx add_header X-Content-Type-Options "nosniff" always;

Apache Header always set X-Content-Type-Options "nosniff"

To zabrání útočníkům načítat a interpretovat například JavaScript schovaný v obrázku, který se podařilo nahrát na server. Efektivně tak uživatele ochrání před útoky pomocí tzv. polyglot souborů, které se tváří jako několik validních typů souborů současně.

Referrer-Policy

HTTP hlavička Referrer-Policy určuje, kolik informací o referreru (odeslaných prostřednictvím hlavičky Referer) by mělo být zahrnuto do requestů webového prohlížeče. Kromě hlavičky HTTP můžete toto pravidlo nastavit v HTML.

Konkrétní nastavení má několik hodnot:

  • no-referrer

    • Referer hlavička je vypnuta. Spolu s requesty se neposílají žádné informace.
  • no-referrer-when-downgrade

    • Když úroveň zabezpečení (SSL) zůstane stejná nebo se zlepší (HTTP → HTTPS), odešlete origin, cestu a řetězec dotazu v hlavičce Referer. Referer se neposíla v requestech na méně zabezpečené cíle (HTTPS → HTTP).
  • origin

    • Odesílá se pouze origin. Například URL https://example.com/?username=admin&pass=love odešle pouze https://example.com/.
  • origin-when-cross-origin

    • Při provádění požadavku v rámci stejneho originu na stejnou úroveň protokolu (SSL) odešlete origin, cestu a řetězec dotazu. Odesíla origin (pouze) pro requesty směřující z HTTPS → HTTP.
  • same-origin

    • Odesíla origin, cestu a řetězec dotazu pro požadavky v rámci stejného originu (domény). Neposílá Referer hlavičku při requestech na jiné domény.
  • strict-origin

    • Posílá (pouze) origin, při requestech v rámci stejné úrovně zabezpečení (HTTPS→HTTPS). Neposílá Referer hlavičku při requestech z HTTPS → HTTP.
  • strict-origin-when-cross-origin

    • Odesíla origin, cestu a řetězec dotazu pro požadavky v rámci stejného originu (domény). Při requestech na jiné domény (HTTPS → HTTPS) posíla pouze origin.
  • unsafe-url

    • Při provádění jakéhokoli požadavku, bez ohledu na zabezpečení, odešlete origin, cestu a řetězec dotazu.

Ukázka konfigurace webového serveru:

Nginx add_header Referrer-Policy "same-origin" always;

Apache Header always set Referrer-Policy "same-origin"

Referer může v určitých případech prozradit citlivé informace o uživatelích, například ID v URL adrese při přechodu návštěvníka z jedhoho webu na druhý. Ideálně by se tak měla tato informace předávat pouze v rámci jednoho originu.

Permissions-Policy

HTTP hlavička, která se původně jmenovala Feature-Policy, říka přohlížečí, jaké funkce může na webu používat. Například zakazuje přístup ke kameře a mikrofonu.

Konkrétní nastavení má několik hodnot:

    • Konkrétní funkcionalita, například (camera, microphone, geolocation, ...).
    • Několik hodnot, * - povolí, none / () použití zakáže.

Ukázka konfigurace webového serveru:

Nginx add_header Permissions-Policy "accelerometer=(), camera=(), geolocation=(), gyroscope=(), magnetometer=(), microphone=(), payment=(), usb=()" always;

Apache Header always set Permissions-Policy "accelerometer=(), camera=(), geolocation=(), gyroscope=(), magnetometer=(), microphone=(), payment=(), usb=()"

Konkretní funkce zavisí na verzi a typu webového prohlížeče, nastavení pak na konkrétních potřebách webového serveru. Je doporuřeno vypnout ty, které váš web nepotřebuje.

Strict-Transport-Security

Hlavička Záhlaví odpovědi HTTP Strict-Transport-Security (často zkráceně HSTS) umožňuje webovým serverům sdělit prohlížečům, že by k nim měl být přistupovat pouze pomocí HTTPS, namísto použití HTTP.

Konkrétní nastavení má několik hodnot:

  • max-age=

    • Čas v sekundách, kdy by si měl prohlížeč pamatovat, že k webu je možné přistupovat pouze pomocí protokolu HTTPS.
  • includeSubDomains

    • Pokud je zadán tento volitelný parametr, toto pravidlo platí také pro všechny subdomény webu.
  • preload

    • Prohlížeče se k vaší doméně nikdy nepřipojí pomocí nezabezpečeného připojení HTTP.

Ukázka konfigurace webového serveru:

Nginx add_header Strict-Transport-Security "max-age=31536000; includeSubdomains; preload" always;

Apache Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"

V současné době není důvod nepoužívat HTTPS a Strict-Transport-Security je další krok pro ochranu vašich uživatelů před útoky typu MITM/PITM (person-in-the-middle).

Content-Security-Policy

HTTP hlavička Content-Security-Policy umožňuje správcům webových stránek řídit zdroje, které může prohlížeč načíst pro danou stránku. Je tak možné například zakázat načítaní JavaScript z cizí domény.

Konkrétní nastavení má několik hodnot:

  • ( )

    • Directive je zdroj, se kterým web pracuje (CSS, JS, fonty, obrázky, ...).
    • Pro každý zdroj je možné ovlivnit, odkuj se může načítat (none - načítání zakázáno, self - načítání zdrojů pouze ze stejné domény, unsafe-inline - načítání inline zdrojů (CSS/JavaScript, který není ve vlastním souboru) ...

Ukázka konfigurace webového serveru:

Nginx add_header Content-Security-Policy "default-src 'self'" always;

Apache Header always set Content-Security-Policy "default-src 'self'"

Správné nastavení Content-Security-Policy je celkém složité, každopádně velice zvyšuje zabezpečení. Dokáže například eliminovat XSS (Cross-Site Scripting) útoky. Tato hlavička si zaslouží svůj vlastní článek, případně doporučujeme rovnou se obrátit na oficiální dokumentaci :)


Pro kontrolu vašeho webu a ověření správnosti konfigurace (včetně známky), můžete použít bezplatný nástroj securityheaders.com. Pro zlepšení bezpečnosti je můžete nastavit ještě dnes!

TunaSec.com HTTP headers


Zdroje:


Přidej se do našeho mailing listu

Chceš se dozvědět víc ohledně IT bezpečnosti? Tak si na správném místě.


TunaSec z.s.
Moldavská 527/3, Bohunice, 625 00 Brno
Phone  +420 774 071 231
Envelope  info@tunasec.com