Security header-ek: HSTS, CSP, X-Frame-Options és mások
· 7 perc olvasás
A backend egy erőd, de a védelem másik fele a böngészőben van. A HSTS, CSP és más header-ek blokkolják az XSS-t, clickjacking-et és MITM-et - ingyen.
Miért fontosak
Egy alkalmazás lehet a backend oldalon tökéletesen biztonságos, és mégis sebezhető marad a böngésző oldali támadásokkal szemben: cross-site scripting (XSS), clickjacking, protocol downgrade, MIME confusion. A security headerek a védelmet magába a böngészőbe tolják.
Strict-Transport-Security (HSTS)
HTTPS-t kényszerít minden jövőbeli látogatáshoz. Az első HTTPS-látogatás után a böngésző megjegyzi a domaint, és magától átírja bármelyik http:// linket https://-re, akkor is, ha a felhasználó rossz linkre kattint.
Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
max-age=63072000= 2 évig érvényesincludeSubDomains= a szabály minden aldomainre is vonatkozik; HTTPS-t kényszerít mindenhol, így ha van csak HTTP-n futó aldomained, pl.staging.example.com, az a böngészőben elérhetetlenné válikpreload= engedélyezi a felvételt a Chrome / Firefox / Safari beépített HSTS preload listájába
Figyelem:
A preload-dal ellátott HSTS eltávolítása a listáról 6+ hónapig tart. Ne add hozzá a preload-ot, amíg nem ellenőrizted, hogy a HTTPS stabilan működik minden aldomainen.
Content-Security-Policy (CSP)
A legerősebb, de egyben a legnehezebben beállítható header. Whitelistezi, honnan tölthet le a böngésző scripteket, stílusokat, képeket és iframe-eket. CSP nélkül egy támadó, aki <script> taget tud injektálni, tetszőleges JS-t futtathat; CSP-vel csak jóváhagyott forrásból származó kódot.
Content-Security-Policy: default-src 'self'; script-src 'self' 'sha256-...'; img-src 'self' data: https://cdn.example.com; style-src 'self' 'unsafe-inline'; frame-ancestors 'none'
Gyakori direktívák:
default-src 'self'= alapértelmezetten csak a saját domainemről engedj erőforrásokatscript-src= JS források (inline scriptekhez adj meg hash-t vagy nonce-t)style-src= CSS forrásokimg-src= képekconnect-src= AJAX, WebSocket, EventSourceframe-ancestors 'none'= senki sem ágyazhatja be az oldalt iframe-be (jobb, mint az X-Frame-Options)report-uri /csp-report= a böngésző minden megsértésnél JSON-t küld (te a backendben elkapod és logolod)- Megjegyzés: a
report-urima már deprecated - areport-to-t támogató böngészők figyelmen kívül hagyják. A modern megoldás areport-todirektíva plusz egy különReporting-Endpointsfejléc; areport-uri-t hagyd meg csak fallbacknek a Firefoxhoz, amely areport-to-t még nem támogatja.
X-Frame-Options
A frame-ancestors régebbi alternatívája. Megakadályozza a clickjackinget, amikor a támadó beágyazza az oldaladat iframe-ként, és láthatatlan gombokkal takarja le.
X-Frame-Options: DENY
Értékek: DENY (senki), SAMEORIGIN (csak a saját domainem), ALLOW-FROM uri (deprecated).
X-Content-Type-Options
X-Content-Type-Options: nosniff
Kikapcsolja a MIME sniffinget, így a böngésző tiszteletben tartja a szerver által visszaadott Content-Type-ot. Enélkül a támadó feltölthet rossz típusú fájlt (pl. képet, ami valójában scriptet tartalmazó HTML), és a böngésző weboldalként futtathatja.
Referrer-Policy
Referrer-Policy: strict-origin-when-cross-origin
Szabályozza, mennyi információt küld a böngésző az előző oldalról a Referer headerben kattintáskor. A modern böngészőkben az alapértelmezett már strict-origin-when-cross-origin, de a header explicit beállítása konzisztens viselkedést garantál.
Permissions-Policy
Kikapcsolja a nem szükséges API-kat, mint a kamera, mikrofon, GPS és geolokáció. Egy XSS-t kihasználó támadó nem kérheti ezeket az API-kat.
Permissions-Policy: camera=(), microphone=(), geolocation=(), payment=()
Gyakorlati nginx konfiguráció
server {
listen 443 ssl http2;
server_name example.com;
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains" always;
# a preload-ot itt szándékosan kihagytuk - csak akkor add hozzá, ha 100%-ig biztos vagy (lásd a preload csapdát fent)
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "DENY" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always;
# A CSP terjedelmes - az alkalmazásod szerint definiáld
add_header Content-Security-Policy "default-src 'self'; script-src 'self'; ..." always;
}
A kulcs az always - enélkül az nginx a hibaválaszoknál (4xx, 5xx) kihagyja a headereket.
A jelenlegi állapot auditja
A legegyszerűbb online eszközzel. A mi header checkünk megmutatja, mely headerek hiányoznak és melyek hibásak. Alapos audithoz a securityheaders.com is ad A-F pontszámot.
Következtetés
A security headerek a ráfordítás-haszon arányt tekintve a biztonság egyik legjobb befektetése: jellemzően fél óra beállítás a reverse proxyban a böngésző oldali támadások egész kategóriája ellen. A rendszeres karbantartás keretében félévente egy audit ésszerű minimum.
Ingyenes security headers audit
Regisztráció nélkül, eredmény három másodperc alatt.
Próbálja ki az ePulz.io-t ingyen - 7 nap bankkártya nélkül.
Fiók létrehozása