Helmet (Koa) bezpečnostní hlavičky

Helmet logo

Koa-helmet je Helmet wraper používaný Express.js. Zajišťuje důležité bezpečnostní http hlavičky. Vlastní koa-helmet má na GitHubu 532 hvězd a originál, který pochází z Express.js má 7 tisíc hvězd.
Helmet nabízí 14 bezpečnostních middlewaových funkcí:

Content Security Policy

Implicitně v Helmet není zahrnuto. Dokáže weby a uživatele ochránit před útoky typu Cross-site scripting (XSS) a data injection. Pomocí tohoto nastavení určíme z jakých zdrojů může stránka načítat zdroje. Seznam direktiv tohoto příkazu najdeme zde: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy Podrobný český návod najdeme zde: https://www.root.cz/clanky/bezpecnejsi-web-s-hlavickou-content-security-policy/ Ve stručnosti  CSP může být velkým pomocníkem proti útokům XSS, data injection a dokáže zabránit i únikům dat o uživateli pomocí nešifrovaného spojení. Pokud je to tedy možné, doporučuji CSP implementovat. Na druhou stranu je dobré si uvědomit, že CSP je plně kontrolováno prohlížečem a odehrává se vždy na straně klienta. Ten, pokud bude používat prohlížeč, který není podporovaný, účinky CSP ho minou. Proto se vždy pokuste všem těmto bezpečnostním hrozbám zabránit na straně serveru a CSP berte pouze jako takovou zálohu, pokud by primární linie obrany nestačila.

// Příklad použití
const helmet = require('helmet')

app.use(helmet.contentSecurityPolicy({
  directives: {
    defaultSrc: ["'self'"],
    styleSrc: ["'self'", 'maxcdn.bootstrapcdn.com']
  }
}))

X-Permitted-Cross-Domain-Policies

Implicitně v Helmet není zahrnuto. Hlavička X-Permitted-Cross-Domain-Policies byla vytvořena pro Adobe Flash Player nebo Adobe Acrobat, ale je určena i pro jiné programy pracující se soubory flash a pdf. Pravidla pro tyto klienty jsou mezidoménově definována v souboru crossdomain.xml.

<!-- Příklad souboru crossdomain.xml -->
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
    <site-control permitted-cross-domain-policies="all"/>
    <allow-access-from domain="*"/>
</cross-domain-policy>
// Implementace X-Permitted-Cross-Domain-Policies
const helmet = require('helmet')

app.use(helmet.permittedCrossDomainPolicies())

DNS Prefetch Control

Tato záhlaví je součástí výchozího balíčku Helmet. Umožňuje zakázat předběžné načítání DNS prohlížeče nastavením DNS Prefetch Control. Většina prohlížečů podporuje vypnutí, ale DNS stejně nenačítají i v zapnutém stavu.

const helmet = require('helmet')

// Nastavení "X-DNS-Prefetch-Control: off".
app.use(helmet.dnsPrefetchControl())

Expect-CT

Implicitně v Helmet není zahrnuto. Hlavička umožňuje kontrolovat dodržování souladu s Certificate Transparency (CT) u certifikátu webových stránek. Hlavním úkolem Expect-CT headeru je zajistit kontrolu shody s CT a umožnit prohlížečům odesílat reporty, pokud mají problémy s ověřením certifikátu webových stránek. Přesné nastavení najdeme zde: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Expect-CT

const expectCt = require('expect-ct')

// Sets Expect-CT: max-age=123
app.use(expectCt({ maxAge: 123 }))

// Sets Expect-CT: enforce; max-age=123
app.use(expectCt({
  enforce: true,
  maxAge: 123
}))

// Sets Expect-CT: enforce; max-age=30; report-uri="http://example.com/report"
app.use(expectCt({
  enforce: true,
  maxAge: 30,
  reportUri: 'http://example.com/report'
}))

Feature-Policy

Implicitně v Helmet není zahrnuto. Feature-Policy hlavička umožňuje vývojářům webu povolovat, zakazovat a upravovat vlastnosti a chování některých rozhraní API a webových funkcí v prohlížeči. Tato hlavička je poměrně nová a její použití není v prohlížečích prozatím široce podporováno. Webové prohlížeče mají mnoho různých funkcí, od vibrací přes zobrazení na celou obrazovku až po přístup k mikrofonu. I když některé z nich mohou být užitečné, možná nebudete chtít používat všechny a možná nebudete chtít používat žádné skripty třetích stran, které používáte. Aktuálně podporované vlastnosti u prohlížečů najdeme zde: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Feature-Policy#Browser_compatibility

const helmet = require('helmet')

app.use(helmet.featurePolicy({
  features: {
    fullscreen: ["'self'"],
    vibrate: ["'none'"],
    payment: ['example.com'],
    syncXhr: ["'none'"]
  }
}))

Hlavička ochraňuje uživatele od zneužití pomocí tzv. „clickjackingu“, kdy útočník na podvodné stránce vloží cizí stránku a nad ní umístí průhlednou vrstvu s vlastními událostmi a odkazy o kterých návštěvník netuší.

X-Frame-Options

Tato záhlaví je součástí výchozího balíčku Helmet. Použití X-Frame-Options preventivně brání zneužití vlastního obsahu na cizích www stránkách. Například nechceme stránky zobrazovat na jiných webech v rámu, kde bude nevhodný obsah, reklama atd. Konkrétní nastavení hlavičky: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options

const helmet = require('helmet')
// je povoleno zobrazovat stránku v rámu na vlastním webu. Pokud by bylo uvedeno { action: 'deny' }, stránka nikdy nesmí být zobrazena v rámu. Pomocí ALLOW-FROM https://domena.cz může být pouze vloženo do rámu na uvedené doméně

app.use(helmet.frameguard({ action: 'sameorigin' }))

X-Powered-By

Tato záhlaví je součástí výchozího balíčku Helmet.. Hlavička odstraní implicitní X-Powered-By, které útočníkům odhaluje technologie, které pohání náš web.

const helmet = require('helmet')
app.use(helmet())
app.disable('x-powered-by')

// možné nastavení falešné informace pro zmatení útočníka
app.use(helmet.hidePoweredBy({ setTo: 'PHP 4.2.0' }))

Strict-Transport-Security

Tato záhlaví je součástí výchozího balíčku Helmet. Vynutí u prohlížeče použít na stanovenou dobu v sekundách pro komunikaci s webem pouze protokol HTTPS.

const helmet = require('helmet')

// Sets "Strict-Transport-Security: max-age=5184000; includeSubDomains".
const sixtyDaysInSeconds = 5184000
app.use(helmet.hsts({
  maxAge: sixtyDaysInSeconds
}))

X-Download-Options

Tato záhlaví je součástí výchozího balíčku Helmet. Ve výchozím nastavení nám staré verze aplikace Internet Explorer umožňují tyto soubory HTML otevírat v kontextu vašeho webu, což znamená, že nedůvěryhodná stránka HTML by mohla v souvislosti s vašimi stránkami provádět útok.

const helmet = require('helmet')

// Sets "X-Download-Options: noopen".
app.use(helmet.ieNoOpen())

X-Content-Type-Options

Tato záhlaví je součástí výchozího balíčku Helmet. Pomáhá zabránit prohlížečům ve snaze uhodnout („čichat“) typ MIME, který může mít bezpečnostní důsledky. To se provádí nastavením X-Content-Type-Optionszáhlaví na nosniff.

const helmet = require('helmet')

// Sets "X-Content-Type-Options: nosniff".
app.use(helmet.noSniff())

Referrer-Policy

Implicitně v Helmet není zahrnuto.. Kontroluje a případně omezuje Referer hodnotu prohlížeče, která předává odkud uživatel přišel. Seznam možného omezení je zde: https://www.w3.org/TR/referrer-policy/#referrer-policies

const helmet = require('helmet')

// "Referrer-Policy: same-origin" - Záhlaví referrer bude odesláno pouze na stejnou doménu (same-origin), ale na jiné domény referrer nebude obsahovat žádné informace (no-referrer).
app.use(helmet.referrerPolicy({ policy: 'same-origin' }))

X-XSS-Protection

Skriptování napříč webem, zkráceně „XSS“, je způsob, jakým mohou útočníci převzít webové stránky. Cílem útoku XSS je získat kontrolu nad JavaScriptem v prohlížeči oběti. Jakmile to hacker udělá, je tu spousta ošklivých věcí, které mohou udělat: přihlásit své akce, vydávat se za vás, ukrást vaše ověřovací soubory cookie a mnohem více. Helmet XSS je relativně jednoduchý middleware, který nastaví X-XSS-Protection. Ve většině prohlížečů to nastaví na 1; mode=block. U starých verzí aplikace Internet Explorer ji nastaví tak, aby 0ji deaktivovala, protože u IE to může způsobit další škody.

const helmet = require('helmet')

// Nastaví "X-XSS-Protection: 1; mode=block".
app.use(helmet.xssFilter())

Zdroje

  • root.cz
  • koa-helmet
  • helmet
  • securityheaders.cz

Napsat komentář

Vaše emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *

*