CSP Report-Only: miért érdemes előbb mérni, és csak utána blokkolni?
A Content Security Policy bevezetése biztonságosabban végezhető, ha az első szakaszban Report-Only módban mérjük a tényleges függőségeket és csak validálás után kapcsolunk enforcementre.
A Content Security Policy (CSP) egyik legnagyobb előnye, hogy a böngészőben korlátozható, honnan tölthet be az oldal szkripteket, stílusokat, képeket és más erőforrásokat. Ugyanez a képesség a fő kockázata is: egy túl szigorú, előzetesen nem validált szabály legitim funkciókat is letilthat.
Ezért érdemes a CSP-t nem egyetlen kapcsolóként, hanem kontrollált bevezetési folyamatként kezelni. A Content-Security-Policy-Report-Only fejléc erre való: a böngésző kiértékeli a szabályokat és jelzi a megsértésüket, de nem blokkolja a tartalmat.
Mit ad a Report-Only mód?
Report-Only állapotban ugyanazt a policy-logikát lehet kipróbálni, amelyet később enforcement módban szeretnénk használni.
A különbség lényeges:
- Report-Only: mér és jelez, de nem blokkol;
- enforced CSP: a szabályt megsértő erőforrást ténylegesen blokkolja.
Ez lehetőséget ad arra, hogy még éles működés mellett kiderüljön:
- mely külső domainekről tölt az oldal erőforrásokat;
- maradt-e inline script vagy stílus, amelyet a policy érint;
- van-e olyan beágyazás, betűkészlet vagy API-hívás, amely nem szerepel a tervezett engedélylistán;
- egy új release bevezetett-e váratlan függőséget.
Fontos korlát: a Report-Only önmagában nem védelmi kontroll. Ha a policy sérül, a böngésző csak jelentést készít; a tartalom továbbra is lefuthat.
Miért kockázatos az azonnali enforcement?
Egy modern weboldal függőségei könnyen szétterülhetnek több rétegen. Tipikus példák:
- analitika vagy consent megoldás;
- külső betűkészlet;
- CDN;
- videó- vagy térképbeágyazás;
- CAPTCHA;
- ügyfélchat;
- inline konfigurációs script;
- fejlesztői keretrendszer által generált erőforrás.
Ha ezek közül egy kimarad a policy-ból, a böngésző helyesen végrehajtja a korlátozást — az oldal viszont részben hibássá válhat.
Ezért a CSP hardening célja nem az, hogy minél hosszabb vagy minél szigorúbb fejléc készüljön. A cél egy minimális, érthető és bizonyítottan működő policy.
Egy egyszerű bevezetési sorrend
Az általunk követett biztonságos minta:
- Erőforrás-inventory: azonosítani kell, mit tölt be ténylegesen az oldal és honnan.
- Első Report-Only policy: a kívánt célállapothoz közeli, de még nem blokkoló szabályrendszer.
- Valós böngészős ellenőrzés: nem elég csak a build; desktop és mobil használat közben is figyelni kell a violationöket.
- Zaj szétválasztása: egy böngészőbővítmény vagy lokális eszköz is okozhat olyan CSP-jelzést, amely nem az alkalmazás hibája.
- Felesleges függőségek eltávolítása: amit nem kell engedélyezni, azt jobb megszüntetni, mint egyre tágabb policy-val lefedni.
- Enforcement csak stabil baseline után: akkor érdemes váltani, amikor a szükséges működési útvonalakat már ellenőriztük.
- Release utáni monitorozás: későbbi tartalmi vagy technikai módosítás új függőséget hozhat be.
Mit jelent ez egy statikus Astro oldalnál?
Egy static-first oldal előnyben van: kevesebb runtime JavaScript, kevesebb dinamikus komponens és kisebb harmadikfeles függőség általában egyszerűbb CSP-t tesz lehetővé.
Ez azonban nem jelenti azt, hogy a policy automatikusan triviális. Már egyetlen külső szolgáltatás is új script-src, connect-src, frame-src vagy más követelményt hozhat.
Az integra2002.hu új Astro verziójánál ezért a CSP-t először Report-Only módban vezettük be. A release előtti és utáni böngészős ellenőrzés során külön figyeltük, hogy a policy jelez-e valódi alkalmazásfüggőséget. Ez nem végleges hardening-állapot, hanem tudatos mérési fázis.
Mikor lehet továbblépni enforcementre?
Nem célszerű naptári határidőhöz kötni. Jobb feltételekhez kötni:
- a fontos oldaltípusok végig lettek járva;
- nincs ismert legitim erőforrás, amelyet a policy megsértene;
- a szükséges külső domainek indoka dokumentált;
- a release után sincs új, megmagyarázatlan violation;
- van rollback út, ha enforcement után működési regresszió jelenik meg.
A CSP akkor ér valamit, ha valóban korlátoz. De csak akkor érdemes korlátoznia, amikor már tudjuk, mit szabad blokkolni és mit nem.