Kas yra CSP ir kaip saugiai ją įdiegti?

Autorius: Paskelbta

Trumpai: CSP, arba Content Security Policy, yra naršyklės saugumo mechanizmas, leidžiantis nustatyti, iš kur svetainė gali gauti išteklius ir kokį kodą gali vykdyti. Jis padeda sumažinti XSS, t. y. svetimo scenarijaus įterpimo į puslapį, pasekmes, o atitinkama direktyva apsaugo ir nuo svetainės įterpimo į nepageidaujamus rėmelius. Politiką geriausia perduoti HTTP atsakymo antraštėje ir pirmiausia išbandyti neblokuojant išteklių.

Kaip veikia CSP ir nuo ko ji saugo?

Naršyklė paprastai atsisiunčia puslapio kode nurodytus išteklius: scenarijus, stilių aprašus, paveikslėlius ar šriftus. CSP nustato papildomas taisykles. Jei išteklius ar kodo vykdymo būdas neatitinka politikos, naršyklė jį blokuoja ir kūrėjo įrankiuose užregistruoja informaciją apie pažeidimą.

Svarbiausia CSP paskirtis – riboti XSS (cross-site scripting) atakas. Tokios atakos metu užpuoliko scenarijus vykdomas svetimoje svetainėje. Pavyzdžiui, komentarų formos spraga gali leisti vietoj įprasto teksto įterpti JavaScript kodą. Pakankamai griežta CSP gali neleisti vykdyti šio kodo, net jei programa per klaidą jį įterpia į puslapį.

CSP taip pat padeda apsisaugoti nuo clickjacking atakų: puslapis įterpiamas į rėmelį, o naudotojas apgaulingu perdangos sluoksniu paskatinamas spustelėti jo elementus. Už šią apsaugą atsakinga direktyva frame-ancestors. Vien scenarijų taisyklių nustatymas tokios apsaugos nesuteikia.

Tačiau CSP nepašalina programos spragų. Vis tiek reikia tinkamai koduoti išvesties duomenis, saugiai apdoroti naudotojų turinį ir atnaujinti programinę įrangą. Politika yra papildomas apsaugos sluoksnis, o ne šių priemonių pakaitalas.

Kur nustatoma CSP politika?

Rekomenduojama ją nustatyti HTTP atsakymo antraštėje, pavadintoje Content-Security-Policy. Ją gali pridėti programa, žiniatinklio serveris, atvirkštinis tarpinis serveris arba CDN. Antraštė turėtų pasiekti naršyklę kartu su HTML dokumentu, kuriam ji taikoma.

Dalį taisyklių taip pat galima perduoti žyma meta su atributu http-equiv="Content-Security-Policy". Šis būdas turi apribojimų: politika pradeda veikti tik perskaičius žymą, nepalaiko ataskaitų teikimo režimo be blokavimo ir direktyvos frame-ancestors. Jei galite konfigūruoti HTTP atsakymą, rinkitės antraštę.

Taip pat patikrinkite, ar CSP jau nepridedama kitame infrastruktūros sluoksnyje. Kelios politikos taikomos vienu metu – nauja antraštė automatiškai nepakeičia ankstesnės. Todėl ji gali papildomai apriboti svetainės veikimą.

Svarbiausios direktyvos ir antraštės pavyzdys

Direktyva yra atskira politikos taisyklė. Direktyvos atskiriamos kabliataškiais, o po jų pavadinimų nurodomi leidžiami šaltiniai arba specialios reikšmės.

DirektyvaKą kontroliuoja
default-srcNumatytuosius daugelio tipų išteklių šaltinius, jei jiems nenustatyta atskira taisyklė
script-srcScenarijų šaltinius ir JavaScript vykdymo sąlygas
style-srcStilių aprašų šaltinius ir įterptųjų stilių naudojimo taisykles
img-srcPaveikslėlių šaltinius
connect-srcRyšius, užmezgamus, be kita ko, naudojant fetch ir WebSocket
object-srcĮterptuosius objektus, kuriuos apdoroja tokie elementai kaip object
base-uriAdresus, leidžiamus elemente base
frame-ancestorsPuslapius, kuriems leidžiama įterpti dokumentą į rėmelį

Paprastai svetainei, naudojančiai tik savo failus, pradinis variantas galėtų būti toks:

Content-Security-Policy: default-src 'self'; script-src 'self'; style-src 'self'; img-src 'self'; connect-src 'self'; object-src 'none'; base-uri 'self'; frame-ancestors 'none'

Reikšmė 'self' reiškia tą pačią kilmę: turi sutapti schema, prieglobos vardas ir prievadas. 'none' neleidžia jokio šaltinio. Pateiktas pavyzdys draudžia įterpti puslapį į rėmelius ir, be kita ko, blokuoja tiesiogiai į HTML įrašytus scenarijus bei įvykių atributus, tokius kaip onclick.

Tai nėra universali konfigūracija. Jei svetainė naudoja išorinę mokėjimų sistemą, analitikos priemones ar šriftus, reikia nustatyti būtinus šaltinius ir pridėti juos prie atitinkamų direktyvų. default-src nepakeičia visų taisyklių – pavyzdžiui, frame-ancestors reikia deklaruoti atskirai.

Kaip įdiegti CSP netyčia nesutrikdant svetainės veikimo?

Saugiausia pirmiausia išsiaiškinti, nuo kokių išteklių ir paslaugų iš tikrųjų priklauso svetainė, ir tik tada įjungti blokavimą.

  1. Sudarykite išteklių ir integracijų sąrašą. Įtraukite ne tik pagrindinį puslapį, bet ir prisijungimą, formas, mokėjimus bei naudotojo paskyros valdymo skydelį.
  2. Nustatykite antraštę Content-Security-Policy-Report-Only. Naršyklė įvertins siūlomą politiką ir praneš apie pažeidimus, tačiau politikos neatitinkančių veiksmų neblokuos. Norint automatiškai rinkti ataskaitas, reikia papildomai sukonfigūruoti ataskaitų teikimo mechanizmą ir jų gavimo priemonę.
  3. Išbandykite visus naudotojo veiksmų scenarijus. Patikrinkite naršyklės konsolę ir tinklo skydelį. Atskirkite būtinus išteklius nuo nereikalingų integracijų ir naršyklės plėtinių siunčiamų užklausų.
  4. Pataisykite taisykles ir kodą. Baigę bandymus, patikrintą politiką perkelkite į Content-Security-Policy antraštę, o įdiegę stebėkite klaidas.

Nešalinkite įspėjimų neapgalvotai pridėdami *, 'unsafe-inline' ar 'unsafe-eval'. Tokios išimtys gali smarkiai susilpninti apsaugą. Būtiniems įterptiesiems scenarijams galima naudoti nonce – nenuspėjamą reikšmę, generuojamą kiekvienam atsakymui, – arba hash, t. y. konkretaus scenarijaus turinio maišos reikšmę. Nonce reikšmė antraštėje ir scenarijaus elemente turi sutapti; į konfigūraciją įrašyta pastovi reikšmė šios paskirties neatlieka.

Pradėkite nuo politikos ataskaitų teikimo režimu bandymų aplinkoje ir atlikite visą veiksmų seką nuo apsilankymo svetainėje iki formos pateikimo ar pirkimo užbaigimo. Taip sužinosite, kokie leidimai iš tikrųjų būtini, dar prieš CSP pradedant blokuoti naudotojams reikalingus išteklius.

Taip pat skaitykite

Sužinokite, kaip PHP-FPM apdoroja PHP užklausas, kuo skiriasi nuo žiniatinklio serverio ir kaip derinti procesus prie srauto bei išteklių.
Susipažinkite su BIND – atvirojo kodo DNS serverio programine įranga, jos paskirtimi ir atvejais, kai verta ją diegti patiems.
Sužinokite, ką reiškia Lenkijos REGON registras ir numeris, kuo jis skiriasi nuo NIP bei KRS ir kaip patikrinti įmonės duomenis.