HSTS och säkerhetsheaders för din webbplats
Med varje sida skickar din webbserver med headers: korta rader med instruktioner till webbläsaren. De avgör delvis hur säkert webbläsaren hanterar din webbplats. Här läser du vad HSTS är, vilka andra säkerhetsheaders som finns och hur du ställer in och testar dem.
Först måste din webbplats ha ett fungerande certifikat och skicka besökare till https. Det läser du om i Aktivera och förnya SSL-certifikat och lösa problem och Skicka alltid besökare vidare till https.
Vad gör HSTS?
Vidarebefordran till https har en svag punkt: den första förfrågan via http skickas fortfarande okrypterad. Någon på samma nätverk, till exempel på ett öppet wifi, kan fånga upp den förfrågan. HSTS (HTTP Strict Transport Security) löser det. Din webbplats skickar med den här headern via https:
Strict-Transport-Security: max-age=31536000
Webbläsaren kommer då ihåg att den bara får öppna din webbplats via https. Skriver en besökare senare http://, gör webbläsaren själv om det till https, innan något skickas över nätverket. En HSTS-header som kommer via vanlig http ignorerar webbläsaren.
| Del | Betydelse |
|---|---|
max-age | Hur länge webbläsaren kommer ihåg det, i sekunder. Testet på internet.nl räknar minst ett år (31536000) som tillräckligt. |
includeSubDomains | Gäller även alla subdomäner, som shop.dindoman.se och mail.dindoman.se. |
preload | Du ber om att komma med i listan som är inbyggd i webbläsarna (hstspreload.org). Då skyddas även det allra första besöket. Det kräver bland annat ett år, includeSubDomains och https på alla subdomäner. Att komma bort från listan igen tar lång tid. |
max-age=0 | Raderar den sparade instruktionen igen, vid nästa besök via https. |
includeSubDomains gäller det även varje subdomän, till exempel en gammal kamera- eller skrivarsida utan certifikat. Bygg därför upp det stegvis: börja med en kort max-age, till exempel en dag (86400), kontrollera att allt fungerar och höj i steg till ett år.HSTS hos WebOké
På de flesta av våra servrar skickar webbservern som standard med HSTS för varje webbplats som öppnas via https: Strict-Transport-Security: max-age=31536000. Det är ett år, utan includeSubDomains och utan preload. Du behöver inte göra något för det. På några servrar är det inte aktiverat som standard; där aktiverar du det själv. Om din webbplats redan skickar med HSTS och med vilken max-age ser du i webbläsarens utvecklarverktyg eller i testet på internet.nl (se nedan).
HSTS-reglaget i DirectAdmin
I DirectAdmin går du till Domains och klickar på ditt domännamn. Är Secure SSL aktiverat, ser du vid HSTS reglaget Enable HTTP Strict Transport Security. Klicka sedan på Modify för att spara. Hur du gör steg för steg läser du i Skicka alltid besökare till https.
Skickar din webbplats redan med HSTS behöver du inte reglaget. Aktivera det bara om din webbplats ännu inte skickar HSTS. Ställ in HSTS på ett ställe: i DirectAdmin eller i .htaccess, inte båda. Får webbläsaren två HSTS-headers använder den bara den första.
De andra säkerhetsheaders
| Header | Skyddar mot | Värde att börja med |
|---|---|---|
X-Content-Type-Options | Webbläsaren gissar själv vad en fil är, så att en uppladdad "bild" kan köras som skript. | nosniff (det enda giltiga värdet) |
Content-Security-Policy: frame-ancestors eller X-Frame-Options | Clickjacking: en annan webbplats laddar din sida osynligt i en ram, så att besökare omedvetet klickar på dina knappar. | frame-ancestors 'self', eller den äldre headern X-Frame-Options: SAMEORIGIN |
Referrer-Policy | Vid ett klick till en annan webbplats skickar webbläsaren med adressen till föregående sida, ibland med en sökterm eller ett ordernummer i. | strict-origin-when-cross-origin, eller strängare same-origin eller no-referrer. Internet.nl godkänner bara de strängare värdena. |
Permissions-Policy | Avgör vilka webbläsarfunktioner din sida och inbäddade ramar får använda, som kamera, mikrofon och plats. | camera=(), microphone=(), geolocation=() stänger av de tre. Använder din webbplats någon av funktionerna, utelämna den då. |
Content-Security-Policy (fullständig) | Begränsar varifrån skript, stilmallar och bilder får laddas. Det gör inskjutna skadliga skript (XSS) mycket svårare. | Anpassas för varje webbplats. Undvik unsafe-inline, unsafe-eval och jokertecken. |
Ställ in i .htaccess
Lägg de här raderna överst i filen .htaccess i mappen public_html för din domän. Gör först en kopia 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=()" # Bara om din webbplats ännu inte skickar med HSTS (se ovan): # Header always set Strict-Transport-Security "max-age=31536000" </IfModule>
Lägg till includeSubDomains först när du är säker på att varje subdomän har https. Använder du WordPress kan du även ställa in headers med ett tillägg. Välj ett välkänt tillägg som fortfarande uppdateras, och ställ in varje header på ett ställe: i tillägget eller i .htaccess.
Content-Security-Policy-Report-Only. Den blockerar ingenting, men visar i webbläsarens konsol vad som skulle ha blockerats. Är du osäker, överlåt det till din webbutvecklare eller börja bara med frame-ancestors.På en VPS med nginx eller Caddy
På en VPS använder du inte DirectAdmin och ofta inte heller .htaccess. Du lägger då in headers i webbserverns inställningar. Ingen av dem skickar med HSTS eller dessa headers automatiskt.
nginx: i server-blocket för 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 skickas headers även med felsidor. Obs: finns det en egen add_header i ett location-block, gäller raderna från server-blocket inte längre för den location. Upprepa dem då där, eller lägg dem i en separat fil som du infogar överallt med include. Testa inställningarna med nginx -t och ladda dem med systemctl reload nginx.
Caddy: i blocket för din webbplats 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"
}
Ladda ändringen med systemctl reload caddy. För att sätta upp en webbplats med nginx eller Caddy, se nginx med ett certifikat från Let's Encrypt och Caddy: en webbplats med automatisk https i VPS-guiden.
Testa
- Internet.nl: fyll i din domän i webbplatstestet på internet.nl.
- Din webbläsare: öppna din webbplats, tryck på F12 (eller välj Inspektera), gå till fliken Nätverk, ladda om sidan och klicka på den första förfrågan. Under Svarsrubriker (Response Headers) ser du allt som din server skickar med.
- Kommandoraden:
curl -sI https://dindoman.se/visar headers.
Kontrollera efter varje ändring att din webbplats, formulär och betalsida fortfarande fungerar. Håll dessutom ditt CMS, tillägg och teman uppdaterade. Se Skydda wp-login.php i WordPress.
Läs mer
- MDN: Strict-Transport-Security (engelska)
- MDN: Content-Security-Policy (engelska)
- MDN: Permissions-Policy (engelska)
- HSTS-preloadlistan (engelska)
Vill du lära dig mer? Gå den kostnadsfria kursen Säker online för företagare, lektion 4.2 Din webbplats: https, HSTS och säkerhetsheaders, eller den kostnadsfria WordPress-kursen, lektion 7.4 Härda webbplatsen: behörigheter, headers och säkerhetstillägg.
