HSTS og sikkerhedsheaders til din hjemmeside
Ved hver side sender din webserver headers med: korte linjer med instruktioner til browseren. De bestemmer til dels, hvor sikkert browseren håndterer din side. Her kan du læse, hvad HSTS er, hvilke andre sikkerhedsheaders der findes, og hvordan du indstiller og tester dem.
Først skal din side have et fungerende certifikat og sende besøgende til https. Det kan du læse om i Aktivering, fornyelse og fejlfinding af SSL-certifikat og Tving besøgende til at bruge https.
Hvad gør HSTS?
At sende videre til https har ét svagt punkt: den første anmodning via http går stadig ukrypteret. Nogen på samme netværk, for eksempel på offentlig wifi, kan opsnappe den anmodning. HSTS (HTTP Strict Transport Security) løser det. Din side sender denne header med via https:
Strict-Transport-Security: max-age=31536000
Browseren husker derefter, at den kun må åbne din side via https. Skriver en besøgende senere http://, laver browseren selv om til https, allerede inden noget går over netværket. En HSTS-header, der kommer ind via almindelig http, ignorerer browseren.
| Del | Betydning |
|---|---|
max-age | Hvor længe browseren husker det, i sekunder. Testen fra internet.nl regner mindst et år (31536000) som tilstrækkeligt. |
includeSubDomains | Gælder også for alle underdomæner, som shop.dindomæne.nl og mail.dindomæne.nl. |
preload | Du beder om optagelse på listen, der er indbygget i browsere (hstspreload.org). Så er selv det allerførste besøg beskyttet. Det kræver blandt andet et år, includeSubDomains og https på alle underdomæner. At blive fjernet igen tager lang tid. |
max-age=0 | Sletter den huskede instruktion igen, ved næste besøg via https. |
includeSubDomains gælder det også for hvert underdomæne, som for eksempel en gammel kamera- eller printerside uden certifikat. Byg det derfor gradvist op: begynd med en kort max-age, for eksempel en dag (86400), kontrollér at alt virker, og hæv den trinvis til et år.HSTS hos WebOké
På de fleste af vores servere sender webserveren som standard HSTS med for hver hjemmeside, der åbnes via https: Strict-Transport-Security: max-age=31536000. Det er et år, uden includeSubDomains og uden preload. Det behøver du ikke gøre noget for. På nogle få servere er det ikke slået til som standard, der slår du det selv til. Om din side allerede sender HSTS med, og med hvilken max-age, kan du se i browserens udviklerværktøjer eller i testen fra internet.nl (se nedenfor).
HSTS-kontakten i DirectAdmin
I DirectAdmin går du til Domains og klikker på dit domænenavn. Er Secure SSL Connection slået til, ser du ved HSTS kontakten Enable HTTP Strict Transport Security. Klik derefter på Save for at gemme. Hvordan det foregår trin for trin, kan du læse i Tving besøgende altid til https.
Sender din side allerede HSTS med, har du ikke brug for kontakten. Slå den kun til, hvis din side endnu ikke sender HSTS. Indstil HSTS ét sted: i DirectAdmin eller i .htaccess, ikke begge dele. Får browseren to HSTS-headere, bruger den kun den første.
De andre sikkerhedsheaders
| Header | Mod hvad | Værdi at begynde med |
|---|---|---|
X-Content-Type-Options | Browseren gætter selv, hvad en fil er, hvorved et uploadet "billede" 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, så besøgende ubemærket klikker på dine knapper. | frame-ancestors 'self', eller den ældre header X-Frame-Options: SAMEORIGIN |
Referrer-Policy | Ved et klik til en anden side sender browseren adressen på den forrige side med, nogle gange med et søgeord eller ordrenummer i. | strict-origin-when-cross-origin, eller strengere same-origin eller no-referrer. Internet.nl regner kun de strenge værdier som godkendt. |
Permissions-Policy | Bestemmer, hvilke browserfunktioner din side og indlejrede frames må bruge, som kamera, mikrofon og placering. | camera=(), microphone=(), geolocation=() slår de tre fra. Bruger din side en af de funktioner, så udelad den. |
Content-Security-Policy (fuld) | Begrænser hvorfra scripts, stilarter og billeder må indlæses. Det gør indsatte ondsindede scripts (XSS) meget sværere. | Specialtilpasning per side. Undgå unsafe-inline, unsafe-eval og wildcards. |
Indstilling i .htaccess
Sæt disse linjer øverst i filen .htaccess i mappen public_html for dit domæne. Lav først en kopi af 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=()" # Kun hvis din side endnu ikke sender HSTS med (se ovenfor): # Header always set Strict-Transport-Security "max-age=31536000" </IfModule>
Tilføj kun includeSubDomains, når du er sikker på, at hvert underdomæne har https. Bruger du WordPress, kan du også indstille headerne med et plugin. Vælg et kendt plugin, der stadig opdateres, og indstil hver header ét sted: i pluginet eller i .htaccess.
Content-Security-Policy-Report-Only. Den blokerer ikke noget, men viser i browserens konsol, hvad der ville blive blokeret. Overlad dette til din webudvikler ved tvivl, eller begynd kun med frame-ancestors.Test
- Internet.nl: indtast dit domæne i hjemmesidetesten på internet.nl.
- Din browser: åbn din side, tryk på F12 (eller vælg Undersøg), gå til fanen Netværk, genindlæs siden, og klik på den første anmodning. Under Svarheaders (Response Headers) kan du se alt, hvad din server sender med.
- Kommandolinjen:
curl -sI https://dindomæne.nl/viser headerne.
Kontrollér efter hver ændring, om din side, formularer og betalingsside stadig fungerer. Hold desuden dit CMS, plugins og temaer opdateret. Se Sikring af wp-login.php i WordPress.
Læs mere
- MDN: Strict-Transport-Security (engelsk)
- MDN: Content-Security-Policy (engelsk)
- MDN: Permissions-Policy (engelsk)
- HSTS-preload-listen (engelsk)
