Teknisk guide: punkt for punkt
Eksakt oppskrift for hvert av de tolv punktene vi måler: hva vi ser etter,
hvordan du retter det, og hvordan du verifiserer at det er gjort. Kommandoene under kjører på
Linux og macOS; på Windows finnes de i WSL eller PowerShell med Resolve-DnsName.
Slik måler vi
Alt måles utenfra, på konfigurasjon serverne deres kringkaster åpent: DNS-oppslag og vanlige nettforespørsler. Ingen systemer berøres, ingenting forseres. Metoden følger den nederlandske tjenesten internet.nl, som drives av blant andre det nederlandske økonomidepartementet og europeiske internettorganisasjoner.
Poengsummen er 100: 60 på e-post og 40 på nettsted. To forbehold verdt å kjenne:
- OCSP-stapling måles, men gir ikke poeng. Flere sertifikatutstedere, blant dem Let's Encrypt, har avviklet OCSP. Da mangler sertifikatet henvisningen stapling trenger, og det er ikke mulig å slå på uansett serverkonfigurasjon. internet.nl behandler det likedan.
- Vi måler ikke e-postserverens eget TLS-oppsett ennå. STARTTLS, chifferpakker og DANE på port 25 er ikke med i poengsummen. internet.nl måler dette, så en virksomhet kan få full pott hos oss og likevel ha noe å rette der.
1. SPF
Hva vi ser etter
En TXT-post på domenet som starter med v=spf1. Vi registrerer kvalifikatoren til
slutt: -all (hard avvisning) gir full uttelling, ~all (myk) mindre,
?all nesten ingenting.
Fiks
# Microsoft 365
domene.no. IN TXT "v=spf1 include:spf.protection.outlook.com -all"
# Google Workspace
domene.no. IN TXT "v=spf1 include:_spf.google.com -all"
# Egen e-postserver
domene.no. IN TXT "v=spf1 mx -all"
Har dere flere avsendere, listes de sammen i én post. Det skal finnes nøyaktig én SPF-post per domene; to poster gjør oppslaget ugyldig.
Ti-oppslagsgrensen: SPF tillater maksimalt ti DNS-oppslag under evaluering.
Hver include: teller. Overskrides grensen, feiler hele SPF-en med
permerror, og da faller også DMARC-kontrollen bort for de e-postene som ikke er
DKIM-signert. Har dere mange tjenester, må posten flates ut.
Verifiser
dig +short TXT domene.no | grep spf1
2. DKIM
Hva vi ser etter
Vi prøver de vanligste selektornavnene: selector1, selector2,
google, default, mail og noen til. Finner vi ingen,
rapporterer vi «ikke funnet via vanlige selektorer», ikke «mangler». Bruker dere et eget
selektornavn, kan DKIM være helt i orden selv om vi ikke ser det. internet.nl har samme
begrensning.
Fiks
Microsoft 365: aktiver DKIM-signering for domenet, og publiser de to
CNAME-postene tjenesten oppgir. De peker fra selector1._domainkey og
selector2._domainkey til verdier under <tenant>.onmicrosoft.com.
Microsoft roterer nøklene selv når det er satt opp slik.
Google Workspace: generer nøkkel for domenet, publiser den oppgitte
TXT-posten på google._domainkey, og slå deretter på signeringen.
Egen server: generer et nøkkelpar, la e-postserveren signere utgående post, og publiser den offentlige nøkkelen:
selektor._domainkey.domene.no. IN TXT "v=DKIM1; k=rsa; p=<offentlig nøkkel>"
Verifiser
dig +short TXT selector1._domainkey.domene.no
dig +short TXT google._domainkey.domene.no
3. DMARC
Hva vi ser etter
TXT-post på _dmarc.domene.no. Vi leser p (policy),
sp (subdomenepolicy) og om rua er satt.
Fiks
# Steg 1: overvåk (endrer ingenting for posten din)
_dmarc.domene.no. IN TXT "v=DMARC1; p=none; rua=mailto:dmarc@domene.no"
# Steg 2: etter at rapportene er gjennomgått
_dmarc.domene.no. IN TXT "v=DMARC1; p=quarantine; rua=mailto:dmarc@domene.no"
# Steg 3: full beskyttelse
_dmarc.domene.no. IN TXT "v=DMARC1; p=reject; rua=mailto:dmarc@domene.no"
Hopp aldri rett til p=reject. Enhver tjeneste som sender e-post
i deres navn uten å være i SPF eller signert med DKIM, får posten avvist fra det sekundet
policyen trer i kraft. Kjør p=none med rua i minst noen uker og les
rapportene først. Det er der fakturasystemet, sak- og arkivsystemet og nyhetsbrevverktøyet
dukker opp.
Om sp
Utelater du sp, arver subdomenene p automatisk (RFC 7489 § 6.3).
Det er fullgodt, og vi trekker ikke for det. Derimot er sp=none ved siden av et
strengt p en reell svekkelse: hovedomenet er beskyttet mens alle subdomener er
åpne. Det gir ikke uttelling hos oss, og vi viser det eksplisitt på enhetssiden.
Verifiser
dig +short TXT _dmarc.domene.no
4. MTA-STS
Hva vi ser etter
TXT-post på _mta-sts.domene.no, og en policy-fil som faktisk kan hentes.
enforce gir full uttelling, testing halv.
Fiks
To deler. Først DNS-posten, der id må endres hver gang policyen endres:
_mta-sts.domene.no. IN TXT "v=STSv1; id=20260724120000Z"
Så policy-filen, som må serveres over https fra vertsnavnet
mta-sts.domene.no på stien /.well-known/mta-sts.txt, med et gyldig
sertifikat for det navnet:
version: STSv1
mode: testing
mx: mx1.domene.no
mx: mx2.domene.no
max_age: 604800
Alle MX-verter må listes. Mangler én, vil post via den bli avvist når dere går til
enforce. Kjør testing til TLS-RPT-rapportene (neste punkt) er rene, og
bytt så mode til enforce.
Verifiser
dig +short TXT _mta-sts.domene.no
curl -s https://mta-sts.domene.no/.well-known/mta-sts.txt
5. TLS-RPT
Hva vi ser etter
TXT-post på _smtp._tls.domene.no med v=TLSRPTv1.
Fiks
_smtp._tls.domene.no. IN TXT "v=TLSRPTv1; rua=mailto:tlsrpt@domene.no"
Sett denne opp før MTA-STS går i enforce. Rapportene er den eneste
måten å oppdage at en MX-vert mangler i policyen før posten begynner å bli avvist.
Verifiser
dig +short TXT _smtp._tls.domene.no
6. DNSSEC
Hva vi ser etter
At sonen er signert og validerer, altså at oppslaget kommer tilbake med
ad-flagget satt fra en validerende resolver.
Fiks
Dette gjøres hos domeneleverandøren, ikke på serveren. De fleste norske registrarer har det som et av- og påvalg. Kjører dere egne navnetjenere, må sonen signeres og DS-posten registreres hos registraren.
Verifiser
dig +dnssec domene.no A | grep -E "^;; flags|RRSIG"
# Se etter «ad» i flaggene og minst én RRSIG
7. HTTPS-omdirigering
Hva vi ser etter
At http://domene.no svarer med en omdirigering til https.
Fiks
# nginx
server {
listen 80;
server_name domene.no www.domene.no;
return 301 https://$host$request_uri;
}
# Apache
<VirtualHost *:80>
ServerName domene.no
Redirect permanent / https://domene.no/
</VirtualHost>
# Caddy gjør dette automatisk
Verifiser
curl -sI http://domene.no | head -3
8. HSTS
Hva vi ser etter
Strict-Transport-Security i svarhodene fra https-versjonen.
Fiks
# nginx
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
# Apache
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
# Caddy
header Strict-Transport-Security "max-age=31536000; includeSubDomains"
Om includeSubDomains og preload: begge er kraftige
og vanskelige å reversere. includeSubDomains krever at alle subdomener
tåler https, også interne testtjenester. preload legger domenet inn i nettlesernes
egen liste, og der er det tungt å komme ut igjen. Start med en kort
max-age, verifiser, og øk deretter.
Verifiser
curl -sI https://domene.no | grep -i strict-transport
9. TLS-versjon
Hva vi ser etter
Hvilke protokollversjoner serveren faktisk godtar. TLS 1.0 og 1.1 trekker. Svarer ikke nettstedet i det hele tatt, viser vi en nøytral strek, ikke en hake, siden vi da ikke har målt noe.
Fiks
# nginx
ssl_protocols TLSv1.2 TLSv1.3;
# Apache
SSLProtocol -all +TLSv1.2 +TLSv1.3
# Caddy bruker kun moderne versjoner som standard
Verifiser
# Skal FEILE hvis 1.0 er avskrudd:
openssl s_client -connect domene.no:443 -tls1 </dev/null
# Skal lykkes:
openssl s_client -connect domene.no:443 -tls1_3 </dev/null
10. Sertifikat
Hva vi ser etter
At sertifikatet validerer mot en anerkjent utsteder og gjelder navnet vi ber om. Merk: vi måler domenet slik det står i vår domeneliste, altså som regel uten www.
Fiks
# Let's Encrypt via certbot, med BEGGE navn
sudo certbot --nginx -d domene.no -d www.domene.no
# Utvide et eksisterende sertifikat med et navn som mangler
sudo certbot --nginx --expand -d www.domene.no -d domene.no
Den vanligste enkeltfeilen vi ser: sertifikatet dekker bare
www.domene.no, mens domene.no peker på samme server og svarer på port
443. Da får alle som skriver adressen uten www en sertifikatadvarsel, mens en test av
www-adressen gir toppkarakter. At http-versjonen omdirigerer pent til www hjelper ikke, for
nettleseren forsøker https først.
Verifiser
# Hvilke navn dekker sertifikatet?
echo | openssl s_client -connect domene.no:443 -servername domene.no 2>/dev/null \
| openssl x509 -noout -subject -ext subjectAltName
# Validerer det for navnet uten www?
curl -sI https://domene.no | head -1
11. Sikkerhetsheadere
Hva vi ser etter
Fire headere: Content-Security-Policy, X-Content-Type-Options,
Referrer-Policy og X-Frame-Options. Tre av fire regnes som bestått.
Fiks
# nginx
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Content-Security-Policy "default-src 'self'" always;
De tre første kan settes uten risiko. Content-Security-Policy krever derimot
testing: en for streng policy blokkerer nettstedets egne skript og stilark. Start med
Content-Security-Policy-Report-Only, se hva som ville blitt blokkert, og skru den
skarp først når loggen er ren.
Verifiser
curl -sI https://domene.no | grep -iE "content-security|x-content-type|referrer-policy|x-frame"
12. IPv6
Hva vi ser etter
At det finnes en AAAA-post for nettstedet. Vi måler tilstedeværelse, ikke nåbarhet.
Fiks
domene.no. IN AAAA 2001:db8::1
Krever at leverandøren tilbyr IPv6 og at serveren lytter på adressen. Publiser aldri en AAAA-post før tjenesten faktisk svarer på den: da blir nettstedet utilgjengelig for alle som har IPv6, mens det ser helt friskt ut for dere som ikke har det.
Verifiser
dig +short AAAA domene.no
curl -6 -sI https://domene.no | head -1
Vanlige feller vi faktisk har sett
Alle disse er reelle funn fra målingen av 1365 virksomheter, ikke tenkte eksempler:
- Sertifikat kun for www. Beskrevet over. Gir toppkarakter i en vanlig test og advarsel for alle som skriver adressen uten www.
sp=noneved siden avp=reject. Hovedomenet er beskyttet, alle subdomener er vidåpne. Utelatspheller enn å sette den tilnone.- Ny protokoll på uten å skru av den gamle. Flere har slått på TLS 1.2 og 1.3, men latt 1.0 og 1.1 stå aktive ved siden av. Da er svakheten fortsatt der.
- MTA-STS som står i «testing» for alltid. Testing-modus håndhever ingenting. Den er et mellomsteg, ikke et mål.
- Postmottak som er lagt ned uten at DNS er ryddet. Flere virksomheter tar fortsatt imot post på adresser ingen leser.
- DKIM med eget selektornavn. Ikke en feil, men grunnen til at vi kan rapportere «ikke funnet» på et oppsett som virker. Skriv til oss, så retter vi.
Kilder og videre lesning
- internet.nl, metoden målingen bygger på — internet.nl
- Nasjonal sikkerhetsmyndighet, «Grunnleggende tiltak for sikring av e-post» — nsm.no
- RFC 7489, DMARC (subdomenepolicy i § 6.3) — rfc-editor.org
- RFC 8461, MTA-STS — rfc-editor.org
- RFC 6797, HSTS — rfc-editor.org