Modul 4 · 4.2
Din hjemmeside: https, HSTS og sikkerhedsheadere
Modul 4: E-mail, website og domæne · Læsetid: 11 minutter
Læringsmål: Efter denne lektion kan du kontrollere grundsikkerheden på din hjemmeside: et gyldigt certifikat, omdirigering til https, HSTS med en god max-age, de vigtigste sikkerhedsheadere og opdatering af dit CMS.
Nøglebegreber: TLS-certifikat, https, omdirigering til https, HSTS, max-age, includeSubDomains, preload, HTTP-header, Content-Security-Policy, X-Content-Type-Options, frame-ancestors, X-Frame-Options, Referrer-Policy
Hvad der sker, når nogen åbner din side
Hvis en kunde skriver example.com i adresselinjen, beder browseren din webserver om siden. Den samtale foregår via HTTP. Ved https er der en krypteret forbindelse omkring: TLS. Dertil skal din hjemmeside bruge et TLS-certifikat (ofte stadig kaldet SSL-certifikat). Certifikatet beviser, at serveren virkelig hører til example.com, og krypteringen sikrer, at ingen undervejs kan læse med eller ændre noget. Det er vigtigt på offentlig wifi, hvor du ikke ved, hvem der administrerer netværket (lektion 5.3).
Ved hvert svar sender serveren, ud over selve siden, en række headere med: korte linjer med information og instruktioner til browseren. Du ser dem ikke på skærmen, men de bestemmer i høj grad, hvor sikkert browseren håndterer din side. En del af disse headere er sikkerhedsheadere. I denne lektion gennemgår vi de fire lag: certifikat, omdirigering, HSTS og headere. Bagefter ser vi kort på opdatering af selve din hjemmeside.
Lag 1: et gyldigt certifikat
Et certifikat er i orden, hvis det opfylder tre betingelser:
- det er ikke udløbet;
- det er udstedt af en betroet udsteder (en certifikatautoritet, som browserne kender, f.eks. Let's Encrypt eller en kommerciel udbyder);
- det gælder for præcis det navn, som besøgende åbner:
example.comogwww.example.com, hvis du bruger begge.
Næsten alle hostingudbydere ordner i dag et gratis certifikat, som bliver fornyet automatisk. Går det galt, skyldes det som regel, at domænenavnet peger på en anden server, eller at en CAA-record blokerer udstederen (lektion 4.3).
Vigtigt at vide: en hængelås siger ingenting om, hvor troværdig siden er. Den siger kun, at forbindelsen er krypteret, og at certifikatet hører til navnet i adresselinjen. Phishingsider på mijnbank-veilig.example har lige så godt en hængelås. Derfor lærer du i lektion 3.2 at læse domænet.
Lag 2: altid omdirigering til https
Et certifikat alene er ikke nok. Hvis nogen åbner http://example.com, f.eks. via et gammelt link eller ved kun at skrive navnet, skal de automatisk komme over på https-versionen. Det kaldes omdirigering (en redirect, som regel med statuskode 301).
En ordentlig rækkefølge er:
http://example.com -> https://example.com
https://example.com -> https://www.example.com (kun hvis du bruger www som hovedadresse)
http://www.example.com -> https://www.example.comLæg mærke til den første linje: send først fra http til https på det samme navn, først derefter eventuelt til www. Sådan kan browseren også modtage HSTS-instruktionen fra det nøgne navn. Internet.nl kontrollerer netop dette.
En hyppig fejl er dobbelt omdirigering: både i hostingpanelet og i et plugin eller i .htaccess. Det kan give en uendelig løkke ("for mange omdirigeringer"). Brug kun ét sted.
Lag 3: HSTS
Omdirigering har et svagt punkt: den allerførste forespørgsel går stadig ukrypteret via http. En angriber på det samme netværk kan opsnappe netop den forespørgsel og holde den besøgende på en falsk, ukrypteret version. Det er dét, HSTS (HTTP Strict Transport Security, RFC 6797) er til for.
Med HSTS sender din side en header med via https:
Strict-Transport-Security: max-age=31536000; includeSubDomainsBrowseren husker så: "denne side skal kun åbnes via https, de næste 31.536.000 sekunder (et år)". Hvis den besøgende senere skriver http://example.com, laver browseren selv om til https, endnu før der sendes noget over netværket. Den svage første forespørgsel forsvinder.
| Del | Betydning |
|---|---|
max-age= | Hvor længe browseren husker det, i sekunder. Internet.nl regner mindst et år (max-age=31536000) som tilstrækkeligt; en kort periode beskytter ikke folk, der kun sjældent besøger din side. |
includeSubDomains | Gælder også for alle underdomæner, f.eks. shop.example.com og mail.example.com. |
preload | Du beder om optagelse på listen, der er indbygget i browserne (hstspreload.org). Så er selv det allerførste besøg beskyttet. Krav: blandt andet max-age på mindst et år, includeSubDomains og alle underdomæner på https. Det tager lang tid at komme af listen igen. |
max-age=0 | Sletter den huskede instruktion igen. |
Tre ting, du skal vide, før du slår HSTS til:
- Https skal først fungere overalt. En browser, der har husket HSTS og ser en certifikatfejl, giver den besøgende ingen knap til alligevel at fortsætte (RFC 6797, afsnit 12.1). Udløber dit certifikat, eller passer det ikke til
www, er din side utilgængelig for de besøgende, indtil det er løst. includeSubDomainsrammer alt under dit domæne. Et gammelt underdomæne uden certifikat, f.eks. en printer- eller kameraside påcamera.example.com, kan derefter ikke længere åbnes.- Byg det gradvist op. Start med en kort
max-age(f.eks. en dag), kontrollér at alt virker, og hæv den trinvis til et år. Vent ved hvert trin hele perioden ud.
En HSTS-header, der kommer ind via almindelig http, ignorerer browseren. Du ser den derfor kun i https-svaret.
Lag 4: sikkerhedsheadere
Ud over HSTS er der nogle headere, som fortæller browseren, hvad den må og ikke må med dine sider. Du behøver ikke have dem alle perfekte, men de første tre er enkle og uden risiko.
| Header | Mod hvad | God værdi |
|---|---|---|
X-Content-Type-Options | Browseren begynder selv at gætte, hvad en fil er, så en uploadet "billedfil" kan blive kørt som script. | nosniff (den eneste gyldige værdi) |
Content-Security-Policy: frame-ancestors ... eller X-Frame-Options | Clickjacking: en anden side indlæser din side usynligt i en frame og får besøgende til uforvarende at klikke på dine knapper. | frame-ancestors 'self' eller 'none'; den ældre header X-Frame-Options: SAMEORIGIN eller DENY |
Referrer-Policy | Ved et klik til en anden side sender browseren adressen på den forrige side med. Der kan stå følsomme oplysninger i, f.eks. en søgeterm eller et ordrenummer. | no-referrer eller same-origin (strengt), strict-origin-when-cross-origin (almindeligt, internet.nl giver her en advarsel) |
Content-Security-Policy (fuld) | Begrænser, hvorfra scripts, stilarter og billeder må indlæses. Gør indsatte ondsindede scripts (XSS) langt sværere. | Skræddersyet per side. Undgå unsafe-inline, unsafe-eval og wildcards. |
En fuld Content-Security-Policy er den kraftigste, men også den sværeste: en for streng regel ødelægger din statistik, din betalingsknap eller dit chatvindue. Med varianten Content-Security-Policy-Report-Only kan du først måle, hvad der ville blive blokeret, uden at ødelægge noget. Overlad det til din webudvikler, eller start kun med frame-ancestors.
Se headerne selv
Åbn din side i en browser, tryk på F12 (eller vælg "Undersøg"), gå til fanen Netværk, genindlæs siden og klik på den første forespørgsel. Under "Svarheadere" (Response Headers) ser du alt, hvad serveren sender med. Via kommandolinjen kan det også gøres:
curl -sI https://example.com/Selve hjemmesiden: CMS, plugins og temaer
De bedste headere hjælper ikke, hvis softwaren bag din side er sårbar. De fleste hackede sider hos små virksomheder er ikke kommet ind via webserveren, men via et forældet plugin, et tema, der ikke er blevet opdateret i årevis, eller en svag administratoradgangskode.
- Slå automatiske opdateringer til for dit CMS (f.eks. WordPress, Joomla eller et andet system) og for plugins, hvor det er muligt.
- Fjern plugins og temaer, du ikke bruger; deaktiveret er ikke nok, filerne ligger der stadig.
- Brug en stærk, unik adgangskode og totrinsbekræftelse (modul 2) til administratorlogin, og begræns antallet af loginforsøg.
- Hold PHP-versionen (eller et andet sprog) for din pakke på en version, der stadig får opdateringer (lektion 5.1).
I praksis: sådan ser det ud
I DirectAdmin, panelet som WebOké bruger, slår du først Sikker SSL til under dit domæne og derefter Gennemtving SSL med https-omdirigering. På samme sted er der en kontakt til HSTS; slå kun den til, når certifikatet virker for alle navne. Hos andre udbydere fungerer det på lignende vis, eller du ordner det i indstillingerne for dit CMS.
Kører din side på Apache eller LiteSpeed, kan du også sætte headerne i .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>Tilføj kun includeSubDomains, når du er sikker på, at hvert underdomæne har https. Kontrollér efter hver ændring med websitetesten fra internet.nl eller med din browsers udviklerværktøjer.
Opsummering
- En hængelås betyder: krypteret og det rigtige navn. Den betyder ikke: troværdig.
- Send altid http videre til https, først på samme navn, og kun ét sted.
- HSTS får browseren til at huske, at din side kun kører via https; internet.nl regner en
max-agepå mindst et år (31536000) som god. Slå det først til, når https virker overalt, og byg det gradvist op. X-Content-Type-Options: nosniff,frame-ancestors(ellerX-Frame-Options) ogReferrer-Policyer enkle; en fuld Content-Security-Policy er skræddersyet.- Opdateringer af dit CMS, plugins og temaer er mindst lige så vigtige som headere.
Quiz
Opgave
Opgave A4.2: Kontrollér https, HSTS og headers på din hjemmeside. Udfyld domænenavnet på din hjemmeside (har du ikke et, brug så internet.nl). Programmet åbner http:// og https:// for dit domæne og kontrollerer certifikatet, omdirigeringen til https, HSTS og sikkerhedsheaderne. Du får per punkt grøn, orange eller rød med forklaring.
Opgave D4.2: Opdater og ryd op på din hjemmeside. Log ind på administrationen af din hjemmeside, kontrollér versionen af dit CMS, plugins og temaer, fjern det du ikke bruger, og slå automatiske opdateringer til, hvor det er muligt. Afkryds tjeklisten og besvar refleksionsspørgsmålet.
Opgave D4.2: Opdater og ryd op på din hjemmeside
Sådan gør du: (1) Log ind på administrationen af din hjemmeside (eller bed din webbureau om at gøre det sammen med dig). (2) Noter versionen af dit CMS, og tjek om der er opdateringer klar. (3) Lav en backup (lektion 6.1), installer opdateringerne til CMS, plugins og temaer. (4) Fjern plugins og temaer, du ikke bruger. (5) Slå automatiske opdateringer til, hvor det er muligt. (6) Tjek hvilke administratorkonti der findes, og fjern konti for personer, der ikke længere arbejder hos dig. (7) Slå totrinsbekræftelse til for hver administratorkonto.
Dine afkrydsninger og noter forbliver kun i denne browser; vi sender dem ingen steder hen. Er du logget ind, gemmer vi kun i Mine kurser, at du har udført opgaven.
Læs mere
Trinene i WebOké-artiklerne gælder for WebOkés eget miljø; hos andre udbydere fungerer det på lignende vis.
- Aktivering, fornyelse og fejlfinding af SSL-certifikat
- Tving besøgende til at blive videresendt til https
- DirectAdmin vejledning 6.4: Besøgende altid sende til https
- DirectAdmin vejledning 6.7: Ingen hængelås eller 'ikke sikker': løs mixed content
- DirectAdmin vejledning 15.10: Webapplikationsfirewall (WAF)
- Beskyt wp-login.php i WordPress
- Internet.nl, websitetest (uafhængig): https://internet.nl
- RFC 6797, HTTP Strict Transport Security: https://www.rfc-editor.org/rfc/rfc6797
- HSTS-preloadliste: https://hstspreload.org
- MDN, forklaring af headerne (engelsk): https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Strict-Transport-Security
