Moorfox

Checklists · 2026-09-19

Mail server hardening checklist

Quick answer

Check support status before anything else. Hardening an Exchange build that no longer receives security updates is wasted work, so run Get-ExchangeServer | Format-List Name, Edition, AdminDisplayVersion, check the build against Microsoft's published list, and plan the upgrade first if it is out of support.

After that the job splits in two: the server itself (Health Checker, Extended Protection, basic auth blocked, ECP off the internet, TLS fixed on SCHANNEL and .NET together) and the domain's email authentication records (one SPF record, 10 lookups or fewer, DKIM signing, DMARC starting at p=none). Tighten the records only once the reports are clean.

Download as Markdown

Support status and patching

Cut the attack surface

Authentication and access

TLS and transport

SPF, DKIM and DMARC

Verify and keep verifying

Frequently asked questions

What should I check first when hardening a mail server?

Support status. Run Get-ExchangeServer to get the build number and check it against Microsoft's published list. Configuration hardening cannot protect a build that no longer receives security updates, so an unsupported server needs an upgrade plan before anything else is worth doing. The detail is in our Exchange hardening walkthrough.

Why does an SPF record break mail months after it is published?

The 10 DNS lookup limit. Every include: mechanism costs a lookup, and nested includes inside a provider's record count too. A record that was within the limit when published goes over it when a provider adds an include of their own, and the result is a permerror that fails SPF for the whole domain.

Should an SPF record end in -all or ~all?

Start with ~all while DMARC aggregate reports show which legitimate senders you missed, then tighten to -all once the reports are clean. Publishing -all on day one on a domain with an incomplete sender inventory stops real mail. Check what is live with the SPF, DKIM and DMARC checker.

Why must SCHANNEL and .NET TLS settings change together?

Disabling old TLS in SCHANNEL without setting SystemDefaultTlsVersions and SchUseStrongCrypto in the .NET Framework keys leaves Exchange components negotiating a protocol the operating system has switched off. Apply both across every server in a DAG in the same window, or mail stops flowing between the servers that disagree.

A hardened server still goes unpatched if nobody is watching it.

Moorfox tracks patch age, service state and anti-malware health on the mail server alongside every other machine, and alerts when the one server you cannot afford to lose stops checking in.

Start free