Moduuli 4 · 4.2
Verkkosivustosi: https, HSTS ja suojausotsikot
Moduuli 4: Sähköposti, verkkosivusto ja verkkotunnus · Lukuaika: 11 minuuttia
Tavoite: Tämän oppitunnin jälkeen osaat tarkistaa verkkosivustosi perussuojauksen: voimassa olevan varmenteen, uudelleenohjauksen https-osoitteeseen, HSTS:n sopivalla max-age-arvolla, tärkeimmät suojausotsikot ja CMS:n päivittämisen.
Keskeiset käsitteet: TLS-varmenne, https, uudelleenohjaus https-osoitteeseen, HSTS, max-age, includeSubDomains, preload, HTTP-otsikko, Content-Security-Policy, X-Content-Type-Options, frame-ancestors, X-Frame-Options, Referrer-Policy
Mitä tapahtuu, kun joku avaa sivustosi
Kun asiakas kirjoittaa osoiteriville example.com, selain pyytää sivua verkkopalvelimeltasi. Tämä keskustelu käydään HTTP:n kautta. Https-yhteydessä sen ympärillä on salattu yhteys: TLS. Tätä varten verkkosivustosi tarvitsee TLS-varmenteen (kutsutaan usein edelleen SSL-varmenteeksi). Varmenne todistaa, että palvelin todella kuuluu osoitteeseen example.com, ja salaus varmistaa, ettei kukaan voi lukea tai muuttaa liikennettä matkan varrella. Tämä on tärkeää julkisessa wifissä, jossa et tiedä kuka verkkoa hallinnoi (oppitunti 5.3).
Jokaisen vastauksen mukana palvelin lähettää varsinaisen sivun lisäksi joukon otsikoita (headers): lyhyitä rivejä, jotka sisältävät tietoa ja ohjeita selaimelle. Et näe niitä ruudulla, mutta ne määräävät suurelta osin, kuinka turvallisesti selain käsittelee sivustoasi. Osa näistä otsikoista on suojausotsikoita. Tällä oppitunnilla käymme läpi neljä tasoa: varmenne, uudelleenohjaus, HSTS ja otsikot. Lopuksi tarkastelemme lyhyesti verkkosivustosi itsensä päivittämistä.
Taso 1: voimassa oleva varmenne
Varmenne on kunnossa, kun se täyttää kolme ehtoa:
- se ei ole vanhentunut;
- sen on myöntänyt luotettu myöntäjä (varmenneviranomainen, jonka selaimet tuntevat, kuten Let's Encrypt tai kaupallinen toimija);
- se kattaa täsmälleen sen nimen, jonka kävijä avaa:
example.comjawww.example.com, jos käytät molempia.
Lähes jokainen webhotelli hoitaa nykyään ilmaisen varmenteen, joka uusiutuu automaattisesti. Jos jotain menee pieleen, syynä on yleensä se, että verkkotunnus osoittaa toiselle palvelimelle, tai että CAA-tietue estää myöntäjän (oppitunti 4.3).
Tärkeä asia: lukon kuva ei kerro mitään luotettavuudesta. Se kertoo vain, että yhteys on salattu ja että varmenne vastaa osoiterivillä näkyvää nimeä. Myös huijaussivustoilla osoitteessa mijnbank-veilig.example on lukon kuva. Siksi opit oppitunnilla 3.2 lukemaan verkkotunnuksia.
Taso 2: aina uudelleenohjaus https-osoitteeseen
Pelkkä varmenne ei riitä. Kun joku avaa osoitteen http://example.com, esimerkiksi vanhan linkin kautta tai kirjoittamalla vain nimen, hänet pitää ohjata automaattisesti https-versioon. Tätä kutsutaan uudelleenohjaukseksi (redirect, yleensä tilakoodilla 301).
Hyvä järjestys on:
http://example.com -> https://example.com
https://example.com -> https://www.example.com (vain jos käytät www-muotoa pääosoitteena)
http://www.example.com -> https://www.example.comHuomaa ensimmäinen rivi: ohjaa http ensin https-osoitteeseen samalla nimellä, vasta sen jälkeen tarvittaessa www-muotoon. Näin selain voi vastaanottaa myös paljaan nimen HSTS-ohjeen. Internet.nl tarkistaa juuri tämän.
Yleinen virhe on kaksinkertainen uudelleenohjaus: sekä webhotellin hallintapaneelissa että lisäosassa tai tiedostossa .htaccess. Tämä voi aiheuttaa loputtoman silmukan ("liian monta uudelleenohjausta"). Käytä vain yhtä paikkaa.
Taso 3: HSTS
Uudelleenohjauksessa on heikko hetki: aivan ensimmäinen pyyntö kulkee vielä salaamattomana http:n kautta. Samassa verkossa oleva hyökkääjä voi siepata juuri tuon pyynnön ja pitää kävijän väärennetyllä, salaamattomalla versiolla. Tätä varten on HSTS (HTTP Strict Transport Security, RFC 6797).
HSTS:n avulla sivustosi lähettää https:n kautta otsikon:
Strict-Transport-Security: max-age=31536000; includeSubDomainsSelain muistaa tällöin: "avaa tämä sivusto vain https:n kautta, seuraavat 31 536 000 sekuntia (vuoden ajan)". Jos kävijä kirjoittaa myöhemmin http://example.com, selain muuttaa sen itse https-muotoon jo ennen kuin mitään lähtee verkkoon. Heikko ensimmäinen pyyntö jää pois.
| Osa | Merkitys |
|---|---|
max-age= | Kuinka kauan selain muistaa tämän, sekunteina. Internet.nl pitää vähintään vuotta (max-age=31536000) riittävänä; lyhyt ajanjakso ei suojaa kävijöitä, jotka vierailevat sivustollasi vain harvoin. |
includeSubDomains | Koskee myös kaikkia alitunnuksia, kuten shop.example.com ja mail.example.com. |
preload | Pyydät pääsyä listalle, joka on sisäänrakennettu selaimiin (hstspreload.org). Silloin jopa aivan ensimmäinen vierailu on suojattu. Vaatimuksiin kuuluu muun muassa max-age, joka on vähintään vuosi, includeSubDomains ja kaikki alitunnukset https:ssä. Listalta pois pääseminen kestää kauan. |
max-age=0 | Poistaa muistetun ohjeen. |
Kolme asiaa, jotka kannattaa tietää ennen HSTS:n käyttöönottoa:
- Https:n on ensin toimittava kaikkialla. Selain, joka on muistanut HSTS:n ja kohtaa varmennevirheen, ei anna kävijälle mitään painiketta jatkaa silti eteenpäin (RFC 6797, kohta 12.1). Jos varmenteesi vanhenee tai se ei kata
www-osoitetta oikein, sivustosi on näiden kävijöiden ulottumattomissa, kunnes asia on korjattu. includeSubDomainsvaikuttaa kaikkeen verkkotunnuksesi alla. Vanha alitunnus ilman varmennetta, esimerkiksi tulostimen tai kameran sivu osoitteessacamera.example.com, ei ole sen jälkeen enää avattavissa.- Rakenna se vaiheittain. Aloita lyhyellä
max-age-arvolla (esimerkiksi yksi päivä), tarkista että kaikki toimii, ja nosta arvoa vaiheittain vuoteen asti. Odota jokaisessa vaiheessa koko ajanjakson verran.
Selain jättää huomiotta HSTS-otsikon, joka saapuu tavallisen http:n kautta. Näet sen siis vain https-vastauksessa.
Taso 4: suojausotsikot
HSTS:n lisäksi on muutama otsikko, jotka kertovat selaimelle mitä se saa ja ei saa tehdä sivujesi kanssa. Sinun ei tarvitse saada niitä kaikkia täydellisiksi, mutta kolme ensimmäistä ovat yksinkertaisia ja riskittömiä.
| Otsikko | Mitä vastaan | Hyvä arvo |
|---|---|---|
X-Content-Type-Options | Selain alkaa itse arvailla, 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 ja saa kävijät klikkaamaan sivustosi painikkeita huomaamattaan. | frame-ancestors 'self' tai 'none'; vanhempi otsikko X-Frame-Options: SAMEORIGIN tai DENY |
Referrer-Policy | Kun kävijä klikkaa linkkiä toiselle sivustolle, selain lähettää mukana edellisen sivun osoitteen. Siinä voi olla arkaluonteista tietoa, kuten hakusana tai tilausnumero. | no-referrer tai same-origin (tiukka), strict-origin-when-cross-origin (yleinen, internet.nl antaa tästä varoituksen) |
Content-Security-Policy (täydellinen) | Rajoittaa, mistä paikoista skriptit, tyylit ja kuvat saavat latautua. Tekee haitallisten lisättyjen skriptien (XSS) käytöstä paljon vaikeampaa. | Räätälöinti sivustokohtaisesti. Vältä arvoja unsafe-inline, unsafe-eval ja jokerimerkkejä. |
Täydellinen Content-Security-Policy on tehokkain, mutta myös vaikein: liian tiukka sääntö voi rikkoa tilastointisi, maksupainikkeesi tai chat-ikkunasi. Muunnoksella Content-Security-Policy-Report-Only voit ensin mitata, mitä estettäisiin, rikkomatta mitään. Jätä tämä verkkosivustosi tekijän hoidettavaksi, tai aloita vain frame-ancestors-säännöstä.
Otsikoiden tarkistaminen itse
Avaa sivustosi selaimessa, paina F12 (tai valitse "Tarkista"), siirry välilehdelle Verkko (Network), lataa sivu uudelleen ja klikkaa ensimmäistä pyyntöä. Kohdasta "Vastausotsikot" (Response Headers) näet kaiken, mitä palvelin lähettää mukana. Tämän voi tehdä myös komentorivillä:
curl -sI https://example.com/Verkkosivusto itse: CMS, lisäosat ja teemat
Parhaatkaan otsikot eivät auta, jos sivustosi taustalla oleva ohjelmisto on haavoittuva. Useimmat pienyritysten hakkeroidut sivustot eivät ole murtuneet verkkopalvelimen kautta, vaan vanhentuneen lisäosan, jo vuosia päivittämättömän teeman tai heikon ylläpitäjän salasanan kautta.
- Ota käyttöön automaattiset päivitykset CMS:llesi (esimerkiksi WordPress, Joomla tai muu järjestelmä) ja lisäosille, kun se on mahdollista.
- Poista lisäosat ja teemat, joita et käytä; pelkkä käytöstä poistaminen ei riitä, tiedostot ovat edelleen tallessa.
- Käytä ylläpitäjän kirjautumiseen vahvaa, yksilöllistä salasanaa ja kaksivaiheista tunnistautumista (moduuli 2), ja rajoita kirjautumisyritysten määrää.
- Pidä pakettisi PHP-versio (tai muu kieli) sellaisena, joka saa vielä päivityksiä (oppitunti 5.1).
Käytännössä: näin se näyttää
DirectAdmin-paneelissa, jota WebOké käyttää, otat verkkotunnuksesi kohdalla ensin käyttöön Beveiligde SSL verbinding ja sen jälkeen Forceer SSL met https omleiding. Samassa paikassa on kytkin HSTS:lle; ota se käyttöön vasta kun varmenne toimii kaikilla nimillä. Muilla palveluntarjoajilla toiminta on vastaavaa, tai voit hoitaa sen CMS:si asetuksista.
Jos sivustosi toimii Apachella tai LiteSpeedillä, voit asettaa otsikot myös tiedostoon .htaccess:
<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=31536000"
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"
</IfModule>Lisää includeSubDomains vasta, kun olet varma, että jokaisella alitunnuksella on https käytössä. Tarkista jokaisen muutoksen jälkeen internet.nl:n verkkosivustotestillä tai selaimesi kehittäjätyökaluilla.
Yhteenveto
- Lukon kuva tarkoittaa: salattu ja oikea nimi. Se ei tarkoita: luotettava.
- Ohjaa http aina uudelleen https-osoitteeseen, ensin samalla nimellä, ja vain yhdessä paikassa.
- HSTS saa selaimen muistamaan, että sivustosi toimii vain https:n kautta; internet.nl pitää
max-age-arvoa, joka on vähintään vuosi (31536000), hyvänä. Ota se käyttöön vasta kun https toimii kaikkialla, ja rakenna se vaiheittain. X-Content-Type-Options: nosniff,frame-ancestors(taiX-Frame-Options) jaReferrer-Policyovat yksinkertaisia; täydellinen Content-Security-Policy on räätälöitävä.- CMS:n, lisäosien ja teemojen päivitykset ovat vähintään yhtä tärkeitä kuin otsikot.
Tietovisa (quiz)
Tehtävä
Tehtävä A4.2: Https, HSTS ja verkkosivustosi otsikkotietojen tarkistus. Syötä verkkosivustosi verkkotunnus (jos sinulla ei ole sellaista, käytä osoitetta internet.nl). Ohjelma avaa verkkotunnuksesi http://- ja https://-osoitteet ja tarkistaa varmenteen, uudelleenohjauksen https-osoitteeseen, HSTS:n ja suojausotsikot. Saat jokaisesta kohdasta vihreän, oranssin tai punaisen arvion selityksineen.
Tehtävä D4.2: Verkkosivustosi päivittäminen ja siivoaminen. Kirjaudu sisään verkkosivustosi hallintaan, tarkista CMS:n, lisäosien ja teemojen versio, poista mitä et käytä ja ota käyttöön automaattiset päivitykset, kun se on mahdollista. Merkitse tarkistuslista tehdyksi ja vastaa pohdintakysymykseen.
Tehtävä D4.2: Verkkosivustosi päivittäminen ja siivoaminen
Näin toimit: (1) Kirjaudu verkkosivustosi hallintaan (tai pyydä verkkosivujen tekijää tekemään tämä yhdessä kanssasi). (2) Kirjaa ylös CMS:n versio ja tarkista, onko päivityksiä saatavilla. (3) Ota varmuuskopio (oppitunti 6.1), asenna CMS:n, lisäosien ja teemojen päivitykset. (4) Poista lisäosat ja teemat, joita et käytä. (5) Ota automaattiset päivitykset käyttöön, mikäli mahdollista. (6) Tarkista, mitä ylläpitäjätilejä on olemassa, ja poista tilit, jotka kuuluvat henkilöille, jotka eivät enää työskentele yrityksessä. (7) Ota kaksivaiheinen tunnistautuminen käyttöön jokaiselle ylläpitäjätilille.
Merkintäsi ja muistiinpanosi pysyvät vain tässä selaimessa, emme lähetä niitä minnekään. Jos olet kirjautunut sisään, tallennamme kohtaan Omat kurssit vain sen, että olet tehnyt tehtävän.
Lue lisää
WebOkén ohjeartikkeleiden vaiheet pätevät WebOkén ympäristössä; muilla palveluntarjoajilla toiminta on vastaavaa.
- SSL-varmenteen aktivointi, uusiminen ja ongelmien ratkaiseminen
- Ohjaa kävijät pakotetusti https-osoitteeseen
- DirectAdmin-ohje 6.4: Kävijät aina https-osoitteeseen ohjaaminen
- DirectAdmin-ohje 6.7: Ei lukkoa tai "ei turvallinen": sekasisällön korjaaminen
- DirectAdmin-ohje 15.10: Web Application Firewall
- WordPressin wp-login.php-tiedoston suojaaminen
- Internet.nl, verkkosivustotesti (riippumaton): https://internet.nl
- RFC 6797, HTTP Strict Transport Security: https://www.rfc-editor.org/rfc/rfc6797
- HSTS-preload-lista: https://hstspreload.org
- MDN, selitys otsikoista (englanniksi): https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Strict-Transport-Security
