HTTP-tietoturvaotsakkeet ovat vastausotsakkeita, jotka käskevät selainta ottamaan käyttöön suojauksia, jotka sivustosi joutuisi muuten rakentamaan itse: pysy HTTPS:ssä, aja vain luotetuista lähteistä tulevia skriptejä, älä arvaa tiedostotyyppejä, älä anna muiden sivustojen kehystää sivua ja kerro vähemmän siitä, mistä kävijä tuli. Kuusi otsaketta kattaa suurimman osan: Strict-Transport-Security, Content-Security-Policy, X-Content-Type-Options, X-Frame-Options (tai CSP:n frame-ancestors), Referrer-Policy ja Permissions-Policy. Useimmat vaativat yhden rivin palvelinmäärityksiä. Content-Security-Policy vaatii suunnittelua, joten aloita se Report-Only-tilassa.
Kuusi otsaketta yhdellä silmäyksellä
OtsakeSuojaaArvo, jolla aloittaaStrict-Transport-SecurityYhteyksien pudottamiselta salaamattomaan HTTP:henmax-age=31536000Content-Security-PolicySivulle syötetyiltä skripteiltä (cross-site scripting)Ensin Report-Only-tilassa testattu käytäntöX-Content-Type-OptionsSiltä, että selain ajaa tiedoston toisena tyyppinänosniffX-Frame-Options tai frame-ancestorsKehysten kautta tehtävältä clickjackingiltaSAMEORIGIN ja frame-ancestors ’self’Referrer-PolicyTäysien osoitteiden vuotamiselta muille sivustoillestrict-origin-when-cross-originPermissions-PolicyKäyttämättömien selainominaisuuksien pyytämiseltäcamera=(), microphone=(), geolocation=()
Strict-Transport-Security (HSTS)
Vaikka HTTP ohjautuisi HTTPS:ään, verkkotunnuksesi kirjoittava kävijä tekee ensimmäisen pyynnön salaamattomana HTTP:nä, jolloin sen voi lukea tai muuttaa matkalla. HSTS käskee selainta käyttämään verkkotunnuksellesi siitä lähtien HTTPS:ää niin kauan kuin max-age sekunteina määrää:
Strict-Transport-Security: max-age=31536000
Aloita lyhyellä ajalla. Selaimet noudattavat HSTS:ää, kunnes se vanhenee, joten virhe jää voimaan. Kokeile muutaman päivän ajan arvoa max-age=300 ja nosta se sitten vuoteen (31536000).
includeSubDomains soveltaa sääntöä jokaiseen aliverkkotunnukseen. Lisää se vasta, kun kaikki niistä, myös vanhat testi- ja sähköpostipalvelimet, toimivat HTTPS:n yli.
preload pyytää verkkotunnuksen rakentamista suoraan selaimiin hstspreload.org-palvelun kautta, mikä edellyttää vähintään vuoden max-age-arvoa ja includeSubDomains-direktiiviä. Poistaminen kestää kauan, joten pidä sitä pysyvänä.
Selaimet ohittavat HSTS:n salaamattomissa HTTP-vastauksissa. Lähetä se HTTPS:n yli ja pidä silmällä varmennetta: HSTS:n kanssa vanhentuneen varmenteen varoituksen ohi ei voi klikata.
Content-Security-Policy
Content Security Policy luettelee, mistä sivu saa ladata skriptejä, tyylejä, kuvia, fontteja ja kehyksiä ja minne lomakkeet saavat lähettää tietoja. Jos hyökkääjä saa skriptin sivulle kommenttikentän tai murretun lisäosan kautta, selain kieltäytyy ajamasta sitä, ellei käytäntö salli sen lähdettä. Se on kuudesta tehokkain ja helpoin tehdä väärin, koska liian tiukka käytäntö rikkoo oman analytiikkasi, chat-widgetisi tai maksulomakkeesi.
Aloita Report-Only-tilalla
Lähetä käytäntö ensin otsakkeena Content-Security-Policy-Report-Only. Selain ei pakota mitään vaan raportoi jokaisen rikkomuksen report-uri-direktiivin (tai uudemman report-to-direktiivin) osoitteeseen ja kirjaa sen konsoliin. Lähtökohta sivustolle, joka tarjoilee omat tiedostonsa:
Content-Security-Policy-Report-Only: default-src ’self’; script-src ’self’; style-src ’self’; img-src ’self’ data:; font-src ’self’; object-src ’none’; base-uri ’self’; form-action ’self’; frame-ancestors ’self’; report-uri /csp-report
Selaa sivustoa, kerää raportteja viikon tai kahden ajan ja lisää lähteet, joita todella käytät, kuten analytiikka- tai maksupalvelusi. Kun raporteissa näkyy enää asioita, jotka haluat estää, lähetä sama käytäntö otsakkeena Content-Security-Policy.
Sisäiset skriptit: nonce, ei unsafe-inline
Tiukka käytäntö estää sivun sisäiset <script>-lohkot ja onclick-attribuutit, koska syötetty skripti näyttää samalta. ’unsafe-inline’ poistaa ongelman, mutta samalla myös suurimman osan suojasta. Anna sen sijaan jokaiselle vastaukselle satunnainen nonce, lisää se käytäntöön muodossa ’nonce-…’ ja laita sama arvo omiin script-tageihisi; siirrä sisäiset tapahtumankäsittelijät skriptitiedostoihin. Tagienhallintatyökalut, jotka lisäävät omia skriptejään, vaativat erityistä huolellisuutta, koska jokainen niiden lisäämä tagi on myös sallittava.
X-Content-Type-Options
Selaimet arvasivat ennen tiedoston tyypin sen sisällöstä, kun palvelimen Content-Type näytti väärältä. Se antoi ladatun ”kuvan” ajautua skriptinä. X-Content-Type-Options: nosniff kytkee arvailun pois. Sillä on yksi kelvollinen arvo eikä tunnettuja haittoja, kunhan palvelimesi lähettää oikeat sisältötyypit, joten lähetä se jokaisessa vastauksessa.
X-Frame-Options ja frame-ancestors
Clickjacking-hyökkäyksessä toinen sivusto näyttää sivusi näkymättömässä kehyksessä ja huijaa kävijät klikkaamaan sen painikkeita. X-Frame-Options: DENY estää kaiken kehystämisen, ja SAMEORIGIN sallii vain omat sivusi. CSP-direktiivi frame-ancestors tekee saman tarkemmin, esimerkiksi kumppanisivustojen listalla, ja menee edelle sitä tukevissa selaimissa. Lähetä molemmat: frame-ancestors nykyisille selaimille ja X-Frame-Options vanhemmille. Vanhaa ALLOW-FROM-arvoa ei enää tueta, joten käytä frame-ancestors-direktiiviä kaikkeen, mikä menee oman alkuperäsi ulkopuolelle.
Referrer-Policy
Kun kävijä seuraa linkkiä, selain kertoo seuraavalle sivustolle Referer-otsakkeessa, mistä hän tuli. Ilman rajoituksia se voi olla koko osoite, URL-osoitteessa oleva hakukysely, salasanan palautustunniste tai tilausnumero mukaan lukien. strict-origin-when-cross-origin lähettää koko osoitteen oman sivustosi sisällä, muille sivustoille vain verkkotunnuksen eikä mitään HTTPS:stä HTTP:hen. Nykyiset selaimet toimivat näin, kun otsake puuttuu, mutta sen lähettäminen tekee valinnasta näkyvän. Käytä arvoa no-referrer sivuilla, joiden URL-osoitteissa on yksityistä tietoa, ja vältä arvoa unsafe-url, joka lähettää kaiken kaikkialle.
Permissions-Policy
Permissions-Policy, entinen Feature-Policy, kytkee pois selainominaisuudet, joita sivustosi ei käytä, sekä sivulta että jokaiselta siihen upotetulta kehykseltä. Tyhjä lista, (), tarkoittaa, ettei kukaan saa käyttää ominaisuutta:
Permissions-Policy: camera=(), microphone=(), geolocation=(), payment=(), usb=()
Jätä pois ominaisuudet, joita käytät, tai salli ne omalle alkuperällesi arvolla (self), esimerkiksi payment=(self) verkkokaupassa, jossa on maksupainike.
Otsakkeet, jotka voi jättää pois
X-XSS-Protection ohjasi suodatinta, jonka nykyiset selaimet ovat poistaneet. Jätä se pois tai lähetä arvo 0.
Expect-CT ja Public-Key-Pins ovat vanhentuneita. Pinnaus saattoi lukita kävijät sivuston ulkopuolelle, minkä vuoksi selaimet luopuivat siitä.
Server ja X-Powered-By eivät ole tietoturvaotsakkeita, mutta niissä olevat tarkat versionumerot auttavat hyökkääjiä valitsemaan haavoittuvuuden. Karsi ne, jos palvelimesi sallii.
Missä ne asetetaan
Aseta otsakkeet yhdessä paikassa ja niin lähellä reunaa kuin voit: verkkopalvelimessa, CDN:ssä tai sovelluksen välikerroksessa. nginxissä ja Apachessa:
# nginx (in the server block)
add_header Strict-Transport-Security ”max-age=31536000” always;
add_header X-Content-Type-Options ”nosniff” always;
add_header X-Frame-Options ”SAMEORIGIN” always;
add_header Referrer-Policy ”strict-origin-when-cross-origin” always;
add_header Permissions-Policy ”camera=(), microphone=(), geolocation=()” always;
# Apache (.htaccess or virtual host, with mod_headers)
Header always set X-Content-Type-Options ”nosniff”
Header always set Referrer-Policy ”strict-origin-when-cross-origin”
Kaksi nginxin yksityiskohtaa yllättää usein. Ilman always-parametria otsakkeet lisätään vain onnistuneisiin vastauksiin, ei virhesivuille. Lisäksi location-lohko, jossa on yksikin oma add_header, pudottaa pois kaikki server-lohkon otsakkeet, joten yksittäinen kuvien välimuistiotsake voi huomaamatta poistaa tietoturvaotsakkeesi niiltä osin. Varo myös samaa otsaketta, joka asetetaan kahdesti, palvelimessa ja sovelluksessa tai CDN:ssä: selaimet käsittelevät kaksoiskappaleita eri tavoin otsakkeesta riippuen, joten valitse jokaiselle yksi omistaja.
Miten otsakkeet tarkistetaan
Päätteessä curl -sI https://example.com tulostaa vastausotsakkeet. Tarkista myös lopullinen osoite uudelleenohjausten jälkeen, virhesivu ja staattinen tiedosto, koska kunkin voi tarjoilla eri osa palvelupinoasi. Selaimessa kehittäjätyökalujen Network-välilehti näyttää kunkin pyynnön otsakkeet, ja konsoli näyttää CSP-rikkomukset.
Tai käytä ilmaista HTTP-otsakkeiden tarkistintamme. Se listaa jokaisen otsakkeen, jonka URL lähettää uudelleenohjausten jälkeen, merkitsee, mitkä kuudesta tietoturvaotsakkeesta puuttuvat, nostaa esiin muutamia niiden tehon kumoavia arvoja, kuten lyhyen HSTS max-age -arvon, pelkästään Report-Only-tilassa olevan CSP:n tai arvon unsafe-url, ja näyttää, miten sivu on välimuistitettu ja mihin aika kuluu. Se tarkistaa, että otsakkeet ovat paikallaan; se ei arvioi, mitä Content Security Policy sallii, joten käy se läpi itse.
Pidä huoli, etteivät ne katoa
Tietoturvaotsakkeet harvoin hajoavat äänekkäästi. Ne katoavat, kun sivusto siirtyy uudelle palvelimelle, CDN vaihdetaan, lisäosa päivitetään tai joku lisää location-lohkon, ja sivusto toimii edelleen, joten kukaan ei huomaa. Uptimecheckin käytettävyyden valvonnan HTTP-valvonta voi tarkistaa vastausotsakkeet jokaisessa pyynnössä, enintään 10 vastaustarkistusta valvontaa kohden, esimerkiksi:
Strict-Transport-Security on olemassa.
X-Content-Type-Options on nosniff.
Content-Security-Policy sisältää frame-ancestors-direktiivin.
Jokaisen tarkistuksen on täytyttävä, jotta valvonta lasketaan toimivaksi, joten puuttuva otsake merkitsee sen alhaalla olevaksi, toinen tarkistus varmistaa sen ja saat hälytyksen. Laita otsaketarkistukset omaan valvontaansa, jos et halua niiden vaikuttavan sivun käytettävyyslukuihin. Tarkistukset ajetaan jopa minuutin välein Tukholmasta, Lontoosta ja New Yorkista. Katso ohje API-päätepisteen valvontaan vastaustarkistusten määrittämiseksi ja verkkosivuston ylläpidon tarkistuslista rutiinin muita osia varten.
Tiedä samana päivänä, kun otsake katoaa. Kokeile Uptimecheckiä ilmaiseksi 14 päivää, luottokorttia ei tarvita.