Cover Image

Aktivere MTA-STS for mailcow

 Wed 2025-01-15    

Mailsikkerhet er viktig i 2025, og det finnes mange mekanismer for å verifisere at mail kommer fra avsenderen den påstår at den er fra. SPF, DKIM, DMARC, og MTA-STS er blant disse, og det er viktig å holde seg oppdatert på hva som skjer innenfor dette feltet. Hvis ikke kommer mailkartellene (Microsoft, Google, etc) til å avvise mailer du sender eller merke dem som spam, og alt blir bare trist.

Siden jeg kjører mailcow som mailsystem, så slipper jeg heldigvis å tenke så mye på å sette sammen en haug komponenter til noe som funker, men det må fremdeles vedlikeholdes og oppdateres, men det er fremdeles enkelte ting som må legges til manuelt. En av disse er MTA-STS.

Hva er SPF, DKIM, DMARC for noe?

  • SPF betyr Sender Policy Framework og er i korte trekk en liste over servere som har lov å sende mail på vegne av domenenavnet ditt. Denne listen publiseres som en TXT-oppføring i DNS.
  • DKIM betyr DomainKeys Identified Mail og er en kryptografisk autentiseringsmetode for å forhindre spammere og andre idioter fra å utgi seg for å være et legitimt domenenavn. Dette gjøres ved at en mail som kommer fra et domene faktisk var autorisert til å sende denne mailen. Dette igjen gjøres ved å henge på en digital signatur, linket til et domenenavn, for hver utgående mail. Den offentlige nøkkelen (public key) for dette er også publisert som en TXT-oppføring i DNS.
  • DMARC betyr Domain-based Message Authentication, Reporting and Conformance, og er en mailautentiseringsprotokoll designet for å gi eiere av maildomener muligheten til å beskytte domenenavnene sine mot uautorisert bruk, kjent som mailspoofing. DMARC bygger på SPF og DKIM og har TXT-oppføringer med policyer for hvordan mail skal håndteres, publisert i DNS.

MTA-STS i et nøtteskall

MTA-STS står for Mail Transfer Agent Strict Transfer Security og er definert i RFC8461. MTA-STS er motparten til DNSSEC/DANE og har som målsetning å tvinge mailservere til å kommunisere via TLS-beskyttede forbindelser. Dette gir flere fordeler:

  1. Forbedret sikkerhet mot routing-baserte angrep (spoofing, cache poisoning, MITM) selv uten DNSSEC/DANE, siden de fleste DNS-tilbydere og mailtilbydere ikke fullt ut støtter DNSSEC/DANE (enda).
  2. Kryptert mailutveksling mellom mailservere for å garantere konfidensialitet og integritet i transit.

Velg: MTA-STS eller DNSSEC/DANE

MTA-STS og DNSSEC/DANE kan implementeres og brukes hver for seg, eller man kan implementere begge. Begge tilbyr samme nivå av sikkerhet for samme type problemer. Derfor er det viktig å implementere minst en av dem for å hindre angripere og andre idioter å re-route mailen din for å lese og/eller endre den i transit.

Hvordan implementere MTA-STS for mailcow

MTA-STS krever to ting:

  1. 3 DNS-oppføringer for hvert domene du ønsker å sende og motta mail for
  2. En webserver med sertifikater man stoler på for hvert domene du ønsker å sende/motta mail til/fra, som servere en tekstfil

Guiden under forutsetter følgende:

  1. En fungerende mailcow-installasjon med domener og brukere
  2. Tilgang til å endre DNS-oppføringer for alle domener MTA-STS skal implementeres for

Endre alle forekomster av mail.example.com med FQDN for din fungerende mailserver.

Endre alle forekomster av "otherdomain.com" til det/de andre domenet/domenene MTA-STS skal implementeres for. Hvis du har domene1.no og domene2.no, opprett TO sett oppføringer og legg dem inn i sine respektive sonefiler.

Endre report@example.com til den mailkontoen du ønsker å motta rapporter på. Hvis disse rapportene skal parses av automatiserte systemer som Viesti Reports eller parsedmarc-dockerized kan det være hensiktsmessig å opprette en dedikert mailkonto (eller to) for dette.

DNS-oppføringer

Vi starter med å legge inn 3 DNS-oppføringer i DNS-sonen der mailserveren er definert. Det antas her at mailserveren "mail.example.com" har en A- eller AAAA-oppføring.

mta-sts.example.com.    120 IN CNAME    mail.example.com.
_mta-sts.example.com.   120 IN TXT      "v=STSv1; id=20220324000000Z"
_smtp._tls.example.com. 120 IN TXT      "v=TLSRPTv1; rua=mailto:report@example.com"

Deretter, opprett de følgende 3 DNS-oppføringene for hvert domene du hoster mail for på mailcow-serveren din.

mta-sts.otherdomain.com.      120 IN CNAME    mail.example.com
_mta-sts.otherdomain.com.     120 IN CNAME    _mta-sts.example.com
_smtp._tls.otherdomain.com.   120 IN CNAME    _smtp._tls.example.com

120 er antall sekunder oppføringen er gyldig før den refreshes (TTL). Jeg liker å ha kort TTL på oppføringer som potensielt må endres mens jeg setter dem opp slik at jeg ikke må vente en time eller mer før endringen blir synlig. På denne måten tar det 2 minutter mellom hver endring. Når alt er på plass og fungere som det skal, kan TTL endres til 3600 sekunder eller mer.

mta-sts.txt

Naviger til mailcow-mappen (skal være /opt/mailcow-dockerized om du har fulgt installasjonsmanualen for mailcow). Naviger deretter til data/web/.well-known/ og opprett en fil som heter mta-sts.txt med følgende innhold:

version: STSv1
mode: enforce
max_age: 172800
mx: mail.example.com
mx: *.example.com

Eksempel fra Google: https://mta-sts.google.com/.well-known/mta-sts.txt

Sertifikater for hvert mta-sts.*-domene

Mailcow tilbyr en enkel måte å automatisk tildele riktig sertifikat for hvert av de konfigurerte maildomenene (i mailcow-webUIet).

Gå til mailcow-mappen /opt/mailcow-dockerized og åpne mailcow.conf i en teksteditor. Søk etter eller scroll som en huleboer til du finner ADDITIONAL_SAN og ADDITIONAL_SERVER_NAMES, og legg til mta-sts.* til begge variablene, som dette:

# ...

ADDITIONAL_SAN=mta-sts.*

# ...

ADDITIONAL_SERVER_NAMES=mta-sts.*

Hvis du allerede har noe definert der, f.eks. hvis du har lagt til webmail.example.comADDITIONAL_SAN slik jeg har, så blir det seende slik ut:

# ...

ADDITIONAL_SAN=webmail.example.com mta-sts.*

# ...

ADDITIONAL_SERVER_NAMES=mta-sts.*

Lagre filen og kjør deretter docker compose up -d fra mailcow-mappen. Det kan ta noen minutter før alle sertifikater blir deployet fra Let's Encrypt.

Sjekk at alt virker

Hvis alt virker, skal du nå kunne åpne https://mta-sts.example.com/.well-known/mta-sts.txt for hvert domene du har i mailcow. Hvis ikke skyldes dette enten at DNS-oppføringene ikke er synlige enda eller at TLS-sertifikatene for websidene ikke har blitt deployet enda. Vent en stund, kjør docker compose restart acme-mailcow og prøv igjen.

Du kan også gå til https://checktls.com, skrive inn maildomenet ditt, klikke på "more options", krysse av for "check MTA-STS" og klikke "Run test". Hvis alt er i orden skal du få opp et bilde som ser omtrent slik ut:

Dette er bare policyen

De gode nyhetene er at du nå har implementert MTS-STS-policyen for maildomenene dine. På den annen side, dette er kun policyen. Andre mailservere vil bruke denne policyen til å tvinge kryptert kommunikasjon. Mailcow vil dog ikke sjekke MTA-STS-policyen for andre mailservere den prøver å kontakte.

Det er en åpen github issue på mailcow-repoet om å fullt ut implementere MTA-STS-sjekker (se #1809).