HSTS ja tietoturvaotsakkeet verkkosivustollesi
Verkkopalvelimesi lähettää jokaisen sivun mukana otsakkeita (headers): lyhyitä rivejä, jotka antavat selaimelle ohjeita. Ne vaikuttavat osaltaan siihen, kuinka turvallisesti selain käsittelee sivustoasi. Tässä artikkelissa kerrotaan, mikä HSTS on, mitä muita tietoturvaotsakkeita on olemassa ja miten ne otetaan käyttöön ja testataan.
Sivustollasi pitää ensin olla toimiva varmenne, ja sen pitää ohjata kävijät https-osoitteeseen. Ohjeet löydät artikkeleista SSL-varmenteen aktivointi, uusiminen ja ongelmien ratkaiseminen ja Kävijöiden pakollinen ohjaus https-osoitteeseen.
Mitä HSTS tekee?
Https-uudelleenohjauksessa on yksi heikko kohta: ensimmäinen http-pyyntö kulkee vielä salaamattomana. Samassa verkossa oleva henkilö, esimerkiksi julkisessa wifissä, voi siepata pyynnön. HSTS (HTTP Strict Transport Security) korjaa tämän. Sivustosi lähettää https-yhteyden kautta tämän otsakkeen:
Strict-Transport-Security: max-age=31536000
Selain muistaa tämän jälkeen, että sivustosi saa avata vain https-yhteydellä. Jos kävijä myöhemmin kirjoittaa http://, selain muuttaa sen itse https-muotoon jo ennen kuin mitään lähtee verkkoon. Tavallisen http-yhteyden kautta saapuvan HSTS-otsakkeen selain jättää huomiotta.
| Osa | Merkitys |
|---|---|
max-age | Kuinka kauan selain muistaa ohjeen, sekunteina. Internet.nl-testi pitää vähintään vuotta (31536000) riittävänä. |
includeSubDomains | Koskee myös kaikkia aliverkkotunnuksia, kuten shop.jouwdomein.nl ja mail.jouwdomein.nl. |
preload | Pyydät sivustosi lisäämistä selaimiin sisäänrakennettuun listaan (hstspreload.org). Silloin jo aivan ensimmäinen käynti on suojattu. Edellytyksiä ovat muun muassa vuoden mittainen max-age, includeSubDomains ja https kaikissa aliverkkotunnuksissa. Listalta poistuminen kestää pitkään. |
max-age=0 | Poistaa muistetun ohjeen seuraavalla https-käynnillä. |
includeSubDomains-asetuksella sama koskee jokaista aliverkkotunnusta, esimerkiksi vanhaa kameran tai tulostimen sivua ilman varmennetta. Ota se siksi käyttöön vaiheittain: aloita lyhyellä max-age-arvolla, esimerkiksi yhdellä päivällä (86400), tarkista, että kaikki toimii, ja nosta arvoa vähitellen vuoteen.HSTS WebOkéssa
Useimmilla palvelimillamme verkkopalvelin lähettää HSTS:n oletuksena jokaiselle https-yhteydellä avattavalle sivustolle: Strict-Transport-Security: max-age=31536000. Se tarkoittaa vuotta ilman includeSubDomains- ja preload-asetuksia. Sinun ei tarvitse tehdä mitään. Muutamalla palvelimella se ei ole oletuksena päällä, joten siellä otat sen käyttöön itse. Näet selaimesi kehittäjätyökaluista tai internet.nl-testistä (katso alta), lähettääkö sivustosi jo HSTS:n ja millä max-age-arvolla.
HSTS-kytkin DirectAdminissa
Mene DirectAdminissa kohtaan Domains ja napsauta verkkotunnustasi. Jos Secure SSL on päällä, näet HSTS-kohdassa kytkimen Enable HTTP Strict Transport Security. Tallenna sen jälkeen napsauttamalla Save. Vaiheittaiset ohjeet löydät artikkelista Kävijöiden ohjaaminen aina https-osoitteeseen.
Jos sivustosi lähettää jo HSTS:n, et tarvitse kytkintä. Ota se käyttöön vain, jos sivustosi ei vielä lähetä HSTS:ää. Määritä HSTS yhdessä paikassa: DirectAdminissa tai .htaccess-tiedostossa, ei molemmissa. Jos selain saa kaksi HSTS-otsaketta, se käyttää vain ensimmäistä.
Muut tietoturvaotsakkeet
| Otsake | Mitä vastaan | Arvo, jolla aloittaa |
|---|---|---|
X-Content-Type-Options | Selain arvaa itse, mikä tiedosto on, jolloin ladattu "kuva" voidaan suorittaa skriptinä. | nosniff (ainoa kelvollinen arvo) |
Content-Security-Policy: frame-ancestors tai X-Frame-Options | Clickjacking: toinen sivusto lataa sivusi näkymättömästi kehykseen, jolloin kävijät napsauttavat huomaamattaan painikkeitasi. | frame-ancestors 'self' tai vanhempi otsake X-Frame-Options: SAMEORIGIN |
Referrer-Policy | Kun kävijä napsauttaa linkkiä toiselle sivustolle, selain lähettää edellisen sivun osoitteen, jossa voi olla esimerkiksi hakusana tai tilausnumero. | strict-origin-when-cross-origin tai tiukemmin same-origin tai no-referrer. Internet.nl hyväksyy vain tiukat arvot. |
Permissions-Policy | Määrittää, mitä selaintoimintoja sivusi ja upotetut kehykset saavat käyttää, kuten kameraa, mikrofonia ja sijaintia. | camera=(), microphone=(), geolocation=() poistaa nämä kolme käytöstä. Jos sivustosi käyttää jotakin niistä, jätä se pois. |
Content-Security-Policy (täysi) | Rajoittaa, mistä skriptejä, tyylejä ja kuvia saa ladata. Se vaikeuttaa huomattavasti haitallisten skriptien syöttämistä (XSS). | Räätälöidään sivustokohtaisesti. Vältä unsafe-inline-, unsafe-eval- ja jokerimerkkiarvoja. |
Käyttöönotto .htaccess-tiedostossa
Lisää nämä rivit verkkotunnuksesi public_html-kansiossa olevan .htaccess-tiedoston alkuun. Tee tiedostosta ensin varmuuskopio.
<IfModule mod_headers.c> Header always set X-Content-Type-Options "nosniff" Header always set Content-Security-Policy "frame-ancestors 'self'" Header always set Referrer-Policy "strict-origin-when-cross-origin" Header always set Permissions-Policy "camera=(), microphone=(), geolocation=()" # Vain jos sivustosi ei vielä lähetä HSTS:ää (katso yllä): # Header always set Strict-Transport-Security "max-age=31536000" </IfModule>
Lisää includeSubDomains vasta, kun olet varma, että jokaisessa aliverkkotunnuksessa on https. Jos käytät WordPressiä, voit määrittää otsakkeet myös lisäosalla. Valitse tunnettu lisäosa, jota päivitetään edelleen, ja määritä jokainen otsake yhdessä paikassa: lisäosassa tai .htaccess-tiedostossa.
Content-Security-Policy-Report-Only-otsakkeella. Se ei estä mitään, mutta näyttää selaimen konsolissa, mitä estettäisiin. Jos olet epävarma, jätä tämä verkkosivujen tekijällesi tai aloita pelkällä frame-ancestors-asetuksella.VPS:llä nginx tai Caddy
VPS:llä et käytä DirectAdminia etkä usein myöskään .htaccess-tiedostoa. Silloin määrität otsakkeet verkkopalvelimesi asetuksissa. Kumpikaan ei lähetä HSTS:ää tai näitä otsakkeita automaattisesti.
nginx: portin 443 server-lohkossa:
add_header Strict-Transport-Security "max-age=31536000" always; add_header X-Content-Type-Options "nosniff" always; add_header Content-Security-Policy "frame-ancestors 'self'" always; add_header Referrer-Policy "strict-origin-when-cross-origin" always;
always-asetuksella otsakkeet lähetetään myös virhesivujen mukana. Huomaa: jos location-lohkossa on oma add_header, server-lohkon säännöt eivät enää koske kyseistä locationia. Toista ne silloin siellä tai laita ne erilliseen tiedostoon, jonka lisäät kaikkialle include-direktiivillä. Testaa asetukset komennolla nginx -t ja lataa ne komennolla systemctl reload nginx.
Caddy: sivustosi lohkossa Caddyfile-tiedostossa:
header {
Strict-Transport-Security "max-age=31536000"
X-Content-Type-Options "nosniff"
Content-Security-Policy "frame-ancestors 'self'"
Referrer-Policy "strict-origin-when-cross-origin"
}
Lataa muutos komennolla systemctl reload caddy. Ohjeet sivuston rakentamiseen nginxillä tai Caddyllä löydät VPS-oppaan artikkeleista nginx ja Let's Encrypt -varmenne ja Caddy: verkkosivusto automaattisella https:llä.
Testaus
- Internet.nl: syötä verkkotunnuksesi verkkosivustotestiin osoitteessa internet.nl.
- Selaimesi: avaa sivustosi, paina F12 (tai valitse Tarkista), siirry Verkko-välilehdelle, lataa sivu uudelleen ja napsauta ensimmäistä pyyntöä. Kohdassa Vastauksen otsikot (Response Headers) näet kaiken, mitä palvelimesi lähettää.
- Komentorivi:
curl -sI https://jouwdomein.nl/näyttää otsakkeet.
Tarkista jokaisen muutoksen jälkeen, että sivustosi, lomakkeesi ja maksusivusi toimivat edelleen. Pidä lisäksi julkaisujärjestelmäsi, lisäosasi ja teemasi ajan tasalla. Katso WordPressin wp-login.php-sivun suojaaminen.
Lue lisää
- MDN: Strict-Transport-Security (englanniksi)
- MDN: Content-Security-Policy (englanniksi)
- MDN: Permissions-Policy (englanniksi)
- HSTS-preload-lista (englanniksi)
Haluatko oppia lisää? Osallistu maksuttomalle kurssille Turvallisesti verkossa yrittäjille, oppitunti 4.2 Verkkosivustosi: https, HSTS ja tietoturvaotsakkeet, tai maksuttomalle WordPress-kurssille, oppitunti 7.4 Sivuston koventaminen: oikeudet, otsakkeet ja tietoturvalisäosat.
