HSTS og sikkerhetsheadere for nettstedet ditt
Med hver side sender webserveren din med headere: korte linjer med instruksjoner til nettleseren. De avgjør delvis hvor sikkert nettleseren behandler nettstedet ditt. Her leser du hva HSTS er, hvilke andre sikkerhetsheadere som finnes, og hvordan du setter dem opp og tester dem.
Først må nettstedet ditt ha et fungerende sertifikat og sende besøkende til https. Det leser du om i Aktivere og fornye SSL-sertifikat og løse problemer og Tvinge besøkende over til https.
Hva gjør HSTS?
Videresending til https har ett svakt punkt: den første forespørselen via http går fortsatt ukryptert. Noen på samme nettverk, for eksempel på et offentlig wifi, kan fange opp den forespørselen. HSTS (HTTP Strict Transport Security) løser dette. Nettstedet ditt sender denne headeren med via https:
Strict-Transport-Security: max-age=31536000
Nettleseren husker da at den bare skal åpne nettstedet ditt via https. Skriver en besøkende senere http://, gjør nettleseren det selv om til https, før noe sendes over nettverket. En HSTS-header som kommer inn via vanlig http, ignorerer nettleseren.
| Del | Betydning |
|---|---|
max-age | Hvor lenge nettleseren husker det, i sekunder. Testen på internet.nl regner minst ett år (31536000) som tilstrekkelig. |
includeSubDomains | Gjelder også alle underdomener, som shop.dittdomene.no og mail.dittdomene.no. |
preload | Du ber om å bli tatt med i listen som er bygget inn i nettlesere (hstspreload.org). Da er selv det aller første besøket beskyttet. Det krever blant annet ett år, includeSubDomains og https på alle underdomener. Å komme av listen igjen tar lang tid. |
max-age=0 | Sletter den lagrede instruksjonen igjen ved neste besøk via https. |
includeSubDomains gjelder det også alle underdomener, for eksempel en gammel kamera- eller skriverside uten sertifikat. Bygg det derfor opp gradvis: start med en kort max-age, for eksempel én dag (86400), sjekk at alt fungerer, og øk i trinn opp til ett år.HSTS hos WebOké
På de fleste av serverne våre sender webserveren HSTS med som standard for alle nettsteder som åpnes via https: Strict-Transport-Security: max-age=31536000. Det er ett år, uten includeSubDomains og uten preload. Du trenger ikke gjøre noe for dette. På noen få servere er det ikke slått på som standard. Der slår du det på selv. Om nettstedet ditt allerede sender HSTS, og med hvilken max-age, ser du i utviklerverktøyene i nettleseren din eller i testen på internet.nl (se nedenfor).
HSTS-bryteren i DirectAdmin
I DirectAdmin går du til Domain Setup og klikker på domenenavnet ditt. Er Secure SSL slått på, ser du under HSTS bryteren Enable HTTP Strict Transport Security. Klikk deretter på Save for å lagre. Hvordan du gjør dette steg for steg, leser du i Send besøkende alltid til https.
Sender nettstedet ditt allerede HSTS, trenger du ikke bryteren. Slå den bare på hvis nettstedet ditt ikke sender HSTS ennå. Sett opp HSTS på ett sted: i DirectAdmin eller i .htaccess, ikke begge. Får nettleseren to HSTS-headere, bruker den bare den første.
De andre sikkerhetsheaderne
| Header | Beskytter mot | Verdi å starte med |
|---|---|---|
X-Content-Type-Options | Nettleseren gjetter selv hva en fil er, slik at et opplastet «bilde» kan kjøres som skript. | nosniff (den eneste gyldige verdien) |
Content-Security-Policy: frame-ancestors eller X-Frame-Options | Clickjacking: et annet nettsted laster siden din usynlig inn i en ramme, slik at besøkende klikker på knappene dine uten å merke det. | frame-ancestors 'self', eller den eldre headeren X-Frame-Options: SAMEORIGIN |
Referrer-Policy | Ved et klikk til et annet nettsted sender nettleseren med adressen til forrige side, noen ganger med et søkeord eller ordrenummer i. | strict-origin-when-cross-origin, eller strengere same-origin eller no-referrer. Internet.nl regner bare de strenge verdiene som gode. |
Permissions-Policy | Bestemmer hvilke nettleserfunksjoner siden din og innebygde rammer får bruke, som kamera, mikrofon og posisjon. | camera=(), microphone=(), geolocation=() slår av disse tre. Bruker nettstedet ditt en av disse funksjonene, utelat den. |
Content-Security-Policy (fullstendig) | Begrenser hvor skript, stiler og bilder kan lastes fra. Det gjør innsatte ondsinnede skript (XSS) mye vanskeligere. | Tilpasses hvert nettsted. Unngå unsafe-inline, unsafe-eval og jokertegn. |
Sette opp i .htaccess
Legg disse linjene øverst i filen .htaccess i mappen public_html for domenet ditt. Ta først en kopi av filen.
<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=()" # Bare hvis nettstedet ditt ikke sender HSTS ennå (se ovenfor): # Header always set Strict-Transport-Security "max-age=31536000" </IfModule>
Legg til includeSubDomains først når du er sikker på at alle underdomener har https. Bruker du WordPress, kan du også sette opp headerne med en plugin. Velg en kjent plugin som fortsatt oppdateres, og sett opp hver header på ett sted: i pluginen eller i .htaccess.
Content-Security-Policy-Report-Only. Den blokkerer ingenting, men viser i nettleserens konsoll hva som ville blitt blokkert. Er du i tvil, overlat dette til webutvikleren din, eller start bare med frame-ancestors.På en VPS med nginx eller Caddy
På en VPS bruker du ikke DirectAdmin og ofte heller ikke .htaccess. Da legger du headerne inn i innstillingene til webserveren din. Ingen av dem sender HSTS eller disse headerne med av seg selv.
nginx: i server-blokken for port 443:
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;
Med always sendes headerne også med på feilsider. Merk: står det en egen add_header i en location-blokk, gjelder ikke reglene fra server-blokken lenger for den location. Gjenta dem der, eller legg dem i en egen fil som du setter inn overalt med include. Test innstillingene med nginx -t og last dem inn med systemctl reload nginx.
Caddy: i blokken for nettstedet ditt i Caddyfile:
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"
}
Last inn endringen med systemctl reload caddy. Hvordan du bygger opp et nettsted med nginx eller Caddy, ser du i nginx med et sertifikat fra Let's Encrypt og Caddy: et nettsted med automatisk https i VPS-veiledningen.
Testing
- Internet.nl: skriv inn domenet ditt i nettstedstesten på internet.nl.
- Nettleseren din: åpne nettstedet ditt, trykk F12 (eller velg Inspiser), gå til fanen Nettverk, last inn siden på nytt og klikk på den første forespørselen. Under Svarhoder (Response Headers) ser du alt serveren din sender med.
- Kommandolinjen:
curl -sI https://dittdomene.no/viser headerne.
Sjekk etter hver endring at nettstedet, skjemaene og betalingssiden din fortsatt fungerer. Hold i tillegg CMS, plugins og temaer oppdatert. Se Sikre wp-login.php i WordPress.
Les mer
- MDN: Strict-Transport-Security (engelsk)
- MDN: Content-Security-Policy (engelsk)
- MDN: Permissions-Policy (engelsk)
- HSTS-preloadlisten (engelsk)
Vil du lære mer? Ta det gratis kurset Trygt på nett for bedrifter, leksjon 4.2 Nettstedet ditt: https, HSTS og sikkerhetsheadere, eller det gratis WordPress-kurset, leksjon 7.4 Herd nettstedet: rettigheter, headere og sikkerhetsplugins.
