April 15, 2019
MTA-STS is Hard. Here's how DNS Providers Can Make it Awesome With Automation...
Last week, Gmail became the first major email provider to enable the new MTA-STS standard, which will prevent attackers from intercepting email sent to and from Gmail. If you operate a domain which receives email, you should be looking into enabling MTA-STS too, even if you've out-sourced operation of the actual mail servers to a third party provider.
Unfortunately, MTA-STS introduces several new moving parts to operating a domain which I anticipate will cause operational problems. However, a smart DNS provider can offer automation that makes MTA-STS as easy for domain owners as checking a box. Let me explain how...
First, some background. MTA-STS can be distilled into two parts:
-
Your domain's mail servers need to support modern TLS (TLS 1.2 or higher) and present a publicly-trusted certificate that's valid for the MX server hostname (that is, the hostname which you put in the MX record - not the domain name which receives email). Since this part is straightforward and is taken care of by your mail server provider (who might even be in compliance already), I will not be focusing on it in this post.
-
You need to duplicate the contents of your domain's MX records in a text file which you serve over HTTPS at
https://mta-sts.YOURDOMAIN/.well-known/mta-sts.txt
. The reason for the duplication is that DNS is not authenticated, but HTTPS is. By requiring the publication of your MX records at an HTTPS URL which is derived from your domain name, MTS-STS prevents an attacker from swapping out your MX servers with their own. (DNSSEC would accomplish the same thing, but DNSSEC hasn't worked out very well in practice, which is why MTA-STS exists.)In addition, you need to publish a TXT record at
_mta-sts.YOURDOMAIN
indicating that your domain uses MTA-STS. Any time you change yourmta-sts.txt
file, you need to update the ID value in this TXT record. The reason for the TXT record is that retrieving a web page over HTTPS is expensive compared to a DNS lookup. The TXT record allows mail servers to skip retrievingmta-sts.txt
if a domain doesn't use MTA-STS or ifmta-sts.txt
hasn't changed since the last retrieval.
The consequence of the above is that any time you update your
domain's mail servers, you have to make a change in three places:
the MX record itself (as you do now), the mta-sts.txt
file on your web
server, and finally the _mta-sts
TXT record. If you forget one of the
updates or mess one up, you risk losing mail.
Unfortunately, my experience indicates that humans are quite bad at
remembering this type of thing. Two common failures which I've seen
are forgetting to keep a domain's NS records in sync with the NS records
in the parent zone, and forgetting to update a zone's SOA serial number
after making changes. Therefore, I anticipate DNS administrators forgetting
to keep their MX records in sync with their mta-sts.txt
file, and
forgetting to update the ID in the _mta-sts
TXT record. Ironically,
one of the motivations for MTA-STS is that DNSSEC
is too difficult to deploy correctly, but I think it's premature to say that MTA-STS
will cause fewer outages.
Generally, the way to cope with error-prone, repetitive tasks like this is to automate them away, and DNS providers are in a perfect position to automate MTA-STS policy maintenance for their customers.
DNS providers should offer a checkbox to enable MTA-STS on any domain with an MX record. If you check this box, the DNS provider should do the following:
-
Automatically publish an A/AAAA/CNAME record at
mta-sts.YOURDOMAIN
that points to a web server operated by the DNS provider. The DNS provider should automatically obtain a certificate for this hostname. Their web server should respond to requests for/.well-known/mta-sts.txt
by consultingYOURDOMAIN
's MX records and dynamically generating anmta-sts.txt
file containing each MX server. (Rather than looking up the MX records over the open Internet, which would be insecure, they should directly consult the data source for the domain's records, which they can do since they are the DNS provider.) -
Automatically publish a TXT record at
_mta-sts.YOURDOMAIN
containing an automatically-generated ID value. The ID can be up to 32 alphanumeric characters and must change every time themta-sts.txt
file changes. The DNS provider could use a sequentially increasing integer, or 16 random hex-encoded bytes that are regenerated with every update. It is critical that newmta-sts.txt
files are published before the ID in the TXT record is updated, or else other mail servers might cache the oldmta-sts.txt
file under the new ID, causing delivery failures. It's also a good idea to update the ID at least once a day, whether or not the policy changes, to ensure that other mail servers refresh their caches, just in case an old policy has been cached erroneously.
I hope DNS providers implement this. If domain owners have to manage MTA-STS manually, I anticipate a lot of “human error” that could hamper MTA-STS' adoption. I put “human error” in quotes because although it is a very common expression, it often indicates a problem not with the human who made the error, but with software failing to automate tasks that computers can do easily. Let's make sure MTA-STS can't have human error!
Update (2020-11-12): One-and-a-half years later, I'm not aware of any DNS providers
offering MTA-STS automation. But SSLMate now does!
It's not quite as seamless as what a DNS provider could offer, but it's
pretty good: SSLMate continuously monitors your domains' MX records
and automatically publishes an appropriate MTA-STS policy for you, obtaining and renewing the
necessary SSL certificates. All you need to do is publish two CNAME records
delegating the mta-sts
and _mta-sts
subdomains
to SSLMate-operated servers. For transparency, SSLMate emails you whenever an MX record changes, so you
can detect unauthorized changes.
Update (2022-10-25): Improved advice about generating policy IDs. I now recommend using a sequentially increasing integer or random bytes, and regenerating the ID at least once a day to avoid caching problems. I previously suggested generating the ID from a hash of the policy file, but this is not robust: if the policy changes inbetween a mail server checking the TXT record and downloading the policy file, the mail server will cache the new file under the old ID. If you later switch back to the original policy, the other mail server won't detect the policy change and will keep using the new policy, possibly causing delivery failures.
Post a Comment
Your comment will be public. To contact me privately, email me. Please keep your comment polite, on-topic, and comprehensible. Your comment may be held for moderation before being published.
Comments
Reader Thomas Preissler on 2019-04-16 at 14:23:
Hi,
thank you for this. My simple answer for the problem with the id is: Monitor! Monitor automatically.
Write a script to notify you when the MTA-STS id is not what it should be. In my case I am using parts for the md5sum of the policy file and you can easily script that.
Cheers
Tom
Reply
Anonymous on 2019-05-07 at 21:11:
In addition, you need to publish a TXT record at _mts.sts.YOURDOMAIN indicating that your domain uses MTA-STS. - Did you mean to write
_mta.sts...
instead of_mts.sts...
?Reply
Andrew Ayer on 2019-05-08 at 17:36:
It should be
_mta-sts
. Thanks for pointing out the typo!Reply