MTA-STS — the DNS Record
MTA-STS — the DNS record
MTA-STS is the standard that lets a domain tell sending servers: “use TLS when you connect to my mail servers, and validate the certificate.” Before MTA-STS, opportunistic TLS was the norm — senders would attempt TLS but downgrade to plaintext if anything went wrong. That downgrade was exploitable.
MTA-STS has two parts: a DNS record and an HTTPS policy file. This lesson covers the DNS record. The next covers the policy file.
What the record looks like
A TXT record at _mta-sts.{domain}:
_mta-sts.isidoregroup.com. 3600 IN TXT "v=STSv1; id=20240115093000"
Two tags:
v=STSv1— version identifier. Required. There is nov=STSv2yet.id=— an arbitrary string that changes whenever the policy file changes. Senders cache the policy keyed by this id. Increment it to force re-fetch.
The convention is to use a timestamp (id=20240115093000 is 2024-01-15 09:30:00). This makes the change history obvious. Any unique string works.
What the DNS record does and does not do
The TXT record by itself does nothing operational. It is a pointer — it tells senders “I have an MTA-STS policy; go fetch it.” The actual TLS enforcement is encoded in the policy file at https://mta-sts.{domain}/.well-known/mta-sts.txt.
This is why the DNS record without a working policy file is worse than no DNS record at all. Senders will look for the policy, fail to fetch it, and may treat that as a soft fail or simply log it as a TLS configuration error. The next lesson covers what Cathedra does with that case.
What Cathedra reports
MtaStsCheck.php reads _mta-sts.{domain} looking for any TXT record containing v=STSv1. Three possible outcomes for this first stage:
No record found
| Field | Value |
|---|---|
| status | info |
| severity | — |
| finding | “No MTA-STS TXT record found at _mta-sts.{domain}. MTA-STS is not deployed.” |
| recommendation | “Consider deploying MTA-STS to enforce TLS for inbound SMTP connections.” |
The status is info — not warning, not error. This is the distinction that matters about MTA-STS in the Cathedra worldview. Not having it is not a failure. It is an opportunity.
Most client domains will return this finding when first scanned. That is normal. MTA-STS is a hardening control, not a baseline expectation.
When the DNS record is absent, the check stops here. There is no policy file to evaluate.
Record present
When a v=STSv1 record is found, Cathedra emits:
| Field | Value |
|---|---|
| status | pass |
| severity | — |
| finding | “MTA-STS TXT record present: {full TXT value}” |
| recommendation | — |
And then proceeds to the policy file check (next lesson).
Why the status is info, not warning
The choice of info rather than warning reflects the operational reality. A client that has not deployed MTA-STS is in the same shape as 90% of small-to-medium business domains. Their mail still flows. STARTTLS is still happening opportunistically between any modern mail server pair. What they lack is the explicit enforcement guarantee that a downgrade attack will be refused.
That gap is real but it is not urgent in the way a missing DMARC record is urgent. A client without DMARC is being phished by every spammer who finds them. A client without MTA-STS is theoretically exposed to an active TLS downgrade attack — a much rarer adversary and a much narrower attack window.
Cathedra reflects that asymmetry. Missing DMARC is error / high. Missing MTA-STS is info. Both findings are real and both belong in a remediation list, but they sit at different priorities.
When you would actually deploy MTA-STS
Three triggers that should move MTA-STS up the priority list for a client:
- Compliance requirement. Some frameworks (CMMC, certain SOC 2 implementations, NIST hardening profiles) explicitly call for MTA-STS. If the client is under one of those, deployment is non-negotiable.
- A specific TLS-failure incident. A delivery failure tied to TLS handshake problems with a major partner has surfaced. Deploying MTA-STS plus TLS-RPT (Lesson 6.3) gives you forward visibility on those failures.
- The client has all other email security controls in place (SPF, DKIM, DMARC at
p=reject). MTA-STS is the next natural hardening step.
Outside those triggers, MTA-STS is a strategic recommendation for the annual review, not an urgent fix.
What the record looks like for cloud-hosted mail
For an M365 tenant, the DNS record is published at the client’s domain, but the policy file points to Microsoft’s MX hostnames. Same for Google Workspace.
A typical M365 tenant’s record:
_mta-sts.isidoregroup.com. 3600 IN TXT "v=STSv1; id=20240115093000"
The policy file (covered next lesson) lists *.mail.protection.outlook.com as the allowed MX pattern. The DNS record itself is identical regardless of provider — the provider-specific details are in the policy.
A note on the mta-sts.{domain} hostname
MTA-STS uses two distinct hostnames:
_mta-sts.{domain}— the TXT record (underscored, DNS-only).mta-sts.{domain}— the HTTPS host that serves the policy file. Not underscored. This is a real web host that needs an A or CNAME record and a TLS certificate.
The two are easy to confuse. The TXT record goes at the underscored name; the policy is served from the non-underscored name. The next lesson covers the policy host.
What you should remember
- MTA-STS DNS record is a TXT at
_mta-sts.{domain}containingv=STSv1; id={string}. - The record is a pointer to the real policy file at
https://mta-sts.{domain}/.well-known/mta-sts.txt. - Cathedra reports missing MTA-STS as info, not error or warning. Not deployed is not a failure.
- Finding when missing: “No MTA-STS TXT record found at _mta-sts.{domain}. MTA-STS is not deployed.”
- Two hostnames involved:
_mta-sts.{domain}(TXT) andmta-sts.{domain}(HTTPS). Don’t confuse them.
Cathedra alignment: MtaStsCheck.php — first stage of the check, the TXT record at _mta-sts.{domain}
