<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Regő Botond Ronyecz</title>
    <description>The latest articles on DEV Community by Regő Botond Ronyecz (@rronyecz).</description>
    <link>https://dev.to/rronyecz</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3892331%2F07a2081d-bfce-4f3a-8c61-9231cdc92b32.jpg</url>
      <title>DEV Community: Regő Botond Ronyecz</title>
      <link>https://dev.to/rronyecz</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rronyecz"/>
    <language>en</language>
    <item>
      <title>Top 10 DNS Security Tools for Proactive Threat Hunting (2026)</title>
      <dc:creator>Regő Botond Ronyecz</dc:creator>
      <pubDate>Thu, 04 Jun 2026 13:25:25 +0000</pubDate>
      <link>https://dev.to/rronyecz/top-10-dns-security-tools-for-proactive-threat-hunting-2026-4kfn</link>
      <guid>https://dev.to/rronyecz/top-10-dns-security-tools-for-proactive-threat-hunting-2026-4kfn</guid>
      <description>&lt;p&gt;Most DNS security advice is reactive. Something breaks, you investigate. But the teams that catch problems early aren't waiting for alerts from their SIEM — they're actively mapping their own attack surface before anyone else does.&lt;/p&gt;

&lt;p&gt;These are the tools that make that possible. Some are for enumeration, some for continuous monitoring, some for hunting typosquatting and phishing infrastructure. All of them are worth having in your rotation.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Amass
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it does:&lt;/strong&gt; Attack surface mapping and subdomain enumeration.&lt;/p&gt;

&lt;p&gt;Amass is the most comprehensive open-source tool for external attack surface discovery. It combines passive DNS, certificate transparency logs, web archives, and active DNS queries to build the fullest possible picture of what's associated with a domain.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Passive enumeration only (no direct queries to target)&lt;/span&gt;
amass enum &lt;span class="nt"&gt;-passive&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; yourapp.com

&lt;span class="c"&gt;# Active enumeration with brute forcing&lt;/span&gt;
amass enum &lt;span class="nt"&gt;-active&lt;/span&gt; &lt;span class="nt"&gt;-brute&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; yourapp.com &lt;span class="nt"&gt;-o&lt;/span&gt; results.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It integrates with dozens of data sources: Shodan, VirusTotal, SecurityTrails, crt.sh, and more. The output can be fed into other tools or visualized with the built-in graph database.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; getting a complete picture of your external footprint before a pentest or infrastructure audit.&lt;/p&gt;

&lt;p&gt;Install: &lt;code&gt;go install -v github.com/owasp-amass/amass/v4/...@master&lt;/code&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  2. dnsx
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it does:&lt;/strong&gt; Fast, bulk DNS resolution and record querying.&lt;/p&gt;

&lt;p&gt;dnsx is a swiss army knife for DNS queries at scale. You give it a list of subdomains and it resolves them fast, with support for filtering by record type, status code, or response content.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Resolve a list and show only live hosts&lt;/span&gt;
&lt;span class="nb"&gt;cat &lt;/span&gt;subdomains.txt | dnsx &lt;span class="nt"&gt;-silent&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="nt"&gt;-resp&lt;/span&gt;

&lt;span class="c"&gt;# Find all subdomains with CNAME records&lt;/span&gt;
&lt;span class="nb"&gt;cat &lt;/span&gt;subdomains.txt | dnsx &lt;span class="nt"&gt;-cname&lt;/span&gt; &lt;span class="nt"&gt;-silent&lt;/span&gt;

&lt;span class="c"&gt;# Check for wildcard DNS&lt;/span&gt;
dnsx &lt;span class="nt"&gt;-d&lt;/span&gt; yourapp.com &lt;span class="nt"&gt;-wc&lt;/span&gt; &lt;span class="nt"&gt;-silent&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Where MassDNS is about raw speed, dnsx is about usability. It fits naturally into pipelines with other tools.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; quickly triaging a large list of subdomains, filtering by record type, feeding results into takeover scanners.&lt;/p&gt;

&lt;p&gt;Install: &lt;code&gt;go install -v github.com/projectdiscovery/dnsx/cmd/dnsx@latest&lt;/code&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  3. ZeroHook
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it does:&lt;/strong&gt; Continuous DNS monitoring and dangling record detection.&lt;/p&gt;

&lt;p&gt;Most of the tools on this list are point-in-time scanners. You run them, you get a snapshot, and then you move on. ZeroHook is different: it monitors your DNS records continuously and alerts you when something changes.&lt;/p&gt;

&lt;p&gt;That matters because DNS threats aren't always present when you run your weekly scan. A dangling CNAME gets claimed at 2am on a Sunday. A nameserver record gets changed by someone who still has registrar access. An MX record gets removed and your email starts bouncing. You find out from a customer.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://zerohook.org" rel="noopener noreferrer"&gt;ZeroHook&lt;/a&gt; flags dangling CNAMEs, monitors NS and MX records for unexpected changes, and integrates with the rest of your alerting setup. It has a free tier that covers most small to medium setups.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; teams that have done a one-time audit and now need ongoing visibility without running manual scans on a schedule.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://zerohook.org" rel="noopener noreferrer"&gt;zerohook.org&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  4. subjack
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it does:&lt;/strong&gt; Automated subdomain takeover detection.&lt;/p&gt;

&lt;p&gt;subjack takes a list of subdomains and checks each one against a fingerprint database of vulnerable hosting platforms: Heroku, GitHub Pages, Netlify, S3, Fastly, Shopify, and dozens more. It's looking for the pattern where your CNAME points at a platform, but the resource at that platform no longer exists.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Basic scan&lt;/span&gt;
subjack &lt;span class="nt"&gt;-w&lt;/span&gt; subdomains.txt &lt;span class="nt"&gt;-t&lt;/span&gt; 100 &lt;span class="nt"&gt;-timeout&lt;/span&gt; 30 &lt;span class="nt"&gt;-o&lt;/span&gt; results.txt &lt;span class="nt"&gt;-ssl&lt;/span&gt;

&lt;span class="c"&gt;# With verbose output&lt;/span&gt;
subjack &lt;span class="nt"&gt;-w&lt;/span&gt; subdomains.txt &lt;span class="nt"&gt;-t&lt;/span&gt; 100 &lt;span class="nt"&gt;-timeout&lt;/span&gt; 30 &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="nt"&gt;-ssl&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The fingerprint database is community-maintained and updated as new platforms are identified as vulnerable. Worth cross-referencing with &lt;a href="https://github.com/EdOverflow/can-i-take-over-xyz" rel="noopener noreferrer"&gt;EdOverflow/can-i-take-over-xyz&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; running after Amass or dnsx to identify which discovered subdomains are actually claimable.&lt;/p&gt;

&lt;p&gt;Install: &lt;code&gt;go install github.com/haccer/subjack@latest&lt;/code&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  5. DNStwist
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it does:&lt;/strong&gt; Typosquatting and phishing domain detection.&lt;/p&gt;

&lt;p&gt;DNStwist generates permutations of your domain — typos, homoglyphs, different TLDs, added words — and checks which ones are registered and what they're pointing at. It's how you find out that someone registered &lt;code&gt;yourapp-login.com&lt;/code&gt; and is serving a credential harvesting page.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Basic scan&lt;/span&gt;
dnstwist yourapp.com

&lt;span class="c"&gt;# With MX records and GeoIP&lt;/span&gt;
dnstwist &lt;span class="nt"&gt;--mxcheck&lt;/span&gt; &lt;span class="nt"&gt;--geoip&lt;/span&gt; yourapp.com

&lt;span class="c"&gt;# Export to CSV&lt;/span&gt;
dnstwist yourapp.com &lt;span class="nt"&gt;--format&lt;/span&gt; csv &lt;span class="nt"&gt;--output&lt;/span&gt; results.csv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The output tells you which permutations are registered, what their A/MX records are, and whether they look like they're set up to receive email (a strong phishing signal).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; brand protection, finding phishing infrastructure before your users do, and incident response when you suspect an active campaign.&lt;/p&gt;

&lt;p&gt;Install: &lt;code&gt;pip install dnstwist&lt;/code&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  6. MassDNS
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it does:&lt;/strong&gt; High-performance passive DNS resolution.&lt;/p&gt;

&lt;p&gt;When you have a large wordlist and need to brute-force subdomain discovery fast, MassDNS is the tool. It's a stub resolver that can handle hundreds of thousands of queries per second by sending them asynchronously across multiple resolvers.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Brute-force subdomains using a wordlist&lt;/span&gt;
massdns &lt;span class="nt"&gt;-r&lt;/span&gt; resolvers.txt &lt;span class="nt"&gt;-t&lt;/span&gt; A &lt;span class="nt"&gt;-o&lt;/span&gt; S wordlist.txt &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; results.txt

&lt;span class="c"&gt;# Parse the output&lt;/span&gt;
&lt;span class="nb"&gt;cat &lt;/span&gt;results.txt | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="s2"&gt;"NXDOMAIN"&lt;/span&gt; | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'{print $1}'&lt;/span&gt; | &lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="s1"&gt;'s/\.$//'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It's deliberately minimal — just resolution, no fingerprinting or analysis. Pipe the output to dnsx or subjack for the next step.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; large-scale subdomain brute-forcing during a full attack surface audit. Less useful for targeted monitoring.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. DNSRecon
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it does:&lt;/strong&gt; DNS enumeration, zone transfer testing, and record auditing.&lt;/p&gt;

&lt;p&gt;DNSRecon is one of the older tools on this list and still one of the most thorough for initial enumeration. It tests for zone transfer vulnerabilities (which still exist on misconfigured servers), enumerates standard and non-standard record types, and checks for common misconfigurations.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Standard enumeration&lt;/span&gt;
dnsrecon &lt;span class="nt"&gt;-d&lt;/span&gt; yourapp.com

&lt;span class="c"&gt;# Zone transfer attempt&lt;/span&gt;
dnsrecon &lt;span class="nt"&gt;-d&lt;/span&gt; yourapp.com &lt;span class="nt"&gt;-t&lt;/span&gt; axfr

&lt;span class="c"&gt;# Reverse lookup on a CIDR range&lt;/span&gt;
dnsrecon &lt;span class="nt"&gt;-r&lt;/span&gt; 192.168.1.0/24
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The zone transfer check is worth running on every domain you own. AXFR transfers should be restricted to authorized secondary nameservers only. When they're not, your entire zone file — every subdomain, every internal hostname — is readable by anyone.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; initial enumeration, zone transfer testing, auditing record configurations.&lt;/p&gt;

&lt;p&gt;Install: &lt;code&gt;pip install dnsrecon&lt;/code&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  8. crt.sh
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it does:&lt;/strong&gt; Certificate transparency log search.&lt;/p&gt;

&lt;p&gt;Not a tool you install — a web interface and API for searching certificate transparency logs. Every TLS certificate ever issued for your domain is in there, including historical subdomains you may have forgotten.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Pull all subdomains ever certificated for your domain&lt;/span&gt;
curl &lt;span class="s2"&gt;"https://crt.sh/?q=%.yourapp.com&amp;amp;output=json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  | jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'.[].name_value'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  | &lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="s1"&gt;'s/\*\.//g'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  | &lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-u&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The output is a historical subdomain list you can feed directly into dnsx or subjack. It's usually the starting point for any DNS audit, because it doesn't require active scanning and returns data on infrastructure that may have been decommissioned years ago.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; building a historical subdomain list, finding forgotten infrastructure, starting any DNS audit. Covered in more depth in our CT logs post.&lt;/p&gt;




&lt;h2&gt;
  
  
  9. Shodan
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it does:&lt;/strong&gt; Internet-wide scanning, including DNS and nameserver infrastructure.&lt;/p&gt;

&lt;p&gt;Shodan indexes the internet continuously and lets you query it. From a DNS security perspective, it's useful for finding exposed DNS servers (open resolvers, BIND version disclosure), locating infrastructure associated with your IP ranges, and understanding what's publicly visible on your network.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Via CLI (requires API key)&lt;/span&gt;
shodan search &lt;span class="s2"&gt;"hostname:yourapp.com"&lt;/span&gt;

&lt;span class="c"&gt;# Find open DNS resolvers on a CIDR&lt;/span&gt;
shodan search &lt;span class="s2"&gt;"net:192.168.1.0/24 port:53"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Shodan won't replace dedicated DNS enumeration tools, but it adds a layer that the others miss: what's actually running on the servers your DNS records point at.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; understanding what's exposed beyond just the DNS records themselves, finding misconfigured nameservers, validating that decommissioned infrastructure is actually gone.&lt;/p&gt;




&lt;h2&gt;
  
  
  10. Passive DNS databases (DNSDB / SecurityTrails)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it does:&lt;/strong&gt; Historical DNS record lookup.&lt;/p&gt;

&lt;p&gt;Passive DNS databases record DNS responses observed across large resolver networks over time. They answer questions that active scanning can't: what did this domain point at six months ago? When did this IP start hosting this domain? What other domains share this nameserver?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.dnsdb.info" rel="noopener noreferrer"&gt;DNSDB&lt;/a&gt; (Farsight Security) and &lt;a href="https://securitytrails.com" rel="noopener noreferrer"&gt;SecurityTrails&lt;/a&gt; are the main commercial options. SecurityTrails has a free tier with limited queries. Both are useful for threat hunting — if you're investigating suspicious infrastructure, passive DNS data lets you reconstruct its history and find connected domains.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; incident response and threat hunting, tracing attacker infrastructure, understanding historical DNS changes you didn't monitor at the time.&lt;/p&gt;




&lt;h2&gt;
  
  
  Putting it together: a practical workflow
&lt;/h2&gt;

&lt;p&gt;These tools work best in sequence, not in isolation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For a one-time audit:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Pull historical subdomains from crt.sh&lt;/li&gt;
&lt;li&gt;Enumerate additional subdomains with Amass&lt;/li&gt;
&lt;li&gt;Resolve everything live with dnsx&lt;/li&gt;
&lt;li&gt;Scan for takeover candidates with subjack&lt;/li&gt;
&lt;li&gt;Check zone transfer exposure with DNSRecon&lt;/li&gt;
&lt;li&gt;Run DNStwist to find phishing domains targeting your brand&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;For ongoing monitoring:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Set up ZeroHook or equivalent continuous monitoring on your DNS records. Run DNStwist monthly. Review your zone file quarterly. The one-time audit tells you where you are. The ongoing monitoring tells you when something changes.&lt;/p&gt;




&lt;h2&gt;
  
  
  Quick reference
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Primary use&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Amass&lt;/td&gt;
&lt;td&gt;Active/passive&lt;/td&gt;
&lt;td&gt;Full attack surface enumeration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;dnsx&lt;/td&gt;
&lt;td&gt;Active&lt;/td&gt;
&lt;td&gt;Bulk DNS resolution and filtering&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ZeroHook&lt;/td&gt;
&lt;td&gt;Monitoring&lt;/td&gt;
&lt;td&gt;Continuous DNS change alerting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;subjack&lt;/td&gt;
&lt;td&gt;Active&lt;/td&gt;
&lt;td&gt;Subdomain takeover detection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DNStwist&lt;/td&gt;
&lt;td&gt;Active&lt;/td&gt;
&lt;td&gt;Typosquatting and phishing detection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MassDNS&lt;/td&gt;
&lt;td&gt;Active&lt;/td&gt;
&lt;td&gt;High-speed brute-force resolution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DNSRecon&lt;/td&gt;
&lt;td&gt;Active&lt;/td&gt;
&lt;td&gt;Enumeration and zone transfer testing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;crt.sh&lt;/td&gt;
&lt;td&gt;Passive&lt;/td&gt;
&lt;td&gt;Certificate transparency log search&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Shodan&lt;/td&gt;
&lt;td&gt;Passive&lt;/td&gt;
&lt;td&gt;Exposed infrastructure discovery&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DNSDB / SecurityTrails&lt;/td&gt;
&lt;td&gt;Passive&lt;/td&gt;
&lt;td&gt;Historical DNS records&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;Proactive DNS security is two things: knowing what you have, and knowing when it changes. The enumeration tools (Amass, dnsx, subjack, MassDNS, crt.sh) tell you what's out there. The monitoring tools (ZeroHook, passive DNS databases) tell you when things shift.&lt;/p&gt;

&lt;p&gt;Run the audit workflow at least once against your full domain portfolio. You'll find something you forgot about. That's the point.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Part of an ongoing series on DNS security.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>dns</category>
      <category>devops</category>
      <category>zerohook</category>
    </item>
    <item>
      <title>Developer's Guide to MTA-STS and TLS Reporting (2026)</title>
      <dc:creator>Regő Botond Ronyecz</dc:creator>
      <pubDate>Thu, 04 Jun 2026 13:20:17 +0000</pubDate>
      <link>https://dev.to/rronyecz/developers-guide-to-mta-sts-and-tls-reporting-2026-50g9</link>
      <guid>https://dev.to/rronyecz/developers-guide-to-mta-sts-and-tls-reporting-2026-50g9</guid>
      <description>&lt;p&gt;Most developers have heard of SPF, DKIM, and DMARC. Far fewer have heard of MTA-STS, and almost nobody has set up TLS Reporting. Which is a shame, because MTA-STS closes a real gap that the other three don't touch — and TLS Reporting is the only way to know when your email delivery is silently failing.&lt;/p&gt;

&lt;p&gt;This guide covers both: what they do, how to set them up, and how to verify they're working.&lt;/p&gt;




&lt;h2&gt;
  
  
  The problem MTA-STS solves
&lt;/h2&gt;

&lt;p&gt;When two mail servers exchange email, they're supposed to negotiate TLS so the message travels encrypted. But "supposed to" is doing a lot of work in that sentence.&lt;/p&gt;

&lt;p&gt;SMTP's STARTTLS mechanism is &lt;strong&gt;opportunistic&lt;/strong&gt; by default. That means:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Sending server connects to your MX host&lt;/li&gt;
&lt;li&gt;Sending server says "do you support TLS?"&lt;/li&gt;
&lt;li&gt;If yes, they upgrade to TLS&lt;/li&gt;
&lt;li&gt;If no (or if an attacker strips the STARTTLS offer), they fall back to plaintext&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Step 4 is the problem. An attacker who can intercept traffic between two mail servers — a network-level attacker, a rogue DNS resolver, anyone doing BGP hijacking — can silently strip the STARTTLS advertisement. The sending server sees "no TLS available" and delivers in plaintext. No error. No bounce. No indication anything went wrong.&lt;/p&gt;

&lt;p&gt;This is called a &lt;strong&gt;STARTTLS downgrade attack&lt;/strong&gt;, and it's been documented in the wild against real mail providers.&lt;/p&gt;

&lt;p&gt;MTA-STS fixes this by publishing a policy that tells sending servers: "our MX hosts support TLS, you should require it, and here's a certificate you can validate against." A sending server that respects MTA-STS will &lt;strong&gt;refuse to deliver&lt;/strong&gt; if TLS negotiation fails or if the certificate doesn't match, rather than falling back to plaintext.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The short version:&lt;/strong&gt; SPF, DKIM, and DMARC protect against spoofing and phishing. MTA-STS protects the transport layer — the connection between mail servers — from being downgraded or intercepted.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  How MTA-STS works
&lt;/h2&gt;

&lt;p&gt;The mechanism involves two components: a &lt;strong&gt;policy file&lt;/strong&gt; served over HTTPS, and a &lt;strong&gt;DNS TXT record&lt;/strong&gt; that tells sending servers where to find it.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Sending server looks up &lt;code&gt;_mta-sts.yourapp.com&lt;/code&gt; in DNS to check if a policy exists&lt;/li&gt;
&lt;li&gt;If found, it fetches &lt;code&gt;https://mta-sts.yourapp.com/.well-known/mta-sts.txt&lt;/code&gt; over HTTPS&lt;/li&gt;
&lt;li&gt;The policy tells it which MX hosts to expect and what mode to operate in&lt;/li&gt;
&lt;li&gt;It connects to your MX host and requires TLS with a valid, matching certificate&lt;/li&gt;
&lt;li&gt;If TLS fails or the cert doesn't match, it refuses delivery instead of falling back to plaintext&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The policy file is served over HTTPS from a subdomain you control. The HTTPS requirement is what makes this work: the policy itself can't be tampered with in transit.&lt;/p&gt;

&lt;p&gt;The policy file is served over HTTPS from a subdomain you control. The HTTPS requirement matters: it means the policy itself can't be tampered with in transit.&lt;/p&gt;




&lt;h2&gt;
  
  
  Setting up MTA-STS
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1 — Create the policy file
&lt;/h3&gt;

&lt;p&gt;The policy file is a plain text file served at exactly this path:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://mta-sts.yourapp.com/.well-known/mta-sts.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;STSv1&lt;/span&gt;
&lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;enforce&lt;/span&gt;
&lt;span class="na"&gt;mx&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mail.yourapp.com&lt;/span&gt;
&lt;span class="na"&gt;mx&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="err"&gt;*&lt;/span&gt;&lt;span class="s"&gt;.yourapp.com&lt;/span&gt;
&lt;span class="na"&gt;max_age&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;86400&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;version&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Always &lt;code&gt;STSv1&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;mode&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;enforce&lt;/code&gt;, &lt;code&gt;testing&lt;/code&gt;, or &lt;code&gt;none&lt;/code&gt; (see below)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;mx&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;One entry per MX host you accept mail on. Wildcards allowed.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;max_age&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;How long (seconds) sending servers should cache this policy&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Mode choices explained:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mode&lt;/th&gt;
&lt;th&gt;What happens when TLS fails&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;testing&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Delivery proceeds, failure reported via TLS-RPT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;enforce&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Delivery refused if TLS fails or cert doesn't match&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;none&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Policy effectively disabled&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Start with &lt;code&gt;testing&lt;/code&gt;. Run it for a week or two while you monitor TLS-RPT reports (covered below). Once you're confident your MX hosts are properly configured, switch to &lt;code&gt;enforce&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Don't start with &lt;code&gt;enforce&lt;/code&gt;&lt;/strong&gt; if you haven't verified your MX hosts present valid, trusted certificates with matching hostnames. You will break inbound email delivery.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  Step 2 — Serve the policy file over HTTPS
&lt;/h3&gt;

&lt;p&gt;You need a subdomain &lt;code&gt;mta-sts.yourapp.com&lt;/code&gt; with a valid TLS certificate serving the policy file. The response must:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Return HTTP 200&lt;/li&gt;
&lt;li&gt;Have &lt;code&gt;Content-Type: text/plain&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Be accessible over HTTPS (not HTTP)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're on Nginx:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;443&lt;/span&gt; &lt;span class="s"&gt;ssl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;server_name&lt;/span&gt; &lt;span class="s"&gt;mta-sts.yourapp.com&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kn"&gt;ssl_certificate&lt;/span&gt;     &lt;span class="n"&gt;/etc/letsencrypt/live/mta-sts.yourapp.com/fullchain.pem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;ssl_certificate_key&lt;/span&gt; &lt;span class="n"&gt;/etc/letsencrypt/live/mta-sts.yourapp.com/privkey.pem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="n"&gt;/.well-known/mta-sts.txt&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kn"&gt;alias&lt;/span&gt; &lt;span class="n"&gt;/var/www/mta-sts/mta-sts.txt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;default_type&lt;/span&gt; &lt;span class="nc"&gt;text/plain&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you're on a static hosting platform (Netlify, Vercel, Cloudflare Pages), put the file at &lt;code&gt;/.well-known/mta-sts.txt&lt;/code&gt; and set the content type to &lt;code&gt;text/plain&lt;/code&gt;. Make sure HTTPS redirect is enabled.&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 3 — Add the DNS TXT record
&lt;/h3&gt;

&lt;p&gt;Add a TXT record at &lt;code&gt;_mta-sts.yourapp.com&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;_mta-sts.yourapp.com.  IN  TXT  "v=STSv1; id=20260101000000Z"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;id&lt;/code&gt; field is how sending servers know when your policy has changed. It's a version string — you can use a timestamp or any string up to 32 characters. &lt;strong&gt;Every time you update your policy file, update the &lt;code&gt;id&lt;/code&gt; in this DNS record.&lt;/strong&gt; Sending servers that have cached your policy check the &lt;code&gt;id&lt;/code&gt; to know whether to re-fetch.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Common mistake:&lt;/strong&gt; Updating the policy file without updating the &lt;code&gt;id&lt;/code&gt; means sending servers keep using the cached version. If you're changing from &lt;code&gt;testing&lt;/code&gt; to &lt;code&gt;enforce&lt;/code&gt;, the old cached policy stays in effect until the &lt;code&gt;max_age&lt;/code&gt; expires.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Setting up TLS Reporting (TLS-RPT)
&lt;/h2&gt;

&lt;p&gt;TLS Reporting is RFC 8460. It lets you receive reports when sending mail servers encounter TLS failures while trying to deliver to your domain.&lt;/p&gt;

&lt;p&gt;You add one DNS TXT record at &lt;code&gt;_smtp._tls.yourapp.com&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;_smtp._tls.yourapp.com.  IN  TXT  "v=TLSRPTv1; rua=mailto:tls-reports@yourapp.com"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. Sending servers that support TLS-RPT will now send daily JSON reports to that address summarizing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How many messages were delivered successfully with TLS&lt;/li&gt;
&lt;li&gt;How many failed, and why&lt;/li&gt;
&lt;li&gt;Which sending servers encountered the failures&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The reports are machine-readable JSON. You'll want either a dedicated inbox you check periodically or a service that parses and aggregates them. &lt;a href="https://report-uri.com" rel="noopener noreferrer"&gt;Report URI&lt;/a&gt; and &lt;a href="https://dmarc.postmarkapp.com" rel="noopener noreferrer"&gt;Postmark's DMARC/TLS aggregator&lt;/a&gt; both handle TLS-RPT reports.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sample report structure:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"organization-name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Google Inc."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"date-range"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"start-datetime"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-01-01T00:00:00Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"end-datetime"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-01-01T23:59:59Z"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"policies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"policy"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"policy-type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sts"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"policy-domain"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"yourapp.com"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"summary"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"total-successful-session-count"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1240&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"total-failure-session-count"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"failure-details"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"result-type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"certificate-expired"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"sending-mta-ip"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"209.85.128.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"receiving-mx-hostname"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mail.yourapp.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"failed-session-count"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three failures from certificate expiry. Without TLS-RPT, you'd never know.&lt;/p&gt;




&lt;h2&gt;
  
  
  Verifying your setup
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Check the DNS record:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dig TXT _mta-sts.yourapp.com +short
dig TXT _smtp._tls.yourapp.com +short
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Check the policy file is reachable:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-I&lt;/span&gt; https://mta-sts.yourapp.com/.well-known/mta-sts.txt
curl https://mta-sts.yourapp.com/.well-known/mta-sts.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Expected output from the first command: &lt;code&gt;HTTP/2 200&lt;/code&gt; with &lt;code&gt;content-type: text/plain&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Full validation tools:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;What it checks&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://www.mta-sts.io" rel="noopener noreferrer"&gt;mta-sts.io&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Full MTA-STS policy validation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://internet.nl" rel="noopener noreferrer"&gt;internet.nl&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Comprehensive mail security check including MTA-STS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://www.checktls.com" rel="noopener noreferrer"&gt;checktls.com&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;TLS configuration on your MX hosts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://mxtoolbox.com/mta-sts.aspx" rel="noopener noreferrer"&gt;MXToolbox&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;MTA-STS policy lookup&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Common failure modes
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Policy file returns wrong content type&lt;/strong&gt;&lt;br&gt;
Some static hosts serve &lt;code&gt;.txt&lt;/code&gt; files as &lt;code&gt;application/octet-stream&lt;/code&gt;. Sending servers will reject the policy. Set &lt;code&gt;Content-Type: text/plain&lt;/code&gt; explicitly in your hosting config.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Certificate on &lt;code&gt;mta-sts&lt;/code&gt; subdomain doesn't cover the subdomain&lt;/strong&gt;&lt;br&gt;
If you're using a wildcard cert for &lt;code&gt;*.yourapp.com&lt;/code&gt;, make sure it covers &lt;code&gt;mta-sts.yourapp.com&lt;/code&gt;. A separate cert for just the subdomain also works.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MX host certificate doesn't match hostname&lt;/strong&gt;&lt;br&gt;
Your policy file lists &lt;code&gt;mail.yourapp.com&lt;/code&gt; as an MX host. The certificate on that host needs to include &lt;code&gt;mail.yourapp.com&lt;/code&gt; in the SAN. If it only has the bare domain or a different hostname, validation will fail under &lt;code&gt;enforce&lt;/code&gt; mode.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;id&lt;/code&gt; not updated after policy change&lt;/strong&gt;&lt;br&gt;
Covered above, but worth repeating: if you change the policy file without changing the &lt;code&gt;id&lt;/code&gt;, sending servers use the stale cached version. The &lt;code&gt;id&lt;/code&gt; is how they know to re-fetch.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;HTTP redirect on the policy URL&lt;/strong&gt;&lt;br&gt;
The policy must be served directly over HTTPS. If your setup serves HTTP and redirects to HTTPS, some sending servers won't follow the redirect and will treat the policy as unavailable.&lt;/p&gt;


&lt;h2&gt;
  
  
  The rollout sequence
&lt;/h2&gt;

&lt;p&gt;Here's the order that avoids breaking inbound email:&lt;/p&gt;
&lt;h3&gt;
  
  
  Week 1-2: deploy in testing mode
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Deploy the policy file with &lt;code&gt;mode: testing&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Add both DNS records (&lt;code&gt;_mta-sts&lt;/code&gt; and &lt;code&gt;_smtp._tls&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Verify with the validation tools listed above&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Week 2-4: collect reports and fix issues
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Read the TLS-RPT reports coming into your inbox&lt;/li&gt;
&lt;li&gt;Fix any certificate or TLS config issues on your MX hosts&lt;/li&gt;
&lt;li&gt;Re-check with &lt;a href="https://www.checktls.com" rel="noopener noreferrer"&gt;checktls.com&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Week 4 onwards: switch to enforce
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Update the policy file: change &lt;code&gt;mode: testing&lt;/code&gt; to &lt;code&gt;mode: enforce&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Update the &lt;code&gt;id&lt;/code&gt; value in your &lt;code&gt;_mta-sts&lt;/code&gt; DNS TXT record&lt;/li&gt;
&lt;li&gt;Keep watching TLS-RPT reports for anything new&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Don't rush the middle step. The reports will show you things you didn't know were broken.&lt;/p&gt;


&lt;h2&gt;
  
  
  Monitoring
&lt;/h2&gt;

&lt;p&gt;Once MTA-STS is in &lt;code&gt;enforce&lt;/code&gt; mode, any DNS misconfiguration on your end can break inbound email delivery. If your policy file goes down, if the &lt;code&gt;mta-sts&lt;/code&gt; subdomain certificate expires, or if someone changes the DNS records unexpectedly, sending servers that respect MTA-STS will stop delivering to you.&lt;/p&gt;

&lt;p&gt;Two things to monitor:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The HTTPS endpoint.&lt;/strong&gt; Uptime monitoring on &lt;code&gt;https://mta-sts.yourapp.com/.well-known/mta-sts.txt&lt;/code&gt; should alert you if the file becomes unavailable or returns a non-200 status.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The DNS records.&lt;/strong&gt; If your &lt;code&gt;_mta-sts&lt;/code&gt; TXT record is modified or deleted, sending servers can't find your policy. &lt;a href="https://zerohook.org" rel="noopener noreferrer"&gt;ZeroHook&lt;/a&gt; monitors DNS records continuously and alerts you when something changes — useful not just for MTA-STS but for the full set of email security records (SPF, DKIM, DMARC, MX). One change to the wrong record can quietly break email in ways that take days to diagnose: &lt;a href="https://zerohook.org" rel="noopener noreferrer"&gt;zerohook.org&lt;/a&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  Quick reference
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;DNS records you need:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Record&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;_mta-sts.yourapp.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;TXT&lt;/td&gt;
&lt;td&gt;&lt;code&gt;v=STSv1; id=20260101000000Z&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;_smtp._tls.yourapp.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;TXT&lt;/td&gt;
&lt;td&gt;&lt;code&gt;v=TLSRPTv1; rua=mailto:tls-reports@yourapp.com&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Policy file location:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://mta-sts.yourapp.com/.well-known/mta-sts.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Policy file content:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;STSv1&lt;/span&gt;
&lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;testing&lt;/span&gt;
&lt;span class="na"&gt;mx&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mail.yourapp.com&lt;/span&gt;
&lt;span class="na"&gt;max_age&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;86400&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Rollout order:&lt;/strong&gt; deploy in &lt;code&gt;testing&lt;/code&gt; → collect reports → fix issues → switch to &lt;code&gt;enforce&lt;/code&gt; → monitor.&lt;/p&gt;




&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;SPF, DKIM, and DMARC don't protect the connection between mail servers. A network-level attacker can strip TLS from SMTP and your email travels in plaintext with no indication anything went wrong.&lt;/p&gt;

&lt;p&gt;MTA-STS fixes that by publishing a policy that says "require TLS, validate the cert, refuse delivery if it fails." TLS Reporting gives you visibility into when and why TLS is failing so you can fix it before you switch to enforce mode.&lt;/p&gt;

&lt;p&gt;Setup is two DNS records and a text file on a subdomain. The tricky part is the rollout order — start in testing, read the reports, fix your cert issues, then enforce.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Part of an ongoing series on DNS and email security.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>email</category>
      <category>dns</category>
      <category>zerohook</category>
    </item>
    <item>
      <title>Beginner-Friendly: The Small Business Owner's DNS Security Checklist</title>
      <dc:creator>Regő Botond Ronyecz</dc:creator>
      <pubDate>Thu, 04 Jun 2026 12:20:35 +0000</pubDate>
      <link>https://dev.to/rronyecz/beginner-friendly-the-small-business-owners-dns-security-checklist-1ij0</link>
      <guid>https://dev.to/rronyecz/beginner-friendly-the-small-business-owners-dns-security-checklist-1ij0</guid>
      <description>&lt;p&gt;You do not need to know what DNS stands for to use this checklist.&lt;/p&gt;

&lt;p&gt;You need to know three things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Your domain name (the part after the @ in your email address — like &lt;code&gt;yourbusiness.com&lt;/code&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Who hosts your website or where you registered your domain (GoDaddy, Namecheap, Cloudflare, or whoever sends you the renewal invoice)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;About 30 minutes&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That is enough to work through this checklist, identify what is missing on your domain, and know who to call to fix it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Matters Before Anything Else
&lt;/h2&gt;

&lt;p&gt;Every small business that owns a domain has the same three problems, usually without knowing it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problem 1: Anyone can send email pretending to be you.&lt;/strong&gt; By default, email has no authentication. If you own &lt;code&gt;yourbusiness.com&lt;/code&gt;, a scammer can send an email saying it came from &lt;code&gt;invoices@yourbusiness.com&lt;/code&gt; and most email apps will show your business name as the sender. Your customers have no way to tell the difference. Three DNS records (SPF, DKIM, DMARC) fix this — and most small businesses have none of them correctly configured.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problem 2: Your legitimate emails are landing in spam.&lt;/strong&gt; Not because you did anything wrong. Because without those same three records, Gmail and Outlook treat your emails with suspicion. Password resets, invoices, and follow-ups are going to spam folders instead of inboxes — and you have no idea.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problem 3: Your domain could be stolen or redirected.&lt;/strong&gt; The account where you registered your domain (GoDaddy, Namecheap, etc.) is the single most valuable target for someone who wants to impersonate your business. If someone gets into that account, they own your domain, your website, and your email. A few settings changes prevent this entirely.&lt;/p&gt;

&lt;p&gt;None of this requires technical expertise to fix. It requires knowing what to look for and asking the right person to action it.&lt;/p&gt;




&lt;h2&gt;
  
  
  How to Use This Checklist
&lt;/h2&gt;

&lt;p&gt;Each item below has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;What it is&lt;/strong&gt; — a plain-English explanation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;How to check&lt;/strong&gt; — the easiest way to see your current status&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Who fixes it&lt;/strong&gt; — you, your web developer, your IT person, or your hosting provider&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Priority&lt;/strong&gt; — how urgently this needs attention&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Work through the items in order. The high-priority items first. If something is above your comfort level, screenshot it and send it to whoever manages your website or IT.&lt;/p&gt;




&lt;h2&gt;
  
  
  Section 1: Your Domain Registrar Account (Do This First)
&lt;/h2&gt;

&lt;p&gt;Your domain registrar is where you registered your domain name — companies like GoDaddy, Namecheap, Cloudflare, Google Domains, or Hover. This account controls everything. Protecting it is the first step.&lt;/p&gt;




&lt;h3&gt;
  
  
  ✅ Item 1.1 — Two-Factor Authentication on Your Registrar Account
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; Two-factor authentication (2FA) means that even if someone steals your password, they cannot log in without also having your phone. It is a second lock on the front door.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; If someone gains access to your domain registrar account, they can point your domain at any website they choose — including a fake version of yours that steals your customers' passwords. This has happened to well-known businesses, not just careless ones.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to check:&lt;/strong&gt; Log in to your domain registrar. Go to account settings or security settings. Look for "Two-Factor Authentication," "2-Step Verification," or "Multi-Factor Authentication." If it is not enabled, there will be an option to turn it on.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who fixes it:&lt;/strong&gt; You. It takes five minutes. Use an authenticator app (Google Authenticator, Authy) rather than SMS if the option is available — SMS can be intercepted.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Priority: Critical. Do this today.&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  ✅ Item 1.2 — Domain Lock / Transfer Lock Enabled
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; Most registrars offer a "domain lock" that prevents your domain from being transferred to another registrar without additional verification. Unlocked domains can be stolen through a process called an unauthorized transfer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; Domain theft — transferring your domain to a registrar the attacker controls — is one of the most damaging things that can happen to a business. It takes days to recover, and your website and email are offline the entire time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to check:&lt;/strong&gt; Log in to your domain registrar. Find your domain and look for a setting called "Transfer Lock," "Registrar Lock," or "Domain Lock." It should be set to ON or LOCKED.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who fixes it:&lt;/strong&gt; You. Toggle the lock on in your registrar account.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Priority: High.&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  ✅ Item 1.3 — Your Registrar Contact Email Is Current
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; Your registrar sends renewal notices, security alerts, and transfer confirmations to the email address on file. If that address is an old personal email, a former employee's account, or an inbox nobody checks, these notifications disappear.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; Domain renewal notices going to an inbox nobody monitors is one of the most common reasons small businesses lose their domain — they miss the renewal, the domain expires, and someone else registers it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to check:&lt;/strong&gt; Log in to your registrar. Check the contact email address under account settings. Send a test email to it and confirm you receive it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who fixes it:&lt;/strong&gt; You. Update the email to one that you — or someone responsible — actively monitors.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Priority: High.&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  ✅ Item 1.4 — Auto-Renew Is Enabled for Your Domain
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; Auto-renew automatically renews your domain registration before it expires, charging the card on file.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; An expired domain goes offline immediately. Website down, email stopped, everything offline. After a 30-day grace period, the domain enters public availability. Competitors, domain squatters, or attackers can register it. Recovering it — if possible — is expensive and takes days.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to check:&lt;/strong&gt; Log in to your registrar. Find your domain. Check whether auto-renew is enabled and whether the payment card on file is current.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who fixes it:&lt;/strong&gt; You. Enable auto-renew and confirm the payment method is valid.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Priority: High.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Section 2: Email Authentication Records
&lt;/h2&gt;

&lt;p&gt;These three records (SPF, DKIM, DMARC) tell the internet that your emails are legitimate. Without them, your emails look suspicious to every inbox provider in the world. With them, you are protected against email impersonation and your delivery rates improve.&lt;/p&gt;

&lt;p&gt;You do not need to understand how they work. You need to know whether they are set up — and if not, have someone set them up.&lt;/p&gt;




&lt;h3&gt;
  
  
  ✅ Item 2.1 — SPF Record Exists and Is Correct
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; SPF (Sender Policy Framework) is a list, published in your domain's DNS, of the email services that are allowed to send email on your behalf. Think of it as an authorized sender list that inbox providers check before accepting your email.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; Without SPF, anyone can send email claiming to be from your domain and inbox providers have no way to verify it is fake. With a broken SPF record (two records, or over the 10-lookup limit), your emails may land in spam or be rejected.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to check:&lt;/strong&gt; Go to &lt;code&gt;mxtoolbox.com/spf.aspx&lt;/code&gt; and enter your domain. It will tell you whether an SPF record exists, whether it is valid, and whether there are any errors.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What to look for:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;✅ "SPF record found" with no errors — you are set&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;⚠️ "Multiple SPF records found" — there are two SPF records, which breaks email. One needs to be deleted.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;❌ "No SPF record found" — no SPF is configured&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Who fixes it:&lt;/strong&gt; Your web developer, IT person, or email provider. Give them the MXToolbox result and ask them to fix it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Priority: High.&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  ✅ Item 2.2 — DKIM Is Configured for Your Email Service
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; DKIM (DomainKeys Identified Mail) adds an invisible digital signature to every email you send. Receiving servers verify this signature to confirm the email genuinely came from you and was not altered in transit. Think of it as a tamper-evident seal on every email.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; Without DKIM, your emails lack a key trust signal that Gmail, Outlook, and Yahoo use to evaluate sender reputation. It is also required before you can set up DMARC (the next item).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to check:&lt;/strong&gt; Go to &lt;code&gt;mxtoolbox.com/dkim.aspx&lt;/code&gt;. Enter your domain. For the selector field, try &lt;code&gt;google&lt;/code&gt; if you use Google Workspace, or &lt;code&gt;selector1&lt;/code&gt; if you use Microsoft 365. If you are unsure, ask whoever set up your email.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What to look for:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;✅ "DKIM record found, valid" — you are set&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;❌ "DKIM record not found" — DKIM is not configured for that selector&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Who fixes it:&lt;/strong&gt; Your email provider or IT person. Google Workspace, Microsoft 365, and most email providers have documentation on how to configure DKIM — it involves adding a TXT record to your DNS. Your provider can walk you through it or do it for you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Priority: High.&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  ✅ Item 2.3 — DMARC Is Configured (and Not Just at p=none)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; DMARC ties SPF and DKIM together and tells inbox providers what to do when an email fails authentication — for example, when a scammer tries to send a fake invoice from your domain. It also sends you daily reports showing who is sending email as your domain.&lt;/p&gt;

&lt;p&gt;There are three DMARC policy levels:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;p=none&lt;/code&gt; — monitor only, do nothing (a starting point, not a finished configuration)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;p=quarantine&lt;/code&gt; — send suspicious emails to spam&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;p=reject&lt;/code&gt; — block suspicious emails entirely&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; &lt;code&gt;p=none&lt;/code&gt; does not protect anyone. It just collects data. The protection starts at &lt;code&gt;p=quarantine&lt;/code&gt;. Most small businesses that have DMARC configured are stuck at &lt;code&gt;p=none&lt;/code&gt; and don't know it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to check:&lt;/strong&gt; Go to &lt;code&gt;mxtoolbox.com/dmarc.aspx&lt;/code&gt; and enter your domain.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What to look for:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;✅ "DMARC record found" with &lt;code&gt;p=quarantine&lt;/code&gt; or &lt;code&gt;p=reject&lt;/code&gt; — good&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;⚠️ "DMARC record found" with &lt;code&gt;p=none&lt;/code&gt; — configured but not enforced. Ask your IT person to move it to &lt;code&gt;p=quarantine&lt;/code&gt; after confirming SPF and DKIM are passing.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;❌ "No DMARC record found" — DMARC is not configured at all&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Who fixes it:&lt;/strong&gt; Your IT person or web developer. Moving from &lt;code&gt;p=none&lt;/code&gt; to &lt;code&gt;p=quarantine&lt;/code&gt; is a single character change to a DNS record — but it should be done carefully, after confirming SPF and DKIM are working correctly first.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Priority: High.&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  ✅ Item 2.4 — You Are Not on an Email Blacklist
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; Email blacklists are databases of IP addresses and domains known to send spam. Inbox providers check these lists when deciding whether to deliver your email. If your domain or sending IP is listed, your emails may be silently rejected or sent to spam.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; Blacklistings happen to legitimate businesses — often from a compromised email account, a spam complaint, or a sudden spike in sending volume. Most businesses find out when customers stop receiving their emails.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to check:&lt;/strong&gt; Go to &lt;code&gt;mxtoolbox.com/blacklists.aspx&lt;/code&gt; and enter your domain or sending IP address. It checks against over 100 blacklists simultaneously.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What to look for:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;✅ All green — you are not listed anywhere&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;❌ One or more red items — you are listed on a blacklist. Follow the removal instructions for each list. Spamhaus, Barracuda, and SORBS each have their own removal forms.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Who fixes it:&lt;/strong&gt; You can often submit removal requests yourself — each blacklist has a form on their website. If you are listed on Spamhaus specifically, contact your IT person first as it requires explaining what caused the listing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Priority: High if listed, otherwise ongoing monitoring.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Section 3: Website and SSL Security
&lt;/h2&gt;




&lt;h3&gt;
  
  
  ✅ Item 3.1 — Your SSL Certificate Is Valid and Not Expiring Soon
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; The padlock icon in your browser that indicates a secure connection. Your website needs a valid SSL certificate to show this padlock. An expired certificate causes browsers to display a warning page that blocks visitors.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; A browser warning page stops customers from reaching your website. It looks like your site has been hacked even if it has not. It also harms your search engine rankings.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to check:&lt;/strong&gt; Visit your website. In your browser address bar, click the padlock icon. It should show "Connection is secure" and a certificate that is not expiring in the next 30 days. You can also check at &lt;code&gt;sslshopper.com/ssl-checker.html&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What to look for:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;✅ Padlock present, certificate valid for 30+ days — you are set&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;⚠️ Expiring within 30 days — contact your hosting provider to renew&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;❌ No padlock or certificate error — contact your hosting provider immediately&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Who fixes it:&lt;/strong&gt; Your hosting provider or web developer. Most hosting providers offer free SSL certificates through Let's Encrypt that auto-renew.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Priority: Critical if expired. Monitoring if valid.&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  ✅ Item 3.2 — Your Website Redirects HTTP to HTTPS
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; Your website should automatically redirect visitors from &lt;code&gt;http://yourbusiness.com&lt;/code&gt; to &lt;code&gt;https://yourbusiness.com&lt;/code&gt;. Without this redirect, some visitors — especially those following old links — reach your site over an unencrypted connection.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to check:&lt;/strong&gt; In your browser address bar, type &lt;code&gt;http://yourbusiness.com&lt;/code&gt; (with &lt;code&gt;http&lt;/code&gt;, not &lt;code&gt;https&lt;/code&gt;) and press enter. You should be automatically redirected to the &lt;code&gt;https://&lt;/code&gt; version. If you stay on &lt;code&gt;http://&lt;/code&gt;, the redirect is missing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who fixes it:&lt;/strong&gt; Your web developer or hosting provider. It is a standard configuration option on all major hosting platforms.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Priority: Medium.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Section 4: DNS Configuration
&lt;/h2&gt;

&lt;p&gt;This section requires slightly more technical knowledge — but each check has a simple tool you can use to see your status, and a clear description of what to ask your IT person to fix.&lt;/p&gt;




&lt;h3&gt;
  
  
  ✅ Item 4.1 — DNSSEC Is Enabled
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; DNSSEC is a security layer that adds a digital signature to your DNS records. Without it, it is theoretically possible for attackers to intercept the "where does this website live?" lookup that happens when someone visits your domain and redirect them to a fake website instead.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; Most small businesses do not have DNSSEC enabled because it was not on by default when they set up their domain. On modern DNS providers it takes about five minutes to enable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to check:&lt;/strong&gt; Go to &lt;code&gt;dnssec-analyzer.verisignlabs.com&lt;/code&gt; and enter your domain. A green result means DNSSEC is active and working. Red or missing means it is not configured.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who fixes it:&lt;/strong&gt; Your IT person or DNS provider. On Cloudflare, it is a one-click toggle under DNS settings. On GoDaddy, it requires a manual DS record submission. Ask your IT person to enable it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Priority: Medium — high if you are in an NIS2-regulated sector.&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  ✅ Item 4.2 — MTA-STS Is Configured (Inbound Email Encryption)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; MTA-STS forces other email servers to use encryption when delivering email to your inbox. Without it, there is a theoretical risk that email sent to you could be intercepted and read in transit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; Most email transport is encrypted by default today, but without MTA-STS there is no enforcement — an attacker in the right position can downgrade the connection. MTA-STS eliminates that possibility.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to check:&lt;/strong&gt; Go to &lt;code&gt;internet.nl/mail/yourbusiness.com/&lt;/code&gt; (replace with your domain) and look for the MTA-STS result. Or ask your IT person to check.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who fixes it:&lt;/strong&gt; Your IT person. MTA-STS requires two changes — a DNS record and a small text file hosted on a subdomain of your domain. It is a 15-minute task for someone with web hosting access.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Priority: Medium — required for NIS2 compliance.&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  ✅ Item 4.3 — CAA Records Restrict Certificate Issuance
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; CAA records tell the internet which companies are allowed to issue SSL certificates for your domain. Without them, any certificate authority in the world could issue a certificate for your website — including in response to an impersonation attack.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to check:&lt;/strong&gt; Go to &lt;code&gt;mxtoolbox.com/caa.aspx&lt;/code&gt; and enter your domain.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What to look for:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;✅ "CAA record found" — you have records restricting certificate issuance&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;❌ "No CAA records found" — any CA can issue for your domain&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Who fixes it:&lt;/strong&gt; Your IT person or DNS provider. They add a CAA record specifying your current certificate provider.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Priority: Low-medium.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Section 5: Quick Reference — Who Does What
&lt;/h2&gt;

&lt;p&gt;If you manage your website and email yourself, you can action most of these items using your registrar and hosting provider's control panel. If you have an IT person, web developer, or use a managed hosting service, forward them this checklist with the items you want actioned.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Item&lt;/th&gt;
&lt;th&gt;You can do it&lt;/th&gt;
&lt;th&gt;Needs your IT person&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Enable 2FA on registrar&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Enable domain lock&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Update registrar contact email&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Enable auto-renew&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Check SPF record&lt;/td&gt;
&lt;td&gt;✅ (check)&lt;/td&gt;
&lt;td&gt;✅ (fix)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Configure DKIM&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Configure DMARC&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Blacklist check&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SSL certificate check&lt;/td&gt;
&lt;td&gt;✅ (check)&lt;/td&gt;
&lt;td&gt;✅ (fix if expired)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Enable DNSSEC&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Configure MTA-STS&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Add CAA records&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  The One-Page Summary for Your IT Person
&lt;/h2&gt;

&lt;p&gt;If you are forwarding this to someone technical, here is the condensed version of what needs checking:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Domain security audit — please check and fix the following:

Registrar:
- 2FA enabled on registrar account?
- Transfer lock enabled?
- Auto-renew active, card current?

Email authentication:
- SPF record valid? Single record, under 10 lookups?
- DKIM configured for all sending services (Google Workspace / M365 / other)?
- DMARC at p=quarantine or p=reject? (p=none is not sufficient)
- Domain/sending IP clean on MXToolbox blacklist check?

DNS:
- DNSSEC enabled? (verify at dnssec-analyzer.verisignlabs.com)
- MTA-STS configured in enforce mode?
- CAA records restricting certificate issuance?

Website:
- SSL certificate valid, not expiring within 30 days?
- HTTP → HTTPS redirect working?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  What to Do After the Checklist
&lt;/h2&gt;

&lt;p&gt;Running through this list once is a good start. The problem is that DNS security is not a one-time task — it changes.&lt;/p&gt;

&lt;p&gt;Email services you add change which servers need to be in your SPF record. SSL certificates expire. Domains come off blacklists and go back on. DNSSEC signatures have expiry dates. Your registrar account password may be compromised without you knowing.&lt;/p&gt;

&lt;p&gt;The options for ongoing monitoring:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Manual — check quarterly.&lt;/strong&gt; Block 30 minutes in your calendar every three months to run through the checks in this list. Use the tools above. It is not automated, but it is better than checking once and forgetting about it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Automated — use a monitoring tool.&lt;/strong&gt; &lt;a href="https://zerohook.org" rel="noopener noreferrer"&gt;ZeroHook&lt;/a&gt; runs these checks automatically and alerts you when something changes or breaks — a blacklist listing, an SSL certificate approaching expiry, an SPF failure. The free tier covers one domain with SPF, DKIM, DMARC validation, blacklist monitoring, and an Email Health Score: &lt;a href="https://zerohook.org" rel="noopener noreferrer"&gt;zerohook.org&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Secure your registrar account first&lt;/strong&gt; — 2FA enabled, transfer lock on, auto-renew active, contact email current. This single step prevents domain theft.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;SPF, DKIM, and DMARC are the three email records every domain needs&lt;/strong&gt; — without them, your emails look suspicious to inbox providers and anyone can send email impersonating you&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;DMARC at&lt;/strong&gt; &lt;code&gt;p=none&lt;/code&gt; &lt;strong&gt;is not a finished configuration&lt;/strong&gt; — it monitors without protecting; ask your IT person to move it to &lt;code&gt;p=quarantine&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Check your blacklist status&lt;/strong&gt; at mxtoolbox.com/blacklists.aspx — listings happen silently and your dashboard will not tell you&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;DNSSEC and MTA-STS are the next tier&lt;/strong&gt; — not urgent for day-to-day operations, but required for NIS2 compliance and best practice for any business handling customer data&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Forward the one-page summary above to your IT person&lt;/strong&gt; — they can action the full list in an afternoon&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Part of an ongoing series on DNS security and email deliverability.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>dns</category>
      <category>cybersecurity</category>
      <category>zerohook</category>
    </item>
    <item>
      <title>How to Test Your SPF Record for Common Mistakes (Step by Step)</title>
      <dc:creator>Regő Botond Ronyecz</dc:creator>
      <pubDate>Sat, 30 May 2026 23:28:38 +0000</pubDate>
      <link>https://dev.to/rronyecz/how-to-test-your-spf-record-for-common-mistakes-step-by-step-4g3p</link>
      <guid>https://dev.to/rronyecz/how-to-test-your-spf-record-for-common-mistakes-step-by-step-4g3p</guid>
      <description>&lt;p&gt;Your SPF record looks correct. You added the include values your email provider told you to add. You saved the record. Emails are still landing in spam.&lt;/p&gt;

&lt;p&gt;The problem is almost certainly one of five things — and four of them are invisible in your DNS provider's interface. You cannot tell by looking at the record whether you have exceeded the 10-lookup limit. You cannot tell from a browser whether your propagation has completed. You cannot see from the dashboard that a second SPF record was created instead of the existing one being edited.&lt;/p&gt;

&lt;p&gt;This guide covers how to test for each of the five most common SPF mistakes, what the symptoms of each one look like, and the exact fix.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Basics: What SPF Is and What It Isn't
&lt;/h2&gt;

&lt;p&gt;SPF (Sender Policy Framework) is a TXT record published at your root domain that lists which mail servers are authorized to send email on your behalf. When a receiving server gets an email claiming to be from your domain, it checks your SPF record and asks: did the sending server have permission?&lt;/p&gt;

&lt;p&gt;The record structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;v=spf1 include:_spf.google.com include:sendgrid.net ~all
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;v=spf1&lt;/code&gt; — required, always first, identifies the record as SPF&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;include:&lt;/code&gt; — delegates authorization to another domain's SPF record&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;~all&lt;/code&gt; — soft fail: unauthorized senders are flagged but still delivered&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-all&lt;/code&gt; — hard fail: unauthorized senders are rejected entirely&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;+all&lt;/code&gt; — allows everyone: never use this&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;SPF does not encrypt email. It does not stop spam. It tells receiving servers who is allowed to send email from your domain — and when combined with DKIM and DMARC, it provides the full authentication chain that inbox providers use to decide where your email lands.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 1: Check That Your SPF Record Exists
&lt;/h2&gt;

&lt;p&gt;Before testing for mistakes, confirm the record is actually there.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dig yourdomain.com TXT +short | &lt;span class="nb"&gt;grep &lt;/span&gt;spf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Expected output:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"v=spf1 include:_spf.google.com ~all"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;If you get no output:&lt;/strong&gt; Your domain has no SPF record. Create one — the absence of SPF means any server on the internet can send email claiming to be from your domain, and receiving servers have no way to verify it is fake.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you get output but it does not start with &lt;code&gt;v=spf1&lt;/code&gt;:&lt;/strong&gt; You have a TXT record but it is not a valid SPF record. Check for typos — a common one is &lt;code&gt;v=spfl&lt;/code&gt; (lowercase L instead of the digit 1).&lt;/p&gt;




&lt;h2&gt;
  
  
  Mistake 1: Two SPF Records on the Same Domain
&lt;/h2&gt;

&lt;p&gt;This is the most common SPF mistake and the most damaging. It happens when someone creates a new SPF TXT record instead of editing the existing one — a natural thing to do if you are unfamiliar with DNS and want to add a new sending service.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The rule:&lt;/strong&gt; Only one TXT record starting with &lt;code&gt;v=spf1&lt;/code&gt; is allowed per domain. Two records instantly invalidates both. Every email you send fails SPF. The symptom — emails landing in spam or being rejected — appears immediately after the second record propagates.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to test:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dig yourdomain.com TXT +short
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Count the lines in the output that start with &lt;code&gt;v=spf1&lt;/code&gt;. If you see two, you have a duplicate.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"v=spf1 include:_spf.google.com ~all"
"v=spf1 include:sendgrid.net ~all"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is two SPF records. Both are now invalid.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The fix:&lt;/strong&gt; Go to your DNS provider. Delete one of the records. Edit the remaining one to include all the values from both:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;v=spf1 include:_spf.google.com include:sendgrid.net ~all
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Provider note:&lt;/strong&gt; DigitalOcean's DNS panel does not have an inline edit button for existing records — you delete and recreate. Cloudflare and Namecheap have pencil icons to edit in place.&lt;/p&gt;




&lt;h2&gt;
  
  
  Mistake 2: Exceeding the 10 DNS Lookup Limit (SPF PermError)
&lt;/h2&gt;

&lt;p&gt;SPF allows a maximum of 10 DNS lookups during validation. Each &lt;code&gt;include:&lt;/code&gt; directive in your record counts as one lookup. Each of those included records may itself contain &lt;code&gt;include:&lt;/code&gt; directives, which count as additional lookups — recursively.&lt;/p&gt;

&lt;p&gt;When the 10-lookup limit is exceeded, SPF validation returns a &lt;code&gt;PermError&lt;/code&gt; result. Many receiving servers treat &lt;code&gt;PermError&lt;/code&gt; the same as a hard fail — your email is rejected or sent to spam, and the SPF result in the email headers shows &lt;code&gt;permerror&lt;/code&gt; or &lt;code&gt;fail&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The problem is invisible.&lt;/strong&gt; Your record may look fine with only three &lt;code&gt;include:&lt;/code&gt; values. But if one of those included records itself includes four more records, you may already be at seven lookups before counting the rest.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to test:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The command-line approach requires manually counting recursive lookups, which is tedious. Use an online SPF checker instead — MXToolbox's SPF lookup at &lt;code&gt;mxtoolbox.com/spf.aspx&lt;/code&gt; shows the total lookup count including recursive includes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Quick local check: count your direct includes&lt;/span&gt;
dig yourdomain.com TXT +short | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="s1"&gt;'include:[^ ]*'&lt;/span&gt; | &lt;span class="nb"&gt;wc&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This counts only your direct includes, not recursive ones — use it as a first indicator. If you have 6+ direct includes, you are likely over the limit when recursive lookups are counted.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Common high-lookup culprits:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Service&lt;/th&gt;
&lt;th&gt;Include value&lt;/th&gt;
&lt;th&gt;Recursive lookups&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Google Workspace&lt;/td&gt;
&lt;td&gt;&lt;code&gt;include:_spf.google.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Microsoft 365&lt;/td&gt;
&lt;td&gt;&lt;code&gt;include:spf.protection.outlook.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SendGrid&lt;/td&gt;
&lt;td&gt;&lt;code&gt;include:sendgrid.net&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Salesforce&lt;/td&gt;
&lt;td&gt;&lt;code&gt;include:_spf.salesforce.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;3–4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mailchimp / Mandrill&lt;/td&gt;
&lt;td&gt;&lt;code&gt;include:servers.mcsv.net&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;2–3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HubSpot&lt;/td&gt;
&lt;td&gt;&lt;code&gt;include:_spf.hubspot.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Zendesk&lt;/td&gt;
&lt;td&gt;&lt;code&gt;include:mail.zendesk.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A setup with Google Workspace, SendGrid, Salesforce, HubSpot, and Zendesk is likely already over the limit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The fix:&lt;/strong&gt; Remove &lt;code&gt;include:&lt;/code&gt; entries for services you no longer use. If you legitimately use more services than the limit allows, use SPF flattening — a tool that resolves all the include chains into their constituent IP addresses and writes a single record with explicit &lt;code&gt;ip4:&lt;/code&gt; and &lt;code&gt;ip6:&lt;/code&gt; entries instead of &lt;code&gt;include:&lt;/code&gt; directives. &lt;code&gt;autospf.com&lt;/code&gt; and &lt;code&gt;dmarcian&lt;/code&gt;'s SPF Surveyor both do this. &lt;a href="https://zerohook.org" rel="noopener noreferrer"&gt;ZeroHook&lt;/a&gt; flags the PermError in its SPF audit check and shows the current lookup count alongside the fix, so you can see exactly how much headroom you have left. The tradeoff is that flattened records need to be updated whenever your email providers change their sending IPs, which happens periodically without announcement.&lt;/p&gt;




&lt;h2&gt;
  
  
  Mistake 3: Not Including All Your Sending Services
&lt;/h2&gt;

&lt;p&gt;SPF only authorizes the services explicitly listed in your record. Every service that sends email as your domain — your inbox provider, your transactional email platform, your CRM, your marketing tool, your HR system — needs to be in your SPF record or its emails will fail authentication.&lt;/p&gt;

&lt;p&gt;The symptom is partial: some emails pass SPF and some fail, which is harder to diagnose than a complete failure. DMARC reports (if you have DMARC configured with a &lt;code&gt;rua=&lt;/code&gt; address) will show exactly which sources are failing — the unauthorized senders appear in the reports with &lt;code&gt;spf=fail&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to find your sending services:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every service that has ever sent email from your domain appears in your DMARC aggregate reports. If you do not have DMARC configured yet, check your email provider's admin panel for a list of allowed senders, and audit each tool your company uses that sends any automated email: invoices, support tickets, password resets, marketing campaigns.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The standard include values for common providers:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Google Workspace:    include:_spf.google.com
Microsoft 365:       include:spf.protection.outlook.com
Zoho Mail (global):  include:zoho.com
Zoho Mail (EU):      include:zoho.eu
Zoho Mail (India):   include:zoho.in
Fastmail:            include:spf.messagingengine.com
Proton Mail:         include:_spf.protonmail.ch
Apple iCloud:        include:icloud.com
SendGrid:            include:sendgrid.net
Amazon SES:          include:amazonses.com
Mailchimp/Mandrill:  include:servers.mcsv.net
Postmark:            include:spf.mtasv.net
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify your specific include value with your provider — some (Google Workspace, Microsoft 365, Zoho) show the exact expected SPF record in their admin panel.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to test:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;After adding a new include, send a test email from that service to a Gmail account you control. In Gmail, click the three-dot menu on the email → Show original. Look for the SPF result:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight email"&gt;&lt;code&gt;&lt;span class="nt"&gt;Received-SPF&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="na"&gt; pass (google.com: domain of noreply@yourdomain.com
              designates 167.89.123.45 as permitted sender)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;pass&lt;/code&gt; means the sending service is in your SPF record. &lt;code&gt;fail&lt;/code&gt; or &lt;code&gt;softfail&lt;/code&gt; means it is not.&lt;/p&gt;




&lt;h2&gt;
  
  
  Mistake 4: Using Hard Fail (-all) Too Early
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;~all&lt;/code&gt; (soft fail) at the end of your SPF record flags unauthorized senders as suspicious but still delivers their email. The &lt;code&gt;-all&lt;/code&gt; (hard fail) rejects unauthorized senders entirely — their emails are not delivered at all.&lt;/p&gt;

&lt;p&gt;Hard fail is the correct long-term configuration. Moving to it before you have confirmed that every service sending email from your domain is listed in your SPF record causes those services' emails to be rejected. If you discover a missing service after switching to &lt;code&gt;-all&lt;/code&gt;, every email from that service has already been bouncing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to test before switching:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dig yourdomain.com TXT +short | &lt;span class="nb"&gt;grep &lt;/span&gt;spf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check whether your record ends with &lt;code&gt;~all&lt;/code&gt; or &lt;code&gt;-all&lt;/code&gt;. If you are at &lt;code&gt;-all&lt;/code&gt; and experiencing email delivery issues from specific services, the first step is switching back to &lt;code&gt;~all&lt;/code&gt; immediately:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Find the SPF TXT record in your DNS provider&lt;/li&gt;
&lt;li&gt;Edit it — change &lt;code&gt;-all&lt;/code&gt; to &lt;code&gt;~all&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Save — propagation takes 5–15 minutes&lt;/li&gt;
&lt;li&gt;Use DMARC reports to identify all failing senders&lt;/li&gt;
&lt;li&gt;Add missing services to the record&lt;/li&gt;
&lt;li&gt;Verify each service passes SPF by checking email headers&lt;/li&gt;
&lt;li&gt;Switch back to &lt;code&gt;-all&lt;/code&gt; only when all services show &lt;code&gt;spf=pass&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;The recommendation:&lt;/strong&gt; Start with &lt;code&gt;~all&lt;/code&gt;. Run in soft-fail mode for at least two to four weeks while reviewing DMARC reports. Switch to &lt;code&gt;-all&lt;/code&gt; only after you are confident the record is complete.&lt;/p&gt;

&lt;p&gt;Never use &lt;code&gt;+all&lt;/code&gt;. It authorizes every server in the world to send email as your domain and completely defeats the purpose of SPF.&lt;/p&gt;




&lt;h2&gt;
  
  
  Mistake 5: Not Waiting for Propagation Before Testing
&lt;/h2&gt;

&lt;p&gt;DNS changes do not take effect instantly. Your DNS provider saves the record immediately, but cached versions of your old record persist at resolvers around the world until the TTL expires. If your SPF record's TTL is set to 3600 (one hour), changes may take up to an hour to reach all resolvers.&lt;/p&gt;

&lt;p&gt;The symptom: you make a change, test immediately, and see the old result. You assume the change did not save. You make the change again. You now have a duplicate record (Mistake 1).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to test propagation:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check what your specific nameserver is serving right now:&lt;/span&gt;
dig yourdomain.com TXT +short @ns1.yourdomain.com

&lt;span class="c"&gt;# Check what Google's resolver sees (may still be cached):&lt;/span&gt;
dig yourdomain.com TXT +short @8.8.8.8

&lt;span class="c"&gt;# Check what Cloudflare's resolver sees:&lt;/span&gt;
dig yourdomain.com TXT +short @1.1.1.1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If your nameserver shows the new record but &lt;code&gt;@8.8.8.8&lt;/code&gt; shows the old one, propagation is still in progress. Wait and test again.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Typical propagation times by provider:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;DNS Provider&lt;/th&gt;
&lt;th&gt;Typical propagation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cloudflare&lt;/td&gt;
&lt;td&gt;5–15 minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GoDaddy&lt;/td&gt;
&lt;td&gt;15–30 minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Namecheap&lt;/td&gt;
&lt;td&gt;15–30 minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AWS Route53&lt;/td&gt;
&lt;td&gt;5–15 minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DigitalOcean&lt;/td&gt;
&lt;td&gt;15–30 minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hostinger&lt;/td&gt;
&lt;td&gt;15–60 minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These are typical times — propagation can take longer if a resolver has cached your record with a high TTL. Check your current TTL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dig yourdomain.com TXT
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Look for the TTL value in the answer section (the number between the domain name and the record type). If it shows &lt;code&gt;3600&lt;/code&gt;, resolvers will cache the old record for up to an hour.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Full SPF Verification Sequence
&lt;/h2&gt;

&lt;p&gt;Run through this sequence in order after making any SPF change:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Confirm only one SPF record exists&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dig yourdomain.com TXT +short | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"v=spf1"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output must be &lt;code&gt;1&lt;/code&gt;. If it is &lt;code&gt;2&lt;/code&gt; or higher, delete the duplicate before continuing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Check lookup count&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Run your record through &lt;code&gt;mxtoolbox.com/spf.aspx&lt;/code&gt; and confirm total lookup count is 10 or under.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Confirm propagation to major resolvers&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dig yourdomain.com TXT +short @8.8.8.8 | &lt;span class="nb"&gt;grep &lt;/span&gt;spf
dig yourdomain.com TXT +short @1.1.1.1 | &lt;span class="nb"&gt;grep &lt;/span&gt;spf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both should return the same record.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4: Send a test email and check headers&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Send an email from your mail client (or from a service you just added to SPF) to a Gmail address you control. In Gmail, click the three-dot menu → Show original. Look for:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight email"&gt;&lt;code&gt;&lt;span class="nt"&gt;Received-SPF&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="na"&gt; pass&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight email"&gt;&lt;code&gt;&lt;span class="nt"&gt;Authentication-Results&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="na"&gt; ... spf=pass&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;spf=pass&lt;/code&gt; — authorized, SPF configured correctly for this sender.&lt;br&gt;
&lt;code&gt;spf=softfail&lt;/code&gt; — sender is not in your SPF record, but you are using &lt;code&gt;~all&lt;/code&gt;.&lt;br&gt;
&lt;code&gt;spf=fail&lt;/code&gt; — sender is not in your SPF record and you are using &lt;code&gt;-all&lt;/code&gt;.&lt;br&gt;
&lt;code&gt;spf=none&lt;/code&gt; — no SPF record found (propagation not complete, or record missing).&lt;br&gt;
&lt;code&gt;spf=permerror&lt;/code&gt; — the record exceeds the 10-lookup limit or has a syntax error.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5: Check DMARC reports&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you have DMARC configured with a &lt;code&gt;rua=&lt;/code&gt; address, check the reports after 24 hours. Every sender that appears with &lt;code&gt;spf=fail&lt;/code&gt; in the aggregate reports is a service you are missing from your SPF record.&lt;/p&gt;


&lt;h2&gt;
  
  
  Quick Reference: SPF Include Values by Provider
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Email Provider&lt;/th&gt;
&lt;th&gt;Include value to add to SPF&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Google Workspace&lt;/td&gt;
&lt;td&gt;&lt;code&gt;include:_spf.google.com&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Microsoft 365 / Outlook&lt;/td&gt;
&lt;td&gt;&lt;code&gt;include:spf.protection.outlook.com&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Zoho Mail (global)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;include:zoho.com&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Zoho Mail (EU datacenter)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;include:zoho.eu&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Zoho Mail (India datacenter)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;include:zoho.in&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fastmail&lt;/td&gt;
&lt;td&gt;&lt;code&gt;include:spf.messagingengine.com&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Proton Mail&lt;/td&gt;
&lt;td&gt;&lt;code&gt;include:_spf.protonmail.ch&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Apple iCloud&lt;/td&gt;
&lt;td&gt;&lt;code&gt;include:icloud.com&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SendGrid&lt;/td&gt;
&lt;td&gt;&lt;code&gt;include:sendgrid.net&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Amazon SES&lt;/td&gt;
&lt;td&gt;&lt;code&gt;include:amazonses.com&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Postmark&lt;/td&gt;
&lt;td&gt;&lt;code&gt;include:spf.mtasv.net&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Assemble your record by combining the relevant values:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;v=spf1 include:_spf.google.com include:sendgrid.net ~all
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One record. All services listed. Under 10 total lookups. Ending in &lt;code&gt;~all&lt;/code&gt; to start, &lt;code&gt;-all&lt;/code&gt; after verification.&lt;/p&gt;




&lt;h2&gt;
  
  
  Provider-Specific Notes
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Cloudflare:&lt;/strong&gt; Never set the proxy toggle (orange cloud) on TXT records. SPF records must always be DNS only (grey cloud). The orange cloud is only for A and AAAA records that you want proxied through Cloudflare's CDN.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AWS Route53:&lt;/strong&gt; TXT record values must be wrapped in double quotes in the Value field. Enter &lt;code&gt;"v=spf1 include:_spf.google.com ~all"&lt;/code&gt; with the quotes — Route53 requires them. Other providers do not.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GoDaddy:&lt;/strong&gt; The Host field for root domain records should be &lt;code&gt;@&lt;/code&gt;. GoDaddy adds your domain name automatically — do not type the full domain name in the Host field or the record will be created at &lt;code&gt;yourdomain.com.yourdomain.com&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DigitalOcean:&lt;/strong&gt; Does not have an inline edit button for DNS records. To update an SPF record, delete the existing one and create a new one with the updated value. Do not create a second record before deleting the first.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Namecheap:&lt;/strong&gt; Uses a green checkmark button (not a Save button) to confirm record changes. Clicking away without clicking the checkmark discards the change without warning.&lt;/p&gt;




&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Only one SPF record is allowed per domain&lt;/strong&gt; — creating a second one instead of editing the existing one instantly breaks all email delivery. Check with &lt;code&gt;dig yourdomain.com TXT +short | grep -c "v=spf1"&lt;/code&gt; — the answer must be &lt;code&gt;1&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The 10-lookup limit is recursive and invisible&lt;/strong&gt; — use an online SPF checker to count total lookups including nested includes before assuming your record is under the limit&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Start with &lt;code&gt;~all&lt;/code&gt; (soft fail), not &lt;code&gt;-all&lt;/code&gt; (hard fail)&lt;/strong&gt; — switch to hard fail only after DMARC reports confirm every sending service passes SPF&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wait for propagation before testing&lt;/strong&gt; — changes take 5–60 minutes to reach external resolvers depending on your provider; check with &lt;code&gt;dig @8.8.8.8&lt;/code&gt; to see what Google's resolver sees&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;spf=pass&lt;/code&gt; in Gmail's Show Original is the ground truth&lt;/strong&gt; — that is the only check that confirms SPF is working end to end for a specific sending service&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DMARC reports show every sender failing SPF&lt;/strong&gt; — if you have &lt;code&gt;rua=&lt;/code&gt; configured, the aggregate reports identify every unauthorized sender and every legitimate sender that is missing from your record&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run the full audit on your domain&lt;/strong&gt; — ZeroHook checks SPF syntax, lookup count, duplicate records, and missing senders in one pass, with provider-specific fix steps included: &lt;a href="https://zerohook.org" rel="noopener noreferrer"&gt;zerohook.org&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;*Part of an ongoing series on email deliverability and DNS security.&lt;/p&gt;

</description>
      <category>email</category>
      <category>cybersecurity</category>
      <category>dns</category>
      <category>spf</category>
    </item>
    <item>
      <title>The Anatomy of a 30-Point Security Audit (And Why Every Domain Needs One)</title>
      <dc:creator>Regő Botond Ronyecz</dc:creator>
      <pubDate>Sat, 30 May 2026 01:34:06 +0000</pubDate>
      <link>https://dev.to/rronyecz/the-anatomy-of-a-30-point-security-audit-and-why-every-domain-needs-one-1lm6</link>
      <guid>https://dev.to/rronyecz/the-anatomy-of-a-30-point-security-audit-and-why-every-domain-needs-one-1lm6</guid>
      <description>&lt;p&gt;Most domains have between six and ten security misconfigurations that their owners do not know about.&lt;/p&gt;

&lt;p&gt;Not because the owners are careless. Because DNS is a layered system built over four decades, where each layer adds its own records, requirements, and failure modes — and where a misconfiguration in one layer often has no visible symptom until an attacker finds it first.&lt;/p&gt;

&lt;p&gt;An open DNS resolver. A dangling CNAME pointing to a deleted Heroku app. An SMTP server that answers user enumeration queries. A DNSSEC chain with an expired signature. None of these appear in uptime monitors. None of them trigger alerts. All of them are exploitable.&lt;/p&gt;

&lt;p&gt;A structured security audit checks every layer systematically. This post walks through all 30 checks — what each one tests, what a failure means in practice, and why the check exists.&lt;/p&gt;




&lt;h2&gt;
  
  
  How the Audit Is Organized
&lt;/h2&gt;

&lt;p&gt;The 30 checks fall into five categories, each targeting a different attack surface on the same domain.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Checks&lt;/th&gt;
&lt;th&gt;What it covers&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Email Security&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;Authentication, deliverability, blacklist status&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DNS Security&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;Record integrity, configuration, cryptography&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Infrastructure Security&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Server exposure, zone data, redundancy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Compliance Mapping&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;NIS2, GDPR, ISO 27001, PCI-DSS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Additional Checks&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Certificate and domain expiry&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Every check produces one of three outputs: pass, fail with severity rating, or warning. Every fail produces a fix guide. The aggregate result is an Email Health Score from 0 to 100.&lt;/p&gt;




&lt;h2&gt;
  
  
  Category 1: Email Security (8 Checks)
&lt;/h2&gt;

&lt;p&gt;These eight checks cover everything that determines whether your outgoing email reaches the inbox — and whether your domain can be spoofed to send email you never sent.&lt;/p&gt;




&lt;h3&gt;
  
  
  Check 1: SPF Record Validation
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it tests:&lt;/strong&gt; Whether a TXT record starting with &lt;code&gt;v=spf1&lt;/code&gt; exists at your root domain, whether it is syntactically valid, and whether it lists all your authorized sending services without exceeding the 10 DNS lookup limit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What failure looks like:&lt;/strong&gt; No SPF record means any server on the internet can send email claiming to be from your domain, and receiving servers have no mechanism to verify it is fake. A broken SPF record — syntactically invalid or over the 10-lookup limit — produces an SPF &lt;code&gt;PermError&lt;/code&gt;, which many receiving servers treat the same as a hard fail.&lt;/p&gt;

&lt;p&gt;The two-record failure is particularly common: a company adds a second SPF TXT record instead of editing the existing one. Having two &lt;code&gt;v=spf1&lt;/code&gt; records on the same domain immediately invalidates both. Every email you send fails SPF. The symptom — emails landing in spam — appears days later and is hard to trace back to the DNS change.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; SPF is the first authentication layer that inbox providers check. Without it, your domain has no control over who can send email in your name.&lt;/p&gt;




&lt;h3&gt;
  
  
  Check 2: DKIM Signing Verification
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it tests:&lt;/strong&gt; Whether DKIM TXT records exist for your active email selectors, whether the keys are present (not revoked with &lt;code&gt;p=&lt;/code&gt;), and whether the key length is 2048 bits or higher.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What failure looks like:&lt;/strong&gt; Missing DKIM means every email you send goes unsigned. Receiving servers cannot verify the email came from you — it is treated as unauthenticated. Weak 1024-bit keys can be computationally cracked, allowing an attacker to forge valid DKIM signatures for your domain. Revoked keys (&lt;code&gt;p=&lt;/code&gt; with no value) indicate a service that has been removed from your stack but whose DNS records were never cleaned up.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; DKIM is the cryptographic proof that an email bearing your domain name was actually sent by you and was not modified in transit. Gmail and Outlook increasingly deprioritize unsigned email from domains where DKIM is expected.&lt;/p&gt;




&lt;h3&gt;
  
  
  Check 3: DMARC Policy Enforcement
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it tests:&lt;/strong&gt; Whether a DMARC record exists at &lt;code&gt;_dmarc.yourdomain.com&lt;/code&gt;, whether the &lt;code&gt;p=&lt;/code&gt; policy is set to &lt;code&gt;quarantine&lt;/code&gt; or &lt;code&gt;reject&lt;/code&gt;, and whether a &lt;code&gt;rua=&lt;/code&gt; reporting address is configured.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What failure looks like:&lt;/strong&gt; No DMARC record means SPF and DKIM results are never coordinated — a receiving server that sees SPF pass and DKIM fail has no policy to apply. &lt;code&gt;p=none&lt;/code&gt; means the policy exists but takes no action: spoofed emails still reach recipients' inboxes. No &lt;code&gt;rua=&lt;/code&gt; address means you receive no reports and have no visibility into authentication failures or unauthorized senders using your domain.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; DMARC ties SPF and DKIM together and gives the receiving server an explicit instruction for what to do when authentication fails. It is the only control that actively blocks email domain spoofing. NIS2 and SOC2 CC6.6 both require enforcement (&lt;code&gt;p=quarantine&lt;/code&gt; or &lt;code&gt;p=reject&lt;/code&gt;) — &lt;code&gt;p=none&lt;/code&gt; satisfies neither.&lt;/p&gt;




&lt;h3&gt;
  
  
  Check 4: BIMI Logo and VMC Validation
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it tests:&lt;/strong&gt; Whether a BIMI TXT record exists at &lt;code&gt;default._bimi.yourdomain.com&lt;/code&gt;, whether the logo URL in the record is reachable over HTTPS, and whether the SVG file passes BIMI format requirements (SVG Tiny 1.2). If a VMC certificate URL is present in the &lt;code&gt;a=&lt;/code&gt; field, that is validated separately.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What failure looks like:&lt;/strong&gt; A BIMI record pointing to an unreachable logo URL silently fails — no logo appears in the inbox and no error is reported. A standard SVG file that has not been converted to SVG Tiny 1.2 fails validation at the mail client level. A BIMI record without &lt;code&gt;p=quarantine&lt;/code&gt; or &lt;code&gt;p=reject&lt;/code&gt; DMARC has no effect regardless of the logo configuration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; BIMI is the only control that makes your brand visually identifiable in the inbox before the email is opened. Its prerequisites — enforced DMARC and a compliant SVG — are checked as part of this audit step.&lt;/p&gt;




&lt;h3&gt;
  
  
  Check 5: MTA-STS Configuration
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it tests:&lt;/strong&gt; Whether an &lt;code&gt;_mta-sts&lt;/code&gt; TXT record exists at your domain, whether the policy file is reachable at &lt;code&gt;https://mta-sts.yourdomain.com/.well-known/mta-sts.txt&lt;/code&gt;, and whether the policy specifies &lt;code&gt;mode: enforce&lt;/code&gt; (not &lt;code&gt;mode: testing&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What failure looks like:&lt;/strong&gt; No MTA-STS means inbound email delivery to your domain has no transport security enforcement — a network attacker on the path between a remote mail server and yours can strip TLS and transmit the email in plaintext. &lt;code&gt;mode: testing&lt;/code&gt; collects data but does not prevent this. A policy file served over HTTP (not HTTPS) is ignored by the spec.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; MTA-STS is the email equivalent of HTTPS enforcement — it prevents downgrade attacks on your inbound email transport. ISO 27001:2022 Annex A.5.14 and NIS2 Article 21.2j both reference transport encryption for email communications.&lt;/p&gt;




&lt;h3&gt;
  
  
  Check 6: TLS-RPT Monitoring Setup
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it tests:&lt;/strong&gt; Whether a &lt;code&gt;_smtp._tls&lt;/code&gt; TXT record exists at your domain with a &lt;code&gt;rua=&lt;/code&gt; reporting address.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What failure looks like:&lt;/strong&gt; No TLS-RPT means you receive no reports when other mail servers fail to establish TLS connections when delivering to your domain. TLS negotiation failures are silent — email may be delayed or dropped and you have no visibility into why.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; TLS-RPT is the monitoring companion to MTA-STS. MTA-STS enforces transport security; TLS-RPT tells you when enforcement is causing delivery failures or when TLS negotiation is being blocked. Without it, MTA-STS enforcement is a one-way door — you cannot see whether it is working correctly.&lt;/p&gt;




&lt;h3&gt;
  
  
  Check 7: DMARC Reporting (RUA) Validation
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it tests:&lt;/strong&gt; Whether the DMARC record includes a &lt;code&gt;rua=mailto:&lt;/code&gt; address that is reachable — specifically whether the receiving domain at the &lt;code&gt;rua=&lt;/code&gt; address has published a DMARC external reporting authorization record if it differs from the sending domain.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What failure looks like:&lt;/strong&gt; A &lt;code&gt;rua=&lt;/code&gt; address that points to a domain you no longer control stops receiving reports silently. A third-party reporting address (e.g., a DMARC analysis service) that has not published the external reporting authorization record causes report delivery to fail — you configure reporting, assume it is working, and receive nothing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; DMARC reports are the primary mechanism for discovering unauthorized senders using your domain and for verifying that your authentication is working correctly. The reporting check confirms reports are actually being delivered, not just configured.&lt;/p&gt;




&lt;h3&gt;
  
  
  Check 8: Blacklist Monitoring (50+ Databases)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it tests:&lt;/strong&gt; Whether your sending IP address or domain is listed on any of 50+ DNS-based blacklists, including Spamhaus ZEN (SBL, XBL, PBL), Barracuda BRBL, SpamCop, SORBS, and Microsoft SNDS.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What failure looks like:&lt;/strong&gt; A Spamhaus ZEN listing blocks delivery to approximately 3 billion mailboxes. Most blacklist listings produce no bounce notice to the sender — email is silently rejected or dropped. The sender's dashboard shows emails as delivered. Recipients never see them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; Blacklist placement is one of the fastest-moving and highest-impact email deliverability events. A single compromised account or a sending volume spike can trigger a listing within hours. The only way to know your status is to check continuously — a clean result from a manual check last month says nothing about your status today.&lt;/p&gt;




&lt;h2&gt;
  
  
  Category 2: DNS Security (10 Checks)
&lt;/h2&gt;

&lt;p&gt;These ten checks audit the integrity, configuration, and cryptographic security of your DNS zone — the infrastructure that everything else depends on.&lt;/p&gt;




&lt;h3&gt;
  
  
  Check 9: DNSSEC Validation
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it tests:&lt;/strong&gt; Whether DNSSEC signing is active on your zone (DNSKEY records present), whether a DS record exists in the parent zone establishing the chain of trust, and whether signatures are valid and not expired.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What failure looks like:&lt;/strong&gt; No DNSSEC means DNS responses for your domain carry no cryptographic proof of authenticity — cache poisoning attacks can substitute forged responses and resolvers have no way to detect the substitution. An expired DNSSEC signature causes validating resolvers to return SERVFAIL for your domain, which is indistinguishable from a DNS outage for roughly 30% of users (those whose resolvers validate DNSSEC).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; DNSSEC is the only DNS-layer defense against cache poisoning and DNS hijacking via forged responses. NIS2 Article 21.2g and ISO 27001:2022 Annex A.8.20 both reference cryptographic controls for DNS.&lt;/p&gt;




&lt;h3&gt;
  
  
  Check 10: CAA Records
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it tests:&lt;/strong&gt; Whether Certificate Authority Authorization records exist at your domain specifying which CAs are permitted to issue TLS certificates.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What failure looks like:&lt;/strong&gt; No CAA records mean any of the hundreds of publicly trusted certificate authorities in the world can issue a certificate for your domain — including in response to a social engineering attack or a rogue CA. The audit detects your current CA from your existing SSL certificate and flags if CAA records are missing or if the authorized CA does not match your actual certificate issuer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; CAA records are a pre-issuance control on certificate fraud. They do not prevent an attacker from attempting to obtain a fraudulent certificate, but they prevent a non-authorized CA from issuing one.&lt;/p&gt;




&lt;h3&gt;
  
  
  Check 11: Nameserver Configuration and Redundancy
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it tests:&lt;/strong&gt; Whether your domain has at least two nameservers, whether they are reachable and responding correctly, and whether they return consistent answers (zone consistency between primary and secondary).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What failure looks like:&lt;/strong&gt; A single nameserver is a single point of failure — one server going offline takes your domain completely offline. Inconsistent zones between nameservers (zone transfer lag or misconfiguration) can cause different users to receive different DNS answers for the same query.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; DNS availability is the prerequisite for every other internet service. Email delivery, website availability, and API connectivity all depend on DNS resolving correctly.&lt;/p&gt;




&lt;h3&gt;
  
  
  Check 12: CNAME Chain Analysis
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it tests:&lt;/strong&gt; Whether any CNAME records on your domain create excessively long chains (standard limit is 8 hops) or create circular references that would cause resolution to fail.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What failure looks like:&lt;/strong&gt; CNAME chains longer than 8 hops are truncated by some resolvers, causing the final record to fail to resolve. Circular CNAMEs — where A points to B and B points to A — cause resolution to loop until timeout.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; Long or broken CNAME chains produce intermittent resolution failures that are difficult to diagnose and appear as random downtime to users.&lt;/p&gt;




&lt;h3&gt;
  
  
  Check 13: SOA Parameters Validation
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it tests:&lt;/strong&gt; Whether the Start of Authority record's timing parameters (REFRESH, RETRY, EXPIRE, MINIMUM TTL) are within RFC-recommended ranges.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What failure looks like:&lt;/strong&gt; An EXPIRE value that is too short causes secondary nameservers to stop serving the zone if they cannot reach the primary — a primary nameserver outage triggers a full zone outage much sooner than necessary. A MINIMUM TTL that is too low causes excessive negative caching traffic. Values that deviate significantly from RFC recommendations often indicate a zone that has never been audited.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; SOA parameters control zone reliability and propagation behavior. Incorrect values create fragility that only surfaces under failure conditions.&lt;/p&gt;




&lt;h3&gt;
  
  
  Check 14: TTL Optimization Analysis
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it tests:&lt;/strong&gt; Whether TTL values on your DNS records are set appropriately — not so low that they cause excessive query load, not so high that DNS changes take days to propagate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What failure looks like:&lt;/strong&gt; TTL values under 60 seconds on stable records create unnecessary query volume without meaningful benefit. TTL values of 86400 (24 hours) on records that might need to change during an incident mean that DNS changes take a full day to reach all resolvers — a significant problem during a migration or a security incident.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; TTL is a reliability lever. Appropriate TTL values give you fast propagation when you need it and low query load when you do not.&lt;/p&gt;




&lt;h3&gt;
  
  
  Check 15: PTR / Reverse DNS Check
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it tests:&lt;/strong&gt; Whether your mail server's IP address has a PTR (Pointer) record that resolves to a hostname matching your domain, and whether that hostname forward-resolves back to the same IP.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What failure looks like:&lt;/strong&gt; A missing PTR record is one of the most common reasons email is filtered as spam by Gmail, Outlook, and Yahoo. These providers perform a PTR lookup on the sending IP and compare the result to the HELO hostname. A mismatch or a missing record is a strong spam signal. A PTR record that resolves to a generic hostname like &lt;code&gt;ip-192-0-2-1.ec2.internal&lt;/code&gt; instead of a mail hostname is nearly as bad.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; PTR validation is one of the first checks major inbox providers perform on inbound email. It is configurable at your hosting provider (AWS EC2, DigitalOcean, Hetzner, etc.) and is frequently overlooked on new mail server setups.&lt;/p&gt;




&lt;h3&gt;
  
  
  Check 16: Open Resolver Detection
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it tests:&lt;/strong&gt; Whether your nameserver answers recursive DNS queries from arbitrary external IP addresses.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What failure looks like:&lt;/strong&gt; An open resolver will appear in public databases used by DDoS attack operators within days of being discovered. Attackers send small forged DNS queries to your server with a victim's IP as the source address. Your server sends large responses to the victim, multiplying the attacker's bandwidth by 30–70×. Your server's IP may be blacklisted by upstream providers as a result.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; An open resolver turns your DNS infrastructure into an amplification tool for attacks on others — and an operational liability for you.&lt;/p&gt;




&lt;h3&gt;
  
  
  Check 17: DNS Performance Benchmarking
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it tests:&lt;/strong&gt; Response time from your nameservers measured from multiple geographic locations, and whether any nameserver is returning DNS timeouts rather than responses.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What failure looks like:&lt;/strong&gt; Response times above 200ms from major geographic regions indicate a DNS provider with poor coverage or a nameserver that is geographically distant from that region's users. Timeouts are more serious — a nameserver returning timeouts means some resolvers cannot reach it at all, causing resolution failures for a subset of users.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; DNS response time is the first component of every web request, email delivery check, and API call. High DNS latency adds directly to page load time and service availability perception.&lt;/p&gt;




&lt;h3&gt;
  
  
  Check 18: DANE / TLSA Records
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it tests:&lt;/strong&gt; Whether TLSA records exist for your mail server, pinning the TLS certificate or public key that connecting servers should expect.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What failure looks like:&lt;/strong&gt; No TLSA records mean email transport TLS has no certificate pinning — a compromised CA can issue a fraudulent certificate for your mail server and a man-in-the-middle attacker could use it to intercept email in transit, with no mechanism for the sending server to detect the substitution.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; DANE (DNS-Based Authentication of Named Entities) is the mail server equivalent of certificate pinning. It requires DNSSEC to be active — DNSSEC signs the TLSA records, making them tamper-evident. Without DNSSEC, DANE is not implementable.&lt;/p&gt;




&lt;h2&gt;
  
  
  Category 3: Infrastructure Security (6 Checks)
&lt;/h2&gt;

&lt;p&gt;These six checks look at your server exposure and zone data — the attack surface that exists below the DNS record layer.&lt;/p&gt;




&lt;h3&gt;
  
  
  Check 19: Subdomain Takeover Detection
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it tests:&lt;/strong&gt; Whether any CNAME records on your domain point to external resources (Heroku apps, S3 buckets, GitHub Pages, Azure web apps, Netlify sites, etc.) that no longer exist and are therefore claimable by anyone.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What failure looks like:&lt;/strong&gt; A CNAME pointing to &lt;code&gt;yourapp-staging.herokuapp.com&lt;/code&gt; where that Heroku app has been deleted means anyone can create a new Heroku app with that name and immediately receive all HTTP traffic sent to that subdomain — including session cookies scoped to your root domain. The attacker serves content from a URL that reads &lt;code&gt;staging.yourdomain.com&lt;/code&gt; with a valid SSL certificate and no browser warnings. Azure, S3, GitHub Pages, Fastly, Shopify, and many other platforms have the same vulnerability pattern.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; Subdomain takeover is one of the most exploitable vulnerabilities in the category because it requires no access to your systems — only access to the third-party platform, which is open to anyone. The fix is deletion of the dangling CNAME record.&lt;/p&gt;




&lt;h3&gt;
  
  
  Check 20: Zone Transfer Vulnerability Test
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it tests:&lt;/strong&gt; Whether your nameservers respond to DNS zone transfer requests (AXFR queries) from arbitrary IP addresses.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What failure looks like:&lt;/strong&gt; A successful zone transfer dumps your entire DNS zone — every record, every hostname, every subdomain, every internal service — to anyone who asks. This is reconnaissance of your entire infrastructure handed to an attacker in one query. Properly configured nameservers restrict zone transfers to authorized secondary nameservers only.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Test if your nameserver allows unrestricted zone transfers&lt;/span&gt;
dig axfr yourdomain.com @ns1.yourdomain.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A response with actual zone data is a critical failure. A response of &lt;code&gt;Transfer failed&lt;/code&gt; or &lt;code&gt;REFUSED&lt;/code&gt; is the correct behavior.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; Zone transfer exposure is a configuration error that has no legitimate use case for external access. It provides complete infrastructure reconnaissance to anyone who checks.&lt;/p&gt;




&lt;h3&gt;
  
  
  Check 21: DNS Flood Protection Evaluation
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it tests:&lt;/strong&gt; Whether your DNS infrastructure has Response Rate Limiting (RRL) configured, or whether it is protected by a managed provider's Anycast network that absorbs flood attacks at the network level.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What failure looks like:&lt;/strong&gt; An unprotected nameserver with no RRL can be used as an amplification device in DDoS attacks — attackers send small queries and your server sends large responses to a victim's IP. Separately, NXDomain flood attacks (DNS Water Torture) send queries for random subdomains of your domain, exhausting your nameserver's resources.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; Managed DNS providers (Cloudflare, Route53, Google Cloud DNS) handle this automatically through their Anycast infrastructure. Self-hosted nameservers require explicit RRL configuration in BIND, Unbound, or NSD.&lt;/p&gt;




&lt;h3&gt;
  
  
  Check 22: Geographic Redundancy Analysis
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it tests:&lt;/strong&gt; Whether your nameservers are distributed across geographically and network-diverse locations, or whether they are concentrated in a single region or autonomous system.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What failure looks like:&lt;/strong&gt; Two nameservers in the same data center, on the same AS, or with the same upstream provider are not meaningfully redundant — a regional outage or a BGP routing incident that affects that provider takes both offline simultaneously. Fewer than three distinct networks detected across all nameservers is a warning indicator.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; Geographic redundancy determines whether your domain remains reachable during regional internet incidents. NIS2 Article 21.2c (business continuity) requires resilient infrastructure for this reason.&lt;/p&gt;




&lt;h3&gt;
  
  
  Check 23: MX Record Validation
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it tests:&lt;/strong&gt; Whether your MX records are syntactically correct, whether the hostnames in MX records resolve to valid IP addresses, and whether multiple MX records exist with different priority values for failover.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What failure looks like:&lt;/strong&gt; An MX record pointing to a hostname that does not resolve means email delivery to your domain fails for all senders whose MX resolution hits that record. A single MX record with no backup means your entire inbound email delivery depends on one server.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; MX misconfiguration is one of the most direct paths to complete email delivery failure. It is also one of the easiest checks to overlook after a mail server migration.&lt;/p&gt;




&lt;h3&gt;
  
  
  Check 24: SMTP VRFY/EXPN Exposure Check
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it tests:&lt;/strong&gt; Whether your mail server responds to SMTP VRFY commands from arbitrary external connections — queries that ask whether a specific email address exists at your domain.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What failure looks like:&lt;/strong&gt; A mail server that responds to VRFY with &lt;code&gt;250 User exists&lt;/code&gt; or &lt;code&gt;252 Cannot VRFY user&lt;/code&gt; (confirming the query was processed) allows attackers to enumerate valid email addresses at your domain. A list of valid email addresses is a prerequisite for targeted phishing and spear phishing campaigns. The audit connects to your actual mail server (identified from your MX records) and probes VRFY directly — it reports the actual response received, not a theoretical vulnerability.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; User enumeration through SMTP VRFY is a reconnaissance step that precedes targeted phishing attacks. Disabling VRFY has no impact on legitimate email delivery — the command is used only by diagnostic tools and attackers.&lt;/p&gt;




&lt;h2&gt;
  
  
  Category 4: Compliance Mapping (4 Frameworks)
&lt;/h2&gt;

&lt;p&gt;The compliance checks do not add new technical tests — they map the results of the preceding 24 checks against the specific control requirements of four frameworks, identify which controls are missing or insufficient for each framework, and produce a compliance gap analysis with a score per framework.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NIS2 (EU Directive 2022/2555):&lt;/strong&gt; Maps against Article 21.2c (business continuity → nameserver redundancy), 21.2d (supply chain → SPF, DKIM, DMARC enforcement), 21.2g (cryptography → DNSSEC, MTA-STS), and 21.2j (secure communications → TLS-RPT).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GDPR (EU 2016/679):&lt;/strong&gt; Maps against data transmission security requirements — specifically MTA-STS enforcement, DMARC &lt;code&gt;p=reject&lt;/code&gt;, and DNSSEC as controls over data-in-transit protection.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ISO/IEC 27001:2022:&lt;/strong&gt; Maps against Annex A.5.14 (information transfer — DMARC, MTA-STS, SPF, DKIM), A.8.16 (monitoring activities — DMARC RUA, TLS-RPT), A.8.20 (network security — DNSSEC, CAA, nameserver redundancy), and A.8.12 (data leakage prevention — DMARC &lt;code&gt;p=reject&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PCI-DSS v4.0:&lt;/strong&gt; Maps against email security controls relevant to cardholder data environments — authentication requirements and transport encryption standards.&lt;/p&gt;




&lt;h2&gt;
  
  
  Category 5: Additional Checks (2 Checks)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Check 29: SSL Certificate Expiry Monitoring
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it tests:&lt;/strong&gt; Whether your domain's SSL certificate is valid, which CA issued it, and how many days remain before expiry.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What failure looks like:&lt;/strong&gt; An expired SSL certificate causes browsers to display a full-page trust error that blocks users from accessing your site. Automated certificate renewal (Let's Encrypt via Certbot, or managed renewal through your hosting provider) can fail silently for months before the certificate actually expires — the renewal process runs, encounters an error, and logs it somewhere that nobody checks. The audit catches expirations before they happen.&lt;/p&gt;




&lt;h3&gt;
  
  
  Check 30: Domain Expiry Tracking and Alerts
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it tests:&lt;/strong&gt; Your domain's registration expiry date and registrar.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What failure looks like:&lt;/strong&gt; An expired domain is immediately deactivated — website down, email stopped, all DNS records stop resolving. Most registrars send renewal notices to the WHOIS contact email, which is often an old address that nobody monitors. After expiry, a 30-day redemption period typically allows recovery at a significant fee. After redemption, the domain enters public availability and can be registered by anyone — including a competitor or attacker who then controls the entire namespace of your brand.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; Domain expiry is a catastrophic, recoverable but humiliating failure mode. It is also completely preventable with auto-renew and monitoring.&lt;/p&gt;




&lt;h2&gt;
  
  
  What the Score Means
&lt;/h2&gt;

&lt;p&gt;Every domain that runs the full audit receives an Email Health Score from 0 to 100. The score is weighted by severity:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Critical failures (open zone transfer, subdomain takeover, no DMARC, blacklist listing) carry the most weight&lt;/li&gt;
&lt;li&gt;Configuration gaps (missing CAA, suboptimal TTLs, no TLS-RPT) carry moderate weight&lt;/li&gt;
&lt;li&gt;Optimization opportunities (BIMI not configured, DANE not implemented) carry the least weight&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A score above 85 indicates a domain with no critical failures and most recommended controls in place. A score below 60 almost always includes at least one critical failure that represents an active, exploitable vulnerability.&lt;/p&gt;

&lt;p&gt;Most domains score between 40 and 65 on first audit. The common pattern: email authentication is partially configured (SPF present, DKIM present, DMARC at &lt;code&gt;p=none&lt;/code&gt;), DNS security is minimal (no DNSSEC, no CAA), and infrastructure checks reveal at least one unexpected exposure.&lt;/p&gt;

&lt;p&gt;The audit does not stop at the score. Every failed check produces a fix guide with the exact corrective action — provider-specific steps for DNS changes, server configuration changes for SMTP VRFY and open resolver checks, and compliance documentation guidance for the framework mapping checks.&lt;/p&gt;

&lt;p&gt;You can run the audit on any domain — your own, a competitor's, a prospective acquisition target — at &lt;a href="https://zerohook.org" rel="noopener noreferrer"&gt;zerohook.org&lt;/a&gt;. The free tier includes SPF, DKIM, DMARC, blacklist monitoring, and an Email Health Score. The full 30-point audit is on paid plans starting at $49/month.&lt;/p&gt;




&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;30 checks across 5 categories:&lt;/strong&gt; email security (8), DNS security (10), infrastructure security (6), compliance mapping (4), and expiry monitoring (2)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The highest-severity findings&lt;/strong&gt; are subdomain takeover (exploitable immediately with no access to your systems), open zone transfer (complete infrastructure reconnaissance), blacklist listing (silent email delivery failure), and DMARC &lt;code&gt;p=none&lt;/code&gt; (no enforcement against domain spoofing)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SMTP VRFY exposure is underestimated&lt;/strong&gt; — a mail server that confirms whether email addresses exist hands attackers a validated list of targets for phishing campaigns&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compliance mapping is a byproduct, not a separate effort&lt;/strong&gt; — the technical checks feed directly into NIS2, ISO 27001, GDPR, and PCI-DSS gap analysis&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Most domains score 40–65 on first audit&lt;/strong&gt; — partially configured email authentication and minimal DNS security with at least one unexpected infrastructure exposure is the most common pattern&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Every failed check produces a fix guide&lt;/strong&gt; — the audit does not stop at finding problems; it produces the specific corrective action for each one&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;*Part of an ongoing series on DNS security and email deliverability. &lt;/p&gt;

</description>
      <category>zerohook</category>
      <category>dns</category>
      <category>domain</category>
      <category>cybersecurity</category>
    </item>
    <item>
      <title>What's a 1% Email Deliverability Improvement Worth to Your Business?</title>
      <dc:creator>Regő Botond Ronyecz</dc:creator>
      <pubDate>Sat, 30 May 2026 01:28:21 +0000</pubDate>
      <link>https://dev.to/rronyecz/whats-a-1-email-deliverability-improvement-worth-to-your-business-359b</link>
      <guid>https://dev.to/rronyecz/whats-a-1-email-deliverability-improvement-worth-to-your-business-359b</guid>
      <description>&lt;p&gt;The average inbox placement rate across all senders is &lt;strong&gt;83.1%&lt;/strong&gt;. That means roughly one in six emails never reaches the inbox — delivered by the mail server's definition, invisible by any practical one.&lt;/p&gt;

&lt;p&gt;If you are sending 50,000 emails a month with an 83% inbox placement rate, about 8,500 of those emails are going directly to spam or being silently discarded. They were sent. They were not received. You have no idea which ones.&lt;/p&gt;

&lt;p&gt;Most businesses treat deliverability as a binary: either emails are arriving or they are not. The more useful framing is economic. Inbox placement is a revenue lever that most teams are leaving in its default position. Moving it by 1% is worth a calculable, specific number of dollars — and for most businesses sending transactional or lifecycle email, that number is larger than the cost of every tool needed to fix it combined.&lt;/p&gt;

&lt;p&gt;This post walks through the calculation in concrete terms, shows what inbox placement actually costs across different business models, and identifies the specific DNS and authentication configurations that drive the gap between 83% and 95%+.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Baseline: What "Delivered" Actually Means
&lt;/h2&gt;

&lt;p&gt;There is a critical distinction in email metrics that most dashboards blur: &lt;strong&gt;delivery rate&lt;/strong&gt; and &lt;strong&gt;deliverability rate&lt;/strong&gt; are not the same number.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Delivery rate&lt;/strong&gt; measures whether the receiving mail server accepted the message. A 99% delivery rate means 99% of your emails were not bounced. It says nothing about where they went after acceptance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deliverability rate&lt;/strong&gt; (or inbox placement rate) measures whether the accepted message reached the inbox — not the spam folder, not the promotions tab, the inbox.&lt;/p&gt;

&lt;p&gt;Your ESP's dashboard shows delivery rate. What actually drives revenue is deliverability rate.&lt;/p&gt;

&lt;p&gt;The gap between them is the spam folder. An email that lands in spam was "delivered" by every metric your dashboard tracks. It generated zero opens, zero clicks, and zero revenue. It is indistinguishable, in your reporting, from an email that reached the primary inbox and was simply not opened.&lt;/p&gt;

&lt;p&gt;This is why inbox placement problems are so persistent: the data you see doesn't show them.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Math: Calculating Your Deliverability Revenue Gap
&lt;/h2&gt;

&lt;p&gt;The calculation has four inputs:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Monthly email volume&lt;/strong&gt; — how many emails you send per month&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Current inbox placement rate&lt;/strong&gt; — what percentage actually reach the inbox (not your delivery rate — your inbox placement rate, which requires seed testing to measure)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Revenue per email sent&lt;/strong&gt; — total email-attributed revenue divided by emails sent&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Target inbox placement rate&lt;/strong&gt; — realistically 95%+ with proper authentication in place&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The formula:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Revenue gap = Monthly volume × (Target rate − Current rate) × Revenue per email
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's run it for three different business models.&lt;/p&gt;




&lt;h3&gt;
  
  
  E-commerce: 100,000 emails/month
&lt;/h3&gt;

&lt;p&gt;An online retailer sending 100,000 emails per month — marketing campaigns, abandoned cart sequences, order confirmations, post-purchase flows — at a revenue per email of &lt;strong&gt;$0.25&lt;/strong&gt; (a conservative figure; many optimized e-commerce programs run $0.40–$0.80).&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scenario&lt;/th&gt;
&lt;th&gt;Inbox placement&lt;/th&gt;
&lt;th&gt;Monthly revenue&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Current (industry average)&lt;/td&gt;
&lt;td&gt;83%&lt;/td&gt;
&lt;td&gt;$20,750&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Target (properly authenticated)&lt;/td&gt;
&lt;td&gt;95%&lt;/td&gt;
&lt;td&gt;$23,750&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Difference&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+12 percentage points&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+$3,000/month&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That is &lt;strong&gt;$36,000 per year&lt;/strong&gt; from closing the inbox placement gap — on a conservative revenue-per-email figure, before any change to subject lines, send times, or creative.&lt;/p&gt;

&lt;p&gt;If the retailer is closer to the industry average inbox placement of 83% and their revenue per email is higher — which is typical for businesses with mature lifecycle sequences — the annual gap is larger.&lt;/p&gt;




&lt;h3&gt;
  
  
  SaaS: Transactional email at 500,000 emails/month
&lt;/h3&gt;

&lt;p&gt;A SaaS company sending 500,000 transactional emails per month — trial onboarding sequences, feature announcements, expiry warnings, payment failure notices. Revenue per email is harder to calculate directly, but the downstream cost of spam placement on transactional email is concrete: a payment failure notice that lands in spam means a churned customer. An onboarding email that goes unread means a user who does not activate.&lt;/p&gt;

&lt;p&gt;Transactional emails have 8x higher opens and clicks compared to regular marketing emails. They are also the emails where deliverability failure has the most direct business consequence — a missed invoice or a password reset that never arrives is a support ticket and a frustrated customer.&lt;/p&gt;

&lt;p&gt;At this volume, a 1% inbox placement improvement means 5,000 more transactional emails reaching their recipients every month. For a SaaS with a $500 annual contract value and even a 0.1% conversion rate on those recovered emails, that is 5 additional conversions per month — $2,500/month, $30,000/year.&lt;/p&gt;




&lt;h3&gt;
  
  
  Agency / MSP: Client email reputation management
&lt;/h3&gt;

&lt;p&gt;An agency managing email infrastructure for 20 clients, each sending 10,000 emails per month at an average revenue per email of $0.15. Current average inbox placement across the client portfolio: 80%.&lt;/p&gt;

&lt;p&gt;If the agency brings every client from 80% to 95% inbox placement:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;20 clients × 10,000 emails × $0.15 × 0.15 improvement = $4,500/month in recovered revenue
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is $4,500 per month in additional revenue attribution across the portfolio — generated by DNS and authentication fixes, not by a single additional piece of content.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is Holding Inbox Placement Below 95%
&lt;/h2&gt;

&lt;p&gt;Only approximately 33.4% of top 1M domains publish valid DMARC, and roughly 85.7% don't enforce it. That is the core of the inbox placement problem for most businesses: the authentication signals that inbox providers use to evaluate sender reputation are either missing or misconfigured on the majority of domains.&lt;/p&gt;

&lt;p&gt;Gmail and Yahoo introduced mandatory authentication requirements for bulk senders in early 2024: SPF, DKIM, and DMARC are now required for anyone sending to these providers at scale. Senders who do not meet these requirements see increased spam folder placement, regardless of list quality or content.&lt;/p&gt;

&lt;p&gt;The specific configurations that drive inbox placement below 95%:&lt;/p&gt;

&lt;h3&gt;
  
  
  Missing or broken SPF
&lt;/h3&gt;

&lt;p&gt;SPF lists the mail servers authorized to send email from your domain. When a receiving server checks SPF and the sending IP is not on the list, the email fails authentication — and failed authentication is one of the strongest spam signals an inbox provider uses.&lt;/p&gt;

&lt;p&gt;The most common SPF failure mode is not a missing record — it is an incomplete one. A company adds SendGrid to their SPF record when they sign up for transactional email, then adds Google Workspace, then Salesforce, and never updates the SPF record. The Salesforce emails fail SPF. They land in spam. The DMARC report shows it but nobody reads the DMARC report.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check your current SPF record&lt;/span&gt;
dig yourdomain.com TXT +short | &lt;span class="nb"&gt;grep &lt;/span&gt;spf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  DKIM not configured for all sending services
&lt;/h3&gt;

&lt;p&gt;DKIM adds a cryptographic signature to every outgoing email. Receiving servers verify the signature against a public key in your DNS. Unsigned email from your domain — email sent by a service you use that does not have DKIM configured — is treated with significantly more suspicion than signed email.&lt;/p&gt;

&lt;p&gt;The problem mirrors the SPF issue: DKIM is configured for the primary email provider and missing for secondary senders. Marketing platforms, CRM tools, HR systems, invoicing software — any of these that send email as your domain without DKIM configured contribute to failed authentication across a portion of your sends.&lt;/p&gt;

&lt;h3&gt;
  
  
  DMARC at p=none — monitoring without enforcement
&lt;/h3&gt;

&lt;p&gt;DMARC ties SPF and DKIM together and tells receiving servers what to do when authentication fails. The policy options are &lt;code&gt;p=none&lt;/code&gt; (do nothing), &lt;code&gt;p=quarantine&lt;/code&gt; (send to spam), and &lt;code&gt;p=reject&lt;/code&gt; (block entirely).&lt;/p&gt;

&lt;p&gt;&lt;code&gt;p=none&lt;/code&gt; is the configuration most organizations land on and never leave. It generates reports about authentication failures. It takes no action on them. From an inbox provider's perspective, &lt;code&gt;p=none&lt;/code&gt; signals a domain that is aware of its authentication status but has chosen not to enforce it.&lt;/p&gt;

&lt;p&gt;Since early 2024, Gmail and Yahoo require SPF, DKIM, and DMARC for any sender delivering at bulk volume. But the requirement is for the records to exist — not for the policy to be enforced. &lt;code&gt;p=none&lt;/code&gt; satisfies the existence requirement while doing nothing to improve inbox placement. Moving to &lt;code&gt;p=quarantine&lt;/code&gt; and eventually &lt;code&gt;p=reject&lt;/code&gt; is what drives the authentication signal that inbox providers reward.&lt;/p&gt;

&lt;h3&gt;
  
  
  Blacklist placement
&lt;/h3&gt;

&lt;p&gt;A sending IP or domain on a major blacklist sees immediate, severe inbox placement degradation. Spamhaus ZEN covers approximately 3 billion mailboxes. A listing there means a large portion of your emails are being rejected at the server level — they never even reach the spam folder.&lt;/p&gt;

&lt;p&gt;Blacklist placement happens for reasons unrelated to your content: a compromised account sending spam, a spike in sending volume that looks automated, or a shared IP on an ESP where a neighboring sender triggered a listing. The only way to know your current blacklist status is to check — and the only way to know when status changes is continuous monitoring.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check Spamhaus combined zone (SBL + XBL + PBL)&lt;/span&gt;
&lt;span class="c"&gt;# Reverse your sending IP octets first (e.g. 192.0.2.1 → 1.2.0.192)&lt;/span&gt;
dig 1.2.0.192.zen.spamhaus.org A
&lt;span class="c"&gt;# NXDOMAIN = clean. Any other response = listed.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  The Fix: What Moves Inbox Placement From 83% to 95%+
&lt;/h2&gt;

&lt;p&gt;The inbox placement gap between the industry average and a properly configured sender is almost entirely explained by four authentication controls. None of them require changes to email content, subject lines, sending frequency, or list composition.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Complete SPF record&lt;/strong&gt; — all sending services listed, under 10 DNS lookups, one record per domain (two records breaks SPF for everyone).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. DKIM for every sender&lt;/strong&gt; — all services that send email as your domain have a DKIM key configured, minimum 2048-bit key strength. Keys older than 12 months should be rotated.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. DMARC policy enforcement&lt;/strong&gt; — move from &lt;code&gt;p=none&lt;/code&gt; to &lt;code&gt;p=quarantine&lt;/code&gt;. Read the DMARC RUA reports for two to four weeks. When the reports show clean authentication across your legitimate senders, advance to &lt;code&gt;p=reject&lt;/code&gt;. This is the single highest-impact change for inbox placement, and it is a DNS record update.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Active blacklist monitoring&lt;/strong&gt; — know your blacklist status before your recipients tell you about it. The window between listing and your team noticing it manually is typically days. Automated monitoring closes that gap to minutes.&lt;/p&gt;

&lt;p&gt;These four changes are not creative work. They are configuration. They require DNS access and about two hours to implement correctly. The revenue recovery they enable is proportional to your email volume — for most businesses, that means the tool cost pays for itself inside the first month.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Revenue Per Email Calculation for Your Business
&lt;/h2&gt;

&lt;p&gt;If you have not calculated your revenue per email, here is the straightforward version:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Revenue per email = (Email-attributed revenue per month) ÷ (Emails sent per month)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Email-attributed revenue is the revenue from purchases that occurred within the attribution window after an email click or open — your ESP should report this directly.&lt;/p&gt;

&lt;p&gt;If you do not have this number, use these industry benchmarks as a starting point:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Business type&lt;/th&gt;
&lt;th&gt;Revenue per email sent (conservative)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;E-commerce (promotional)&lt;/td&gt;
&lt;td&gt;$0.10–$0.40&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;E-commerce (transactional / cart recovery)&lt;/td&gt;
&lt;td&gt;$0.40–$1.50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SaaS (lifecycle / onboarding)&lt;/td&gt;
&lt;td&gt;$0.05–$0.20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SaaS (payment failure / renewal)&lt;/td&gt;
&lt;td&gt;$0.50–$2.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Financial services&lt;/td&gt;
&lt;td&gt;$0.20–$0.80&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B2B (lead nurture)&lt;/td&gt;
&lt;td&gt;$0.30–$1.50&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Now apply the deliverability gap:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Annual revenue gap = Monthly volume × (0.95 − Current placement rate) × Revenue per email × 12
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If your current inbox placement rate is 83% and your target is 95%, that is a 12-percentage-point gap. On 50,000 emails per month at $0.25 revenue per email:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;50,000 × 0.12 × $0.25 × 12 = $18,000/year
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is the revenue sitting between your current inbox placement rate and where it should be — recoverable through authentication fixes, not through more content or bigger lists.&lt;/p&gt;

&lt;p&gt;ZeroHook's &lt;a href="https://zerohook.org/email-roi-calculator" rel="noopener noreferrer"&gt;Email ROI Calculator&lt;/a&gt; runs this calculation for your own numbers without requiring an account — enter your volume, current open rate, and average order value to see your specific gap estimate.&lt;/p&gt;




&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The average inbox placement rate is 83.1%&lt;/strong&gt; — meaning roughly 1 in 6 emails never reaches the inbox. Your ESP's delivery rate does not show this&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A 1% deliverability improvement is worth $3,000–$36,000+ per year&lt;/strong&gt; depending on email volume and revenue per email — the range is wide but the floor is significant for any business sending at moderate volume&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The gap between 83% and 95%+ inbox placement is almost entirely explained by four authentication controls:&lt;/strong&gt; complete SPF, DKIM for all senders, DMARC at &lt;code&gt;p=quarantine&lt;/code&gt; or &lt;code&gt;p=reject&lt;/code&gt;, and active blacklist monitoring&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;None of these require content changes&lt;/strong&gt; — they are DNS configuration fixes that take two hours to implement correctly&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;p=none&lt;/code&gt; is the configuration most organizations never leave&lt;/strong&gt; — it satisfies the existence requirement but takes no action on authentication failures. Moving to &lt;code&gt;p=quarantine&lt;/code&gt; is the single highest-impact change for inbox placement&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Calculate your own number:&lt;/strong&gt; monthly email volume × (0.95 − current placement rate) × revenue per email × 12 = annual revenue gap from the inbox placement shortfall&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;*Part of an ongoing series on email deliverability and DNS security. &lt;/p&gt;

</description>
      <category>deliverability</category>
      <category>email</category>
      <category>domain</category>
      <category>dns</category>
    </item>
    <item>
      <title>ISO 27001 Annex A and Email Security: A Simple Gap Analysis Guide</title>
      <dc:creator>Regő Botond Ronyecz</dc:creator>
      <pubDate>Sat, 30 May 2026 01:23:28 +0000</pubDate>
      <link>https://dev.to/rronyecz/iso-27001-annex-a-and-email-security-a-simple-gap-analysis-guide-3noo</link>
      <guid>https://dev.to/rronyecz/iso-27001-annex-a-and-email-security-a-simple-gap-analysis-guide-3noo</guid>
      <description>&lt;p&gt;Your ISMS is certified. Your Statement of Applicability covers the controls. Your auditor arrives and runs a DNS lookup on your domain.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dig _dmarc.yourdomain.com TXT +short
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The output shows &lt;code&gt;p=none&lt;/code&gt;. The auditor makes a note.&lt;/p&gt;

&lt;p&gt;This is not a hypothetical. DMARC policy enforcement has become a standard ISMS audit check since ISO 27001:2022 made &lt;strong&gt;Annex A.5.14 — Information Transfer&lt;/strong&gt; an explicit Annex A control for the first time. If your organization was certified against ISO 27001:2013 and has not reviewed email security controls since the transition to the 2022 standard, there is a material gap in your Statement of Applicability — whether or not the auditor has found it yet.&lt;/p&gt;

&lt;p&gt;This guide maps every email and DNS security control to the specific Annex A clauses they satisfy, explains what auditors check and what they accept as evidence, and identifies the three findings that appear most frequently in ISMS email security reviews.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why 2022 Changed the Picture
&lt;/h2&gt;

&lt;p&gt;ISO 27001:2013 did not include an explicit Annex A control for information transfer security in email. Organizations could and did satisfy information security requirements through general controls on network security and communications without formally addressing SPF, DKIM, DMARC, or MTA-STS in their SoA.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ISO 27001:2022 introduced Annex A.5.14 — Information Transfer&lt;/strong&gt; as a new, named control. It explicitly requires "rules, procedures and agreements" for information transfer across all channels — including email. MTA-STS and DMARC serve as automated technical enforcement of these rules. The 2022 revision also reorganized and renumbered controls; several email-adjacent controls moved between clauses.&lt;/p&gt;

&lt;p&gt;The transition deadline for existing certifications was October 31, 2025. Certifications that have not transitioned to ISO 27001:2022 are no longer valid. If your ISMS was certified under the 2013 standard, the audit against the 2022 standard requires you to explicitly add email security controls to your SoA — they cannot be treated as implicitly covered by older, broader controls.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Annex A Controls That Cover Email and DNS Security
&lt;/h2&gt;

&lt;p&gt;Four Annex A controls in ISO 27001:2022 map directly to email and DNS security. Each one has a specific scope, a specific technical implementation, and a specific evidence requirement.&lt;/p&gt;




&lt;h3&gt;
  
  
  Annex A.5.14 — Information Transfer
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Scope:&lt;/strong&gt; Rules, procedures, and agreements ensuring that information transferred via all channels — including email — is protected appropriately.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it requires for email:&lt;/strong&gt; Documented policies for email security, backed by technical enforcement controls that automatically apply those policies. The 2022 guidance explicitly notes that automated enforcement (rather than user-dependent procedures) is preferred.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Technical controls that satisfy A.5.14:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;DMARC at &lt;code&gt;p=quarantine&lt;/code&gt; or &lt;code&gt;p=reject&lt;/code&gt; is the primary control. It enforces your email authentication policy automatically — emails that fail SPF and DKIM authentication are either quarantined or rejected, depending on your policy level. The key word is &lt;em&gt;enforces&lt;/em&gt;. &lt;code&gt;p=none&lt;/code&gt; collects data but enforces nothing. It does not satisfy A.5.14 as an active protection control.&lt;/p&gt;

&lt;p&gt;MTA-STS in enforce mode is the complementary control for inbound email transport security. It instructs sending mail servers that they must use TLS when delivering email to your domain, and rejects delivery attempts that cannot establish a secure connection. Without it, downgrade attacks on TLS are possible and undetected.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to document this in your SoA:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;Control&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Annex A.5.14 — Information Transfer&lt;/span&gt;
&lt;span class="na"&gt;Applicable&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Yes&lt;/span&gt;
&lt;span class="na"&gt;Justification&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Email is a primary information transfer channel for the organization.&lt;/span&gt;
&lt;span class="na"&gt;Implementation&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;DMARC&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;p=quarantine (or p=reject) enforced at _dmarc.yourdomain.com&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;MTA-STS&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;enforce mode policy at mta-sts.yourdomain.com&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;SPF&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;all authorized senders listed at yourdomain.com TXT&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;DKIM&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;2048-bit keys configured for all sending services&lt;/span&gt;
&lt;span class="na"&gt;Control owner&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;IT Manager / CTO / named role&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="na"&gt;Review schedule&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Quarterly DNS audit + annual DKIM key rotation review&lt;/span&gt;
&lt;span class="na"&gt;Evidence reference&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Link to monitoring dashboard or export&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Annex A.8.16 — Monitoring Activities
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Scope:&lt;/strong&gt; Networks, systems, and applications must be monitored to detect anomalous behavior and potential security events.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it requires for email:&lt;/strong&gt; Active monitoring of email authentication and transport encryption — not just having the controls configured, but actively receiving and reviewing the data those controls generate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The distinction auditors enforce:&lt;/strong&gt; Having a &lt;code&gt;rua=&lt;/code&gt; address in your DMARC record is configuration. &lt;em&gt;Reading the reports that arrive at that address&lt;/em&gt; is monitoring. Having TLS-RPT configured is configuration. &lt;em&gt;Reviewing TLS negotiation failure reports&lt;/em&gt; is monitoring.&lt;/p&gt;

&lt;p&gt;Annex A.8.16 requires monitoring to be active. An organization with DMARC RUA configured but six months of unread XML reports in an inbox has a configuration, not a monitoring program. Auditors distinguish between the two.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Technical controls that satisfy A.8.16:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;DMARC RUA reporting — aggregate reports sent daily to your &lt;code&gt;rua=&lt;/code&gt; address, showing which services sent email as your domain, which passed authentication, and which failed. These reports must be read and actioned. The most practical approach for most organizations is a DMARC report parser (Postmark DMARC Digests, dmarcian, DMARC Analyzer) that converts the raw XML into readable summaries.&lt;/p&gt;

&lt;p&gt;TLS-RPT — daily reports from other mail servers about TLS connection failures when delivering to your domain. Configure via a TXT record at &lt;code&gt;_smtp._tls.yourdomain.com&lt;/code&gt; with a &lt;code&gt;rua=&lt;/code&gt; address.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verification:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# DMARC reporting active&lt;/span&gt;
dig _dmarc.yourdomain.com TXT +short
&lt;span class="c"&gt;# Look for rua=mailto: in the output&lt;/span&gt;

&lt;span class="c"&gt;# TLS-RPT active&lt;/span&gt;
dig _smtp._tls.yourdomain.com TXT +short
&lt;span class="c"&gt;# Look for rua=mailto: in the output&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What to document:&lt;/strong&gt; Monthly or quarterly summaries of DMARC report review, showing compliance rates and any anomalies investigated. A log of actions taken when unauthorized senders appeared in reports.&lt;/p&gt;




&lt;h3&gt;
  
  
  Annex A.8.20 — Networks Security
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Scope:&lt;/strong&gt; Networks and network devices must be managed and controlled to protect information in systems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DNS security controls that satisfy A.8.20:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;DNSSEC — cryptographic signing of DNS records that allows resolvers to verify responses have not been tampered with in transit. A compromised DNS response that redirects your domain's traffic is a network security failure. DNSSEC prevents it.&lt;/p&gt;

&lt;p&gt;CAA records — restricting which certificate authorities may issue TLS certificates for your domain. An attacker who obtains a fraudulent certificate for your domain under a permissive CA has bypassed your network security boundary. CAA records constrain this attack surface.&lt;/p&gt;

&lt;p&gt;Redundant nameservers — at least two geographically separated nameservers ensure that a regional network outage does not make your domain unreachable. Managed DNS providers (Cloudflare, Route53) satisfy this by default through Anycast.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verification:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# DNSSEC&lt;/span&gt;
dig yourdomain.com DNSKEY +short

&lt;span class="c"&gt;# CAA&lt;/span&gt;
dig yourdomain.com CAA +short

&lt;span class="c"&gt;# Nameserver redundancy&lt;/span&gt;
dig yourdomain.com NS +short
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Annex A.8.12 — Data Leakage Prevention
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Scope:&lt;/strong&gt; Measures to prevent unauthorized disclosure of sensitive information.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Email controls that contribute to A.8.12:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;DMARC at &lt;code&gt;p=reject&lt;/code&gt; prevents spoofed emails bearing your domain from reaching recipients. An attacker sending phishing email that appears to come from your domain — and successfully reaches recipients' inboxes — represents unauthorized disclosure of your brand identity and potential exposure of recipient trust. &lt;code&gt;p=reject&lt;/code&gt; eliminates the delivery vector for this attack.&lt;/p&gt;

&lt;p&gt;BIMI (Brand Indicators for Message Identification) is relevant here as a supporting control: by displaying your verified logo in the inbox, it helps recipients identify legitimate email from your domain and distinguish it from spoofed attempts. It is not a primary A.8.12 control but can be referenced as a user-facing anti-spoofing measure.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Gap Analysis: Control-by-Control
&lt;/h2&gt;

&lt;p&gt;Use this table to assess your current state against each Annex A control. Each row shows the specific technical check, the pass condition, and what constitutes acceptable ISMS evidence.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Annex A Control&lt;/th&gt;
&lt;th&gt;Technical Check&lt;/th&gt;
&lt;th&gt;Pass Condition&lt;/th&gt;
&lt;th&gt;Evidence&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;A.5.14&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;DMARC policy&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;p=quarantine&lt;/code&gt; or &lt;code&gt;p=reject&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;dig _dmarc.yourdomain.com TXT +short&lt;/code&gt; output&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;A.5.14&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;MTA-STS mode&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;mode: enforce&lt;/code&gt; in policy file&lt;/td&gt;
&lt;td&gt;&lt;code&gt;curl https://mta-sts.yourdomain.com/.well-known/mta-sts.txt&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;A.5.14&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;SPF completeness&lt;/td&gt;
&lt;td&gt;All sending services listed, under 10 lookups&lt;/td&gt;
&lt;td&gt;&lt;code&gt;dig yourdomain.com TXT +short&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;A.5.14&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;DKIM per sender&lt;/td&gt;
&lt;td&gt;2048-bit key, not older than 12 months&lt;/td&gt;
&lt;td&gt;&lt;code&gt;dig [selector]._domainkey.yourdomain.com TXT +short&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;A.8.16&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;DMARC RUA active&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;rua=mailto:&lt;/code&gt; present, reports reviewed&lt;/td&gt;
&lt;td&gt;DMARC report dashboard export or summary log&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;A.8.16&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;TLS-RPT active&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;_smtp._tls&lt;/code&gt; TXT record with &lt;code&gt;rua=&lt;/code&gt; present&lt;/td&gt;
&lt;td&gt;&lt;code&gt;dig _smtp._tls.yourdomain.com TXT +short&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;A.8.20&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;DNSSEC enabled&lt;/td&gt;
&lt;td&gt;DNSKEY records + DS in parent zone&lt;/td&gt;
&lt;td&gt;&lt;code&gt;dig yourdomain.com DNSKEY +short&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;A.8.20&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;CAA records&lt;/td&gt;
&lt;td&gt;At least one &lt;code&gt;issue&lt;/code&gt; record for approved CA&lt;/td&gt;
&lt;td&gt;&lt;code&gt;dig yourdomain.com CAA +short&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;A.8.20&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Nameserver redundancy&lt;/td&gt;
&lt;td&gt;≥2 NS records, geographically separated&lt;/td&gt;
&lt;td&gt;&lt;code&gt;dig yourdomain.com NS +short&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;A.8.12&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;DMARC enforcement&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;p=reject&lt;/code&gt; (full enforcement, not quarantine)&lt;/td&gt;
&lt;td&gt;Same as A.5.14 DMARC check&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  The Three Most Common ISO 27001 Email Security Findings
&lt;/h2&gt;

&lt;p&gt;Across ISMS email security reviews, three findings appear with disproportionate frequency. Knowing them in advance lets you close them before the auditor finds them.&lt;/p&gt;

&lt;h3&gt;
  
  
  Finding 1: DMARC at p=none in the SoA as a "monitoring control"
&lt;/h3&gt;

&lt;p&gt;Organizations document DMARC in their SoA as an implemented A.5.14 control — which is correct in principle. The problem is that the policy is &lt;code&gt;p=none&lt;/code&gt;, and the SoA describes it as a "monitoring control for email authentication."&lt;/p&gt;

&lt;p&gt;Auditors reject this framing for A.5.14. The clause requires information transfer to be &lt;em&gt;protected&lt;/em&gt;, not observed. A &lt;code&gt;p=none&lt;/code&gt; policy that delivers spoofed emails to recipients while logging the event is not protecting information transfer. It is watching it fail.&lt;/p&gt;

&lt;p&gt;The fix is a policy change (&lt;code&gt;p=quarantine&lt;/code&gt; → &lt;code&gt;p=reject&lt;/code&gt;) and an SoA update that describes DMARC as an enforcement control, not a monitoring one.&lt;/p&gt;




&lt;h3&gt;
  
  
  Finding 2: DKIM key rotation not documented or overdue
&lt;/h3&gt;

&lt;p&gt;DKIM key rotation is a standard ISO 27001 cryptographic hygiene finding. Keys that have not been rotated in over 12 months are flagged as a key management weakness under A.8 (Cryptographic Controls in the 2022 standard maps to the broader A.10 category from 2013).&lt;/p&gt;

&lt;p&gt;The finding has two components:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No documented rotation procedure.&lt;/strong&gt; Auditors ask for your DKIM key rotation policy — how often keys rotate, who is responsible, and how the transition is managed. If this is not documented as a procedure in your ISMS, the control is not formally in place regardless of whether you have rotated keys in practice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No rotation log.&lt;/strong&gt; Even if a procedure exists, auditors want a log showing when each DKIM selector was last rotated and what key length was applied. A mental note that "we rotated it about a year ago" is not sufficient.&lt;/p&gt;

&lt;p&gt;The fix: document a DKIM rotation procedure (minimum annually, new selector deployed before old one removed, key length minimum 2048-bit), and maintain a rotation log with dates and selector names.&lt;/p&gt;




&lt;h3&gt;
  
  
  Finding 3: Monitoring configured but not active (A.8.16 gap)
&lt;/h3&gt;

&lt;p&gt;This is the most subtle finding because it looks compliant from the outside. The DNS records are correct. DMARC has a &lt;code&gt;rua=&lt;/code&gt; address. TLS-RPT has a &lt;code&gt;rua=&lt;/code&gt; address. The controls appear to be in place.&lt;/p&gt;

&lt;p&gt;The auditor asks: "Can you show me the last three months of DMARC aggregate reports and what actions you took based on them?"&lt;/p&gt;

&lt;p&gt;If the answer is "we have them but haven't been reviewing them systematically," the A.8.16 monitoring requirement is not met. Configuration is not monitoring. Receiving reports is not monitoring. Reading them, acting on anomalies, and documenting that process is monitoring.&lt;/p&gt;

&lt;p&gt;The fix: establish a monthly DMARC report review cadence, use a parser that makes reports readable (raw XML is not practical to review), and log the review with a brief summary each month. A one-paragraph entry in a security log — "DMARC review [date]: 98.2% pass rate, two unauthorized senders identified, both are legacy services now removed from production" — is sufficient documented evidence.&lt;/p&gt;




&lt;h2&gt;
  
  
  What to Include in Your ISMS Audit Evidence Package
&lt;/h2&gt;

&lt;p&gt;When your auditor requests evidence for A.5.14, A.8.16, A.8.20, and A.8.12, provide these in a single organized folder:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/ISO27001-Email-DNS-Evidence/

  /A.5.14-Information-Transfer/
    dmarc-record-[date].txt          ← dig output showing p=quarantine or p=reject
    mta-sts-policy-[date].txt        ← curl output of policy file showing enforce mode
    spf-record-[date].txt            ← dig output
    dkim-records-[date].txt          ← dig outputs per selector
    soa-entry-A514.docx              ← SoA entry describing controls and ownership

  /A.8.16-Monitoring/
    dmarc-rua-review-log.xlsx        ← monthly review summary, compliance rates
    tls-rpt-config-[date].txt        ← dig output of _smtp._tls record
    dkim-rotation-log.xlsx           ← selector name, rotation date, key length

  /A.8.20-Network-Security/
    dnssec-dnskey-[date].txt         ← dig DNSKEY output
    dnssec-ds-[date].txt             ← dig DS output from parent zone
    caa-record-[date].txt            ← dig CAA output
    nameservers-[date].txt           ← dig NS output

  /A.8.12-Data-Leakage/
    dmarc-reject-evidence-[date].txt ← same as A.5.14 DMARC, p=reject confirmation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Date every file. Auditors cross-reference timestamps. An evidence file with no date, or dated the week of the audit, signals point-in-time collection rather than continuous monitoring.&lt;/p&gt;




&lt;h2&gt;
  
  
  Automating Evidence Collection for Annual Audits
&lt;/h2&gt;

&lt;p&gt;The evidence folder above, assembled manually, takes two to four hours per audit cycle if your records are clean and you know where to look. It takes longer if anything is broken, if people have left the team, or if records were not maintained consistently.&lt;/p&gt;

&lt;p&gt;The more durable approach is continuous monitoring that generates timestamped evidence automatically throughout the year. When the audit arrives, the evidence package is an export from the monitoring system, not a manual assembly exercise.&lt;/p&gt;

&lt;p&gt;For ISMS audits specifically, auditors want to see that monitoring was active throughout the audit period — not just that controls were in place on audit day. A monitoring system with a 365-day audit log answers that question directly. Tools like &lt;a href="https://zerohook.org" rel="noopener noreferrer"&gt;ZeroHook&lt;/a&gt; cover exactly these controls — SPF, DKIM, DMARC, DNSSEC, MTA-STS, CAA, TLS-RPT, blacklist monitoring — and generate compliance-mapped reports for ISO 27001 Annex A alongside NIS2 and SOC2.&lt;/p&gt;




&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ISO 27001:2022 added Annex A.5.14&lt;/strong&gt; — information transfer security is now an explicit named control; organizations transitioning from the 2013 standard must add email security controls (DMARC, MTA-STS) to their SoA explicitly&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Four Annex A controls cover email and DNS security:&lt;/strong&gt; A.5.14 (information transfer — DMARC, MTA-STS, SPF, DKIM), A.8.16 (monitoring — DMARC RUA, TLS-RPT review), A.8.20 (network security — DNSSEC, CAA, redundant NS), A.8.12 (data leakage — DMARC p=reject)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;p=none does not satisfy A.5.14&lt;/strong&gt; — enforcement is required; &lt;code&gt;p=none&lt;/code&gt; is a monitoring posture, not a protection control&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DKIM key rotation must be documented as a procedure and logged&lt;/strong&gt; — auditors ask for the rotation schedule and the rotation history; a mental note is not evidence&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monitoring configured ≠ monitoring active&lt;/strong&gt; — receiving DMARC RUA reports satisfies nothing; reading them, acting on anomalies, and logging that review satisfies A.8.16&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Date every evidence file&lt;/strong&gt; — timestamps on evidence are how auditors verify continuous monitoring vs. point-in-time collection assembled for the audit&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;*Part of an ongoing series on DNS security and compliance.&lt;/p&gt;

</description>
      <category>iso27001</category>
      <category>cybersecurity</category>
      <category>compliance</category>
      <category>dns</category>
    </item>
    <item>
      <title>SOC2 CC6.6 Made Easy: Automating Logical Access Evidence</title>
      <dc:creator>Regő Botond Ronyecz</dc:creator>
      <pubDate>Sat, 30 May 2026 01:18:39 +0000</pubDate>
      <link>https://dev.to/rronyecz/soc2-cc66-made-easy-automating-logical-access-evidence-7hn</link>
      <guid>https://dev.to/rronyecz/soc2-cc66-made-easy-automating-logical-access-evidence-7hn</guid>
      <description>&lt;p&gt;Your SOC2 audit window opens in three months. Your DMARC policy is &lt;code&gt;p=none&lt;/code&gt;. Your auditor is going to flag it.&lt;/p&gt;

&lt;p&gt;Not because &lt;code&gt;p=none&lt;/code&gt; is wrong as a starting point — it's the standard way to begin DMARC rollout. But &lt;code&gt;p=none&lt;/code&gt; at the start of a SOC2 audit period means that for the entire months it was in place, you had zero enforcement on a logical access control that CC6.6 explicitly requires. You cannot retroactively fix those months. You can only fix what comes next.&lt;/p&gt;

&lt;p&gt;This is the most common CC6.6 failure mode: organizations that have technically correct configurations but arrive at the audit with the wrong policy value, at the wrong time, with no continuous evidence to show it was ever in the right state.&lt;/p&gt;

&lt;p&gt;This guide covers exactly what CC6.6 requires for DNS and email security, what evidence auditors look for, and how to build a configuration that generates audit evidence automatically — rather than manually assembling it the week before the audit.&lt;/p&gt;




&lt;h2&gt;
  
  
  What CC6.6 Actually Covers
&lt;/h2&gt;

&lt;p&gt;SOC2 is organized around Trust Services Criteria (TSC). CC6.6 sits inside the &lt;strong&gt;CC6 — Logical and Physical Access Controls&lt;/strong&gt; category and specifically addresses:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"The entity implements logical access security measures to protect against threats from sources outside its system boundaries."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In practice, CC6.6 covers controls that prevent unauthorized external access to your systems. For most SaaS companies, the auditor's DNS and email security review under CC6.6 focuses on three threat vectors:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Email domain spoofing&lt;/strong&gt; — an attacker sending email that appears to come from your domain. If your domain can be spoofed, phishing attacks can impersonate your company to your own customers. This is an external threat to your system boundary that email authentication controls address directly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DNS record tampering&lt;/strong&gt; — an attacker modifying your DNS records to redirect traffic. An unprotected DNS zone is an attack surface on your system boundary. DNSSEC and registrar-level controls address this.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Certificate issuance abuse&lt;/strong&gt; — an attacker obtaining a valid TLS certificate for your domain through a compromised or rogue certificate authority. CAA records restrict which CAs can issue certificates for your domain.&lt;/p&gt;

&lt;p&gt;CC6.6 also connects to &lt;strong&gt;CC6.1 — Security Communications&lt;/strong&gt;, which covers transmission security. MTA-STS in enforce mode — requiring TLS for all inbound email delivery — is the CC6.1 email control that auditors verify alongside CC6.6.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Five Controls SOC2 Auditors Check
&lt;/h2&gt;

&lt;p&gt;When your auditor reviews DNS and email security as part of CC6.6, these are the specific controls they test. Each has a pass condition, a failure mode, and an evidence requirement.&lt;/p&gt;

&lt;h3&gt;
  
  
  Control 1: DMARC at p=quarantine or p=reject
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What auditors check:&lt;/strong&gt; The value of &lt;code&gt;p=&lt;/code&gt; in your DMARC record at &lt;code&gt;_dmarc.yourdomain.com&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pass condition:&lt;/strong&gt; &lt;code&gt;p=quarantine&lt;/code&gt; or &lt;code&gt;p=reject&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why p=none fails:&lt;/strong&gt; &lt;code&gt;p=none&lt;/code&gt; is a monitoring-only policy. It generates reports about authentication failures but takes no action — emails that fail SPF and DKIM are still delivered normally. SOC2 auditors treat &lt;code&gt;p=none&lt;/code&gt; the same as no DMARC record from a CC6.6 enforcement perspective. You have visibility into the problem, but no control preventing it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The timing trap:&lt;/strong&gt; SOC2 auditors test controls at the &lt;em&gt;start&lt;/em&gt; of the audit period, not the end. If your 12-month audit window begins January 1 and you are at &lt;code&gt;p=none&lt;/code&gt; until March 15, you fail CC6.6 for those 10.5 weeks — even if you are at &lt;code&gt;p=reject&lt;/code&gt; by the time the auditor arrives. The audit looks back across the entire period.&lt;/p&gt;

&lt;p&gt;Check your current policy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dig _dmarc.yourdomain.com TXT +short
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you see &lt;code&gt;p=none&lt;/code&gt;, change it to &lt;code&gt;p=quarantine&lt;/code&gt; immediately. Do not wait. Monitor DMARC reports for two to four weeks to confirm no legitimate email is failing, then advance to &lt;code&gt;p=reject&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Evidence requirement:&lt;/strong&gt; A screenshot or exported record showing &lt;code&gt;p=quarantine&lt;/code&gt; or &lt;code&gt;p=reject&lt;/code&gt;, timestamped at the start of the audit period. DMARC RUA reports received and reviewed during the audit period — auditors want to see that you are actively consuming the reporting data, not just publishing the record.&lt;/p&gt;




&lt;h3&gt;
  
  
  Control 2: All sending services in SPF, all with DKIM keys
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What auditors check:&lt;/strong&gt; Your SPF record for completeness, and DKIM key configuration for every active email sender.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The third-party sender problem:&lt;/strong&gt; DMARC reports reveal every service sending email that claims to be from your domain. If your CRM, your marketing platform, your HR system, and your transactional email provider are all sending as your domain — and any of them are not in your SPF record or don't have DKIM configured — they appear in your DMARC reports as unauthorized senders.&lt;/p&gt;

&lt;p&gt;SOC2 auditors review DMARC reports during the audit. Unauthorized senders in your own reports are a red flag. They indicate a gap in your logical access controls: something is sending email from your domain that is outside your control boundary.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DKIM key strength:&lt;/strong&gt; 1024-bit DKIM keys are considered cryptographically weak and should be rotated to 2048-bit. SOC2 auditors increasingly flag 1024-bit keys as a cryptographic control weakness under CC6.6.&lt;/p&gt;

&lt;p&gt;Check:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# SPF&lt;/span&gt;
dig yourdomain.com TXT +short | &lt;span class="nb"&gt;grep &lt;/span&gt;spf

&lt;span class="c"&gt;# DKIM (for each active sending service selector)&lt;/span&gt;
dig google._domainkey.yourdomain.com TXT +short
dig selector1._domainkey.yourdomain.com TXT +short
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Evidence requirement:&lt;/strong&gt; SPF record export showing all authorized senders. DKIM TXT records for each active sending service. DMARC RUA report excerpts showing alignment pass rates above 95% for the audit period.&lt;/p&gt;




&lt;h3&gt;
  
  
  Control 3: MTA-STS in enforce mode (CC6.1)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What auditors check:&lt;/strong&gt; Whether your MTA-STS policy file exists, is served over HTTPS, and specifies &lt;code&gt;mode: enforce&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;MTA-STS prevents downgrade attacks on inbound email delivery. Without it, a network attacker on the path between a remote mail server and yours can strip the TLS negotiation and transmit email in plaintext — bypassing your encryption entirely. &lt;code&gt;mode: testing&lt;/code&gt; collects data but does not prevent this. &lt;code&gt;mode: enforce&lt;/code&gt; rejects delivery attempts that cannot establish a secure TLS connection.&lt;/p&gt;

&lt;p&gt;Check:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# DNS record&lt;/span&gt;
dig _mta-sts.yourdomain.com TXT +short

&lt;span class="c"&gt;# Policy file&lt;/span&gt;
curl https://mta-sts.yourdomain.com/.well-known/mta-sts.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pass condition: the DNS record exists, the policy file is reachable over HTTPS, and the file contains &lt;code&gt;mode: enforce&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Evidence requirement:&lt;/strong&gt; A &lt;code&gt;curl&lt;/code&gt; output or screenshot of the policy file showing &lt;code&gt;mode: enforce&lt;/code&gt;, with a timestamp. The DNS record screenshot showing the &lt;code&gt;_mta-sts&lt;/code&gt; TXT record.&lt;/p&gt;




&lt;h3&gt;
  
  
  Control 4: DNSSEC enabled and validated
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What auditors check:&lt;/strong&gt; Whether your DNS zone has DNSSEC signing active and whether the chain of trust is complete from your zone to the TLD.&lt;/p&gt;

&lt;p&gt;DNSSEC prevents cache poisoning attacks where a resolver is fed forged DNS responses. Without DNSSEC, an attacker who can inject forged DNS responses can redirect your domain's traffic to their server — capturing credentials, intercepting email, or serving malicious content under your brand.&lt;/p&gt;

&lt;p&gt;Check:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Confirm DNSKEY records exist&lt;/span&gt;
dig yourdomain.com DNSKEY +short

&lt;span class="c"&gt;# Confirm DS record in parent zone&lt;/span&gt;
dig DS yourdomain.com @8.8.8.8 +short
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For a visual chain-of-trust verification, &lt;code&gt;dnsviz.net&lt;/code&gt; generates a diagram showing the full DNSSEC validation path. This is useful audit evidence — it shows the complete chain, not just the presence of individual records.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Evidence requirement:&lt;/strong&gt; DNSKEY record output, DS record in the parent zone, or a DNSViz screenshot showing a green validation chain. Timestamped at audit start and periodically through the audit period.&lt;/p&gt;




&lt;h3&gt;
  
  
  Control 5: CAA records restricting certificate issuance
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What auditors check:&lt;/strong&gt; Whether CAA records exist at your domain that specify which certificate authorities are permitted to issue TLS certificates for your domain.&lt;/p&gt;

&lt;p&gt;Without CAA records, any publicly trusted CA can issue a certificate for your domain. CAA records constrain this to your approved CA(s) — so even if an attacker successfully completes a DV validation challenge through a rogue CA, that CA cannot issue the certificate if it is not listed in your CAA record.&lt;/p&gt;

&lt;p&gt;Check:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dig yourdomain.com CAA +short
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pass condition: at least one &lt;code&gt;0 issue "your-ca.com"&lt;/code&gt; record exists authorizing your current CA.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Evidence requirement:&lt;/strong&gt; CAA record export showing authorized CAs. If you use Let's Encrypt, the record should authorize &lt;code&gt;letsencrypt.org&lt;/code&gt;. If DigiCert, &lt;code&gt;digicert.com&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Evidence Assembly Problem
&lt;/h2&gt;

&lt;p&gt;Most SaaS companies that fail CC6.6 reviews are not failing because their controls are wrong. They are failing because their evidence is wrong.&lt;/p&gt;

&lt;p&gt;Evidence problems fall into three patterns:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pattern 1: Point-in-time snapshots.&lt;/strong&gt; You export your DNS records the week before the audit and submit them as evidence. The auditor asks: "How do we know these controls were in place on January 1 when the audit period started?" You have no answer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pattern 2: Manually assembled packages.&lt;/strong&gt; Your team spends 20+ hours before each audit cycle hunting down screenshots, pulling DMARC report exports, collecting DNS record outputs, and organizing them into an evidence folder. This is expensive, error-prone, and produces inconsistent output across audit cycles.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pattern 3: Missing RUA data.&lt;/strong&gt; Your DMARC record has a &lt;code&gt;rua=&lt;/code&gt; address, but no one has been reading the reports. The auditor asks to see DMARC aggregate reports for the audit period and you have six months of unread XML files in an inbox. The data exists but is not actionable — which is functionally the same as not having DMARC reporting at all from an audit perspective.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Automated Evidence Collection Looks Like
&lt;/h2&gt;

&lt;p&gt;The alternative to manual evidence assembly is a continuous monitoring system that generates timestamped audit evidence as a byproduct of its normal operation.&lt;/p&gt;

&lt;p&gt;For SOC2 CC6.6, the evidence package an auditor wants covers five things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;DMARC record showing &lt;code&gt;p=quarantine&lt;/code&gt; or &lt;code&gt;p=reject&lt;/code&gt; — with history showing it was in this state throughout the audit period&lt;/li&gt;
&lt;li&gt;MTA-STS policy file in &lt;code&gt;enforce&lt;/code&gt; mode — with history&lt;/li&gt;
&lt;li&gt;DNSSEC validation active — with history&lt;/li&gt;
&lt;li&gt;CAA records authorizing approved CAs — with history&lt;/li&gt;
&lt;li&gt;DMARC RUA reports showing compliance rates — actively received and reviewed&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The word "history" is doing most of the work here. A single clean screenshot is not history. A timestamped log of automated scans run daily or weekly across the audit period is history. It shows continuity, not just current state.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://zerohook.org" rel="noopener noreferrer"&gt;ZeroHook&lt;/a&gt; runs continuous DNS and email security scans and maintains a tamper-proof, hash-verified audit log — the kind of timestamped, continuous evidence record that answers the auditor's "how do we know this was in place on day one?" question directly. The Compliance Pro tier includes automated evidence collection mapped specifically to SOC2 CC6.6, NIS2, and ISO 27001 Annex A.&lt;/p&gt;

&lt;p&gt;The audit evidence package is generated from the monitoring history, not assembled manually before the audit. The difference in preparation time is the difference between two hours and two days.&lt;/p&gt;




&lt;h2&gt;
  
  
  The CC6.6 Audit Preparation Checklist
&lt;/h2&gt;

&lt;p&gt;Run through this at least 90 days before your audit period starts — not 90 days before the auditor arrives.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;Technical controls:

- [ ] DMARC at _dmarc.yourdomain.com with p=quarantine or p=reject
      dig _dmarc.yourdomain.com TXT +short

- [ ] SPF includes all active sending services (CRM, marketing, transactional)
      dig yourdomain.com TXT +short | grep spf

- [ ] DKIM configured for every sending service, all keys 2048-bit
      dig [selector]._domainkey.yourdomain.com TXT +short

- [ ] MTA-STS policy file exists at mta-sts.yourdomain.com with mode: enforce
      curl https://mta-sts.yourdomain.com/.well-known/mta-sts.txt

- [ ] DNSSEC enabled — DNSKEY records present, DS in parent zone
      dig yourdomain.com DNSKEY +short

- [ ] CAA records specify authorized CAs
      dig yourdomain.com CAA +short

- [ ] MFA enforced on all accounts with DNS or email configuration access
      (registrar account, DNS provider, email provider admin panel)

Evidence:

- [ ] Continuous monitoring active — not just point-in-time scans
- [ ] DMARC RUA reports being received and reviewed (not just published)
- [ ] Timestamped history of all controls for the full audit period
- [ ] DMARC compliance rate above 95% in aggregate reports
- [ ] No unauthorized senders appearing in DMARC RUA reports
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  The MFA Requirement Under CC6.6
&lt;/h2&gt;

&lt;p&gt;CC6.6 is specifically about &lt;em&gt;logical access controls&lt;/em&gt; — and that extends beyond DNS records to the accounts that can modify them.&lt;/p&gt;

&lt;p&gt;Every account with write access to your DNS records, your email provider configuration, or your domain registrar must have MFA enforced. This includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The Cloudflare, Route53, or Google Cloud DNS dashboard account&lt;/li&gt;
&lt;li&gt;The domain registrar account (GoDaddy, Namecheap, etc.)&lt;/li&gt;
&lt;li&gt;The email provider admin panel (Google Workspace Admin, Microsoft 365 Admin Center)&lt;/li&gt;
&lt;li&gt;Any CI/CD service accounts that can push DNS configuration changes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For SOC2, MFA must be enforced — not optional. If a user can disable or bypass MFA on an admin account, the control is not in place. Document which accounts have admin access and confirm MFA enforcement for each.&lt;/p&gt;




&lt;h2&gt;
  
  
  What the Audit Evidence Package Should Contain
&lt;/h2&gt;

&lt;p&gt;When your auditor requests CC6.6 evidence for DNS and email security, hand them this:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Evidence item&lt;/th&gt;
&lt;th&gt;Format&lt;/th&gt;
&lt;th&gt;Period covered&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;DMARC record with p= value&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;dig&lt;/code&gt; output or monitoring export&lt;/td&gt;
&lt;td&gt;Start of audit period + current&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DMARC RUA compliance trend&lt;/td&gt;
&lt;td&gt;Dashboard export or report screenshots&lt;/td&gt;
&lt;td&gt;Full audit period&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SPF record&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;dig&lt;/code&gt; output&lt;/td&gt;
&lt;td&gt;Start of audit period + current&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DKIM records per sender&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;dig&lt;/code&gt; outputs&lt;/td&gt;
&lt;td&gt;Current&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MTA-STS policy file&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;curl&lt;/code&gt; output&lt;/td&gt;
&lt;td&gt;Start of audit period + current&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DNSSEC validation&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;dig&lt;/code&gt; DNSKEY output or DNSViz screenshot&lt;/td&gt;
&lt;td&gt;Start of audit period + current&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CAA records&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;dig&lt;/code&gt; output&lt;/td&gt;
&lt;td&gt;Start of audit period + current&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MFA enforcement log&lt;/td&gt;
&lt;td&gt;Admin console screenshots&lt;/td&gt;
&lt;td&gt;Current policy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Continuous monitoring history&lt;/td&gt;
&lt;td&gt;Automated scan log with timestamps&lt;/td&gt;
&lt;td&gt;Full audit period&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The column "start of audit period + current" is the key. Auditors want to see that the control was in place when the clock started, not just that it is in place now.&lt;/p&gt;




&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CC6.6 covers external threat controls&lt;/strong&gt; — email authentication (SPF, DKIM, DMARC), DNS integrity (DNSSEC, CAA), and transport security (MTA-STS in enforce mode) all map directly to CC6.6 and CC6.1&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;p=none DMARC fails CC6.6&lt;/strong&gt; — enforcement is the requirement; monitoring is not. Move to p=quarantine or p=reject before your audit window opens, not before the auditor arrives&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SOC2 auditors look back, not just at current state&lt;/strong&gt; — if p=none was in place for any portion of the audit period, those months fail the control regardless of what you fix afterward&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unauthorized senders in DMARC reports are a red flag&lt;/strong&gt; — audit every service sending email as your domain and ensure SPF and DKIM cover all of them&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evidence must show continuity, not a point in time&lt;/strong&gt; — timestamped automated monitoring history is what satisfies "how do we know this was in place on day one?"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MFA on all DNS and email admin accounts is part of CC6.6&lt;/strong&gt; — document which accounts have access and confirm enforcement, not just availability&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;*Part of an ongoing series on DNS security and compliance.&lt;/p&gt;

</description>
      <category>soc2</category>
      <category>dns</category>
      <category>email</category>
      <category>zerohook</category>
    </item>
    <item>
      <title>NIS2 Compliance for Small Businesses: The Ultimate 2026 Checklist</title>
      <dc:creator>Regő Botond Ronyecz</dc:creator>
      <pubDate>Sat, 30 May 2026 01:11:28 +0000</pubDate>
      <link>https://dev.to/rronyecz/nis2-compliance-for-small-businesses-the-ultimate-2026-checklist-3275</link>
      <guid>https://dev.to/rronyecz/nis2-compliance-for-small-businesses-the-ultimate-2026-checklist-3275</guid>
      <description>&lt;p&gt;NIS2 enforcement started in October 2024. There is no grace period. There is no "we're working on it" exemption for small businesses. If your organization falls under the directive, the obligations are active now.&lt;/p&gt;

&lt;p&gt;The fines are real: up to &lt;strong&gt;€10,000,000 or 2% of global annual turnover&lt;/strong&gt; for Essential Entities, up to &lt;strong&gt;€7,000,000 or 1.4%&lt;/strong&gt; for Important Entities — whichever is higher. Your national competent authority (NCA) administers enforcement, and the first wave of formal audits is already underway in several member states.&lt;/p&gt;

&lt;p&gt;Most NIS2 compliance guides are written for enterprise legal and security teams. This one is written for the IT manager, founder, or sysadmin at a 30–200 person business who needs to know exactly what to do, in what order, and what constitutes sufficient evidence.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 0: Confirm Whether NIS2 Applies to You
&lt;/h2&gt;

&lt;p&gt;Before building a compliance program, confirm your scope. NIS2 applies to medium-sized and larger organizations — 50+ employees or €10M+ annual turnover — operating in covered sectors.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Essential Entities&lt;/strong&gt; (higher fine exposure, stricter supervision):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Energy (electricity, oil, gas, district heating, hydrogen)&lt;/li&gt;
&lt;li&gt;Transport (air, rail, water, road)&lt;/li&gt;
&lt;li&gt;Banking and financial market infrastructure&lt;/li&gt;
&lt;li&gt;Health (hospitals, labs, pharmaceutical manufacturers)&lt;/li&gt;
&lt;li&gt;Drinking water and wastewater&lt;/li&gt;
&lt;li&gt;Digital infrastructure — this is the catch-all that captures many SaaS companies. Cloud providers, data centers, CDNs, DNS providers, internet exchange points, and trust service providers all fall here above certain thresholds.&lt;/li&gt;
&lt;li&gt;ICT service management (managed service providers, managed security providers)&lt;/li&gt;
&lt;li&gt;Public administration&lt;/li&gt;
&lt;li&gt;Space&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Important Entities&lt;/strong&gt; (lower fine exposure, reactive supervision):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Postal and courier services&lt;/li&gt;
&lt;li&gt;Waste management&lt;/li&gt;
&lt;li&gt;Manufacture and distribution of chemicals&lt;/li&gt;
&lt;li&gt;Food production, processing, and distribution&lt;/li&gt;
&lt;li&gt;Manufacturing of medical devices, electronics, machinery, motor vehicles&lt;/li&gt;
&lt;li&gt;Digital providers: online marketplaces, online search engines, social networking platforms&lt;/li&gt;
&lt;li&gt;Research organizations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you provide B2B software or infrastructure services to organizations in any of the above sectors, you may fall under NIS2 as an ICT third-party provider even if your own sector is not listed.&lt;/p&gt;

&lt;p&gt;If you are outside the EU but provide services to EU organizations in covered sectors, NIS2 may still apply to you.&lt;/p&gt;

&lt;p&gt;If your organization is below the size thresholds, you may still be covered if a member state has designated you as critical infrastructure. When in doubt, check with your national competent authority.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Core Legal Requirement: Article 21
&lt;/h2&gt;

&lt;p&gt;Everything in NIS2 compliance for technical teams flows through &lt;strong&gt;Article 21 — Cybersecurity Risk-Management Measures&lt;/strong&gt;. It requires "appropriate and proportionate technical, operational and organisational measures" across ten areas.&lt;/p&gt;

&lt;p&gt;For small businesses, the areas that translate directly into auditable technical controls are:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Article 21 Sub-Clause&lt;/th&gt;
&lt;th&gt;What it covers&lt;/th&gt;
&lt;th&gt;Technical equivalent&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;21.2c&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Business continuity&lt;/td&gt;
&lt;td&gt;Redundant DNS, MX failover&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;21.2d&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Supply chain security&lt;/td&gt;
&lt;td&gt;Email authentication (SPF, DKIM, DMARC)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;21.2g&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cryptography and encryption&lt;/td&gt;
&lt;td&gt;DNSSEC, MTA-STS, TLS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;21.2h&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Human resources, access control&lt;/td&gt;
&lt;td&gt;Staff training, access management&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;21.2i&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Multi-factor authentication&lt;/td&gt;
&lt;td&gt;MFA on all admin accounts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;21.2j&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Secure communications&lt;/td&gt;
&lt;td&gt;Encrypted email transport, TLS-RPT monitoring&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The critical word in Article 21 is "appropriate." Auditors do not expect a 20-person business to operate a 24/7 SOC. They do expect documented controls that are proportionate to your size, sector, and risk exposure — and evidence that those controls are actively maintained, not configured once and forgotten.&lt;/p&gt;




&lt;h2&gt;
  
  
  The NIS2 Technical Checklist for Small Businesses
&lt;/h2&gt;

&lt;p&gt;Work through this in order. The first section covers the technical DNS and email controls that map directly to Article 21. The second covers the documentation and process evidence auditors look for on top of the technical layer.&lt;/p&gt;




&lt;h3&gt;
  
  
  Section 1: DNS and Email Security Controls
&lt;/h3&gt;

&lt;p&gt;These are the technical measures that auditors check first because they are objectively verifiable. Pass or fail is deterministic — either the record exists and is correctly configured, or it does not.&lt;/p&gt;

&lt;h4&gt;
  
  
  1.1 — SPF record is published and valid (Article 21.2d)
&lt;/h4&gt;

&lt;p&gt;SPF (Sender Policy Framework) lists which mail servers are authorized to send email from your domain. Without it, anyone can send forged email claiming to be from your address.&lt;/p&gt;

&lt;p&gt;Check:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dig yourdomain.com TXT +short | &lt;span class="nb"&gt;grep &lt;/span&gt;spf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pass condition: a TXT record starting with &lt;code&gt;v=spf1&lt;/code&gt; exists, includes all your sending services, and ends with &lt;code&gt;~all&lt;/code&gt; or &lt;code&gt;-all&lt;/code&gt;. The record must not exceed 10 DNS lookups. Two &lt;code&gt;v=spf1&lt;/code&gt; records on the same domain is an automatic fail — only one is allowed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NIS2 mapping:&lt;/strong&gt; Article 21.2d — supply chain. Email sent from your domain on behalf of business processes is part of your ICT supply chain. Unauthenticated email is an uncontrolled attack surface.&lt;/p&gt;




&lt;h4&gt;
  
  
  1.2 — DKIM is configured for all sending services (Article 21.2d)
&lt;/h4&gt;

&lt;p&gt;DKIM (DomainKeys Identified Mail) adds a cryptographic signature to outgoing email. Receiving servers verify the signature against a public key you publish in DNS. If the signature doesn't match, the email is flagged or rejected.&lt;/p&gt;

&lt;p&gt;Check:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dig selector._domainkey.yourdomain.com TXT +short
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Replace &lt;code&gt;selector&lt;/code&gt; with the selector name from your email provider (commonly &lt;code&gt;google&lt;/code&gt;, &lt;code&gt;selector1&lt;/code&gt;, or &lt;code&gt;default&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Pass condition: a TXT record starting with &lt;code&gt;v=DKIM1; k=rsa; p=&lt;/code&gt; exists for each active email service. Key length must be 2048 bits — 1024-bit keys are considered weak and should be rotated. Selectors with empty &lt;code&gt;p=&lt;/code&gt; values indicate a revoked key and should be removed from DNS.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NIS2 mapping:&lt;/strong&gt; Article 21.2d — supply chain security, and Article 21.2g — cryptography. DKIM is a cryptographic control on email transmission.&lt;/p&gt;




&lt;h4&gt;
  
  
  1.3 — DMARC policy is p=quarantine or p=reject (Article 21.2d)
&lt;/h4&gt;

&lt;p&gt;This is the single most common NIS2 compliance failure on email. &lt;code&gt;p=none&lt;/code&gt; does not satisfy Article 21.2d because it does not enforce the policy — it only monitors. Auditors will explicitly check this.&lt;/p&gt;

&lt;p&gt;Check:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dig _dmarc.yourdomain.com TXT +short
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pass condition: a TXT record exists at &lt;code&gt;_dmarc.yourdomain.com&lt;/code&gt; with &lt;code&gt;p=quarantine&lt;/code&gt; or &lt;code&gt;p=reject&lt;/code&gt;. A &lt;code&gt;rua=&lt;/code&gt; address for receiving aggregate reports must also be present — without it you have no visibility into what is failing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NIS2 mapping:&lt;/strong&gt; Article 21.2d. &lt;code&gt;p=none&lt;/code&gt; explicitly does not qualify as an enforced control under NIS2. The requirement is enforcement, not observation.&lt;/p&gt;

&lt;p&gt;If you are currently at &lt;code&gt;p=none&lt;/code&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Monitor DMARC reports for 2–4 weeks using a parser (Postmark DMARC Digests, DMARC Analyzer)&lt;/li&gt;
&lt;li&gt;Confirm all legitimate sending services pass SPF and DKIM&lt;/li&gt;
&lt;li&gt;Move to &lt;code&gt;p=quarantine&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;After another 2–4 weeks of clean reports, move to &lt;code&gt;p=reject&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Do not jump directly to &lt;code&gt;p=reject&lt;/code&gt; — it will block legitimate emails if any sending service is not yet authenticated.&lt;/p&gt;




&lt;h4&gt;
  
  
  1.4 — DNSSEC is enabled (Article 21.2g)
&lt;/h4&gt;

&lt;p&gt;DNSSEC adds cryptographic signatures to your DNS records, allowing resolvers to verify that answers have not been tampered with in transit. Without DNSSEC, cache poisoning attacks can redirect your domain's traffic to an attacker's server — silently, with no warning to your users.&lt;/p&gt;

&lt;p&gt;Check:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dig yourdomain.com DNSKEY +short
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pass condition: DNSKEY records are present and a DS record exists in the parent zone (your TLD). The full chain of trust can be verified at dnsviz.net.&lt;/p&gt;

&lt;p&gt;Setup on managed providers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cloudflare:&lt;/strong&gt; DNS → Settings → DNSSEC → Enable → copy DS record to registrar&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Route53:&lt;/strong&gt; Hosted zone → DNSSEC signing → Enable → add DS record at registrar (KMS key must be in &lt;code&gt;us-east-1&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google Cloud DNS:&lt;/strong&gt; Cloud DNS → zone → DNSSEC → Enable → copy DS record to registrar&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;NIS2 mapping:&lt;/strong&gt; Article 21.2g — cryptography and encryption. DNSSEC is explicitly a cryptographic measure for DNS integrity.&lt;/p&gt;




&lt;h4&gt;
  
  
  1.5 — MTA-STS is configured in enforce mode (Article 21.2g / 21.2j)
&lt;/h4&gt;

&lt;p&gt;MTA-STS (Mail Transfer Agent Strict Transport Security) instructs other mail servers to use TLS when connecting to yours, and prevents downgrade attacks that would allow email to be transmitted unencrypted. Without MTA-STS, an attacker on the network path between two mail servers can strip TLS and read email in transit.&lt;/p&gt;

&lt;p&gt;MTA-STS requires two components:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A policy file hosted at &lt;code&gt;https://mta-sts.yourdomain.com/.well-known/mta-sts.txt&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;A TXT record at &lt;code&gt;_mta-sts.yourdomain.com&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The policy file content for enforce mode:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;STSv1&lt;/span&gt;
&lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;enforce&lt;/span&gt;
&lt;span class="na"&gt;mx&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mail.yourdomain.com&lt;/span&gt;
&lt;span class="na"&gt;max_age&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;86400&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The DNS record:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;_mta-sts.yourdomain.com TXT "v=STSv1; id=20240101000000"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;id&lt;/code&gt; value must change whenever you update the policy file — it signals to other mail servers that they should fetch the new policy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NIS2 mapping:&lt;/strong&gt; Article 21.2g (cryptography) and Article 21.2j (secure communications). MTA-STS is a transport encryption enforcement measure for email.&lt;/p&gt;




&lt;h4&gt;
  
  
  1.6 — TLS-RPT is configured (Article 21.2j)
&lt;/h4&gt;

&lt;p&gt;TLS-RPT (TLS Reporting) sends you daily reports from other mail servers about TLS negotiation failures when they attempt to deliver email to your domain. Without it, you have no visibility into whether your email transport encryption is working correctly in practice.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dig _smtp._tls.yourdomain.com TXT +short
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pass condition: a TXT record exists at &lt;code&gt;_smtp._tls.yourdomain.com&lt;/code&gt; with a &lt;code&gt;rua=&lt;/code&gt; address to receive reports.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NIS2 mapping:&lt;/strong&gt; Article 21.2j — secure communications monitoring.&lt;/p&gt;




&lt;h4&gt;
  
  
  1.7 — Redundant nameservers in separate geographic locations (Article 21.2c)
&lt;/h4&gt;

&lt;p&gt;NIS2 Article 21.2c requires business continuity measures for ICT systems. For DNS, this means at minimum two nameservers that are geographically and network-separated — so a single regional outage does not take your domain offline entirely.&lt;/p&gt;

&lt;p&gt;Check:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dig yourdomain.com NS +short
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pass condition: at least two nameservers are returned. Managed DNS providers (Cloudflare, Route53, Google Cloud DNS) satisfy geographic redundancy by default through their Anycast networks — if you are using one of these, this control is met.&lt;/p&gt;

&lt;p&gt;If you are running self-hosted DNS, verify that your secondary nameserver is on a different ASN and in a different data center region from your primary.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NIS2 mapping:&lt;/strong&gt; Article 21.2c — business continuity and crisis management.&lt;/p&gt;




&lt;h4&gt;
  
  
  1.8 — Blacklist monitoring is active (Article 21.2d)
&lt;/h4&gt;

&lt;p&gt;If your sending IP or domain appears on a major blacklist (Spamhaus, Barracuda, Microsoft SNDS), your email is rejected by large portions of the internet. This is an active and ongoing supply chain risk — blacklistings happen without warning and can persist for days before anyone on your team notices through manual checks.&lt;/p&gt;

&lt;p&gt;Manual check:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Spamhaus combined zone (SBL + XBL + PBL):&lt;/span&gt;
dig &lt;span class="o"&gt;{&lt;/span&gt;reversed-ip&lt;span class="o"&gt;}&lt;/span&gt;.zen.spamhaus.org A
&lt;span class="c"&gt;# NXDOMAIN = clean. Any other response = listed.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For continuous coverage, automated blacklist monitoring across 50+ databases is the practical requirement — manual checks only tell you the status at the moment you run them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NIS2 mapping:&lt;/strong&gt; Article 21.2d — supply chain security. Blacklist status directly affects whether your business communications reach their intended recipients.&lt;/p&gt;




&lt;h4&gt;
  
  
  1.9 — SSL certificate expiry monitoring (Article 21.2g)
&lt;/h4&gt;

&lt;p&gt;An expired SSL certificate causes browser trust errors on your website and can break encrypted services. For NIS2 purposes, certificate expiry monitoring is part of cryptographic hygiene under Article 21.2g.&lt;/p&gt;

&lt;p&gt;Check:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; | openssl s_client &lt;span class="nt"&gt;-connect&lt;/span&gt; yourdomain.com:443 2&amp;gt;/dev/null | openssl x509 &lt;span class="nt"&gt;-noout&lt;/span&gt; &lt;span class="nt"&gt;-dates&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pass condition: &lt;code&gt;notAfter&lt;/code&gt; is at least 30 days in the future. Automated monitoring that alerts before expiry eliminates the failure mode entirely.&lt;/p&gt;




&lt;h4&gt;
  
  
  1.10 — CAA records restrict certificate issuance (Article 21.2g)
&lt;/h4&gt;

&lt;p&gt;CAA (Certification Authority Authorization) records specify which certificate authorities are permitted to issue SSL certificates for your domain. Without CAA records, any of the hundreds of publicly trusted certificate authorities in the world can issue a certificate for your domain — including in response to a phishing or social engineering attack.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dig yourdomain.com CAA +short
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pass condition: at least one CAA record authorizing your current CA exists. Add one &lt;code&gt;issue&lt;/code&gt; record for each CA you actively use.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NIS2 mapping:&lt;/strong&gt; Article 21.2g — cryptographic controls on certificate issuance.&lt;/p&gt;




&lt;h3&gt;
  
  
  Section 2: Documentation and Evidence
&lt;/h3&gt;

&lt;p&gt;The technical controls in Section 1 are necessary but not sufficient. NIS2 auditors require documented evidence that controls exist and are continuously maintained. Point-in-time evidence — a scan result you generate the day before the audit — does not demonstrate continuous monitoring.&lt;/p&gt;

&lt;h4&gt;
  
  
  2.1 — ICT risk register includes DNS and email infrastructure
&lt;/h4&gt;

&lt;p&gt;Your risk register must document DNS zone and email infrastructure as critical ICT assets. For each asset, document: the threat, the likelihood, the impact, and the current control in place.&lt;/p&gt;

&lt;p&gt;Minimum entry format:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Asset: DNS zone (yourdomain.com)
Threat: DNS hijacking / cache poisoning
Likelihood: Medium
Impact: High (complete service outage, credential harvesting)
Control: DNSSEC enabled, nameserver monitoring active
Review date: [quarterly]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The register must be dated and versioned. Version history is itself evidence of ongoing maintenance.&lt;/p&gt;




&lt;h4&gt;
  
  
  2.2 — Incident response plan covers DNS and email incidents
&lt;/h4&gt;

&lt;p&gt;Your IRP must cover the scenario where DNS records are modified without authorization, or where your sending IP is blacklisted. For NIS2, significant incidents must be reported to your national CSIRT within &lt;strong&gt;24 hours&lt;/strong&gt; of detection, with a full report within &lt;strong&gt;72 hours&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The plan must document:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Detection (how will you know?)&lt;/li&gt;
&lt;li&gt;Containment (what do you do immediately?)&lt;/li&gt;
&lt;li&gt;CSIRT notification (who contacts them, with what information?)&lt;/li&gt;
&lt;li&gt;Recovery (how do you restore correct state?)&lt;/li&gt;
&lt;li&gt;Post-incident review (what changed?)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A three-page document that covers these five points is sufficient. It must exist, be dated, and be tested at least annually via tabletop exercise.&lt;/p&gt;




&lt;h4&gt;
  
  
  2.3 — Continuous monitoring evidence with timestamps
&lt;/h4&gt;

&lt;p&gt;This is the hardest requirement to satisfy with manual processes. Auditors look for a continuous, timestamped record of monitoring activity — not a report you generated for the audit.&lt;/p&gt;

&lt;p&gt;Acceptable continuous monitoring evidence:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Automated scan results with timestamps covering the audit period (90+ days)&lt;/li&gt;
&lt;li&gt;Alert history showing that when a control changed, your team was notified&lt;/li&gt;
&lt;li&gt;Remediation records showing that alerts were investigated and resolved&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Not acceptable as continuous monitoring evidence:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A single clean scan report dated the week before the audit&lt;/li&gt;
&lt;li&gt;A spreadsheet of manual checks without timestamps&lt;/li&gt;
&lt;li&gt;Screenshots of current DNS records without historical context&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tools like &lt;a href="https://zerohook.org" rel="noopener noreferrer"&gt;ZeroHook&lt;/a&gt; run continuous DNS and email security scans, maintain a timestamped audit log, and generate compliance-mapped evidence packages for NIS2 auditors — the kind of output that directly answers "show me your continuous monitoring" without manual assembly.&lt;/p&gt;




&lt;h4&gt;
  
  
  2.4 — Supply chain vendor register
&lt;/h4&gt;

&lt;p&gt;NIS2 Article 21.2d requires you to assess the security posture of ICT suppliers that have access to your systems or handle your data. This includes your email provider, DNS host, cloud hosting, and any SaaS tools with access to sensitive data.&lt;/p&gt;

&lt;p&gt;Minimum vendor register entry:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Vendor: [Name]
Service: [What they provide]
Data accessed: [Customer data / employee data / none]
Security certification: [ISO 27001 cert no. / SOC2 report / N/A]
Last reviewed: [Date]
Contractual DPA: [Yes / No]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Requesting a vendor's security certification or sending a brief questionnaire — documented in an email thread — constitutes active supply chain due diligence. The fact of having asked, with a date, is evidence.&lt;/p&gt;




&lt;h4&gt;
  
  
  2.5 — Staff security training records
&lt;/h4&gt;

&lt;p&gt;Article 21.2h requires human resources security including cybersecurity awareness. For small businesses, the minimum viable evidence is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A security awareness training session covering phishing, password hygiene, and incident reporting — at least annually&lt;/li&gt;
&lt;li&gt;Attendance records or completion certificates&lt;/li&gt;
&lt;li&gt;A written policy for reporting suspected incidents (even a one-page document)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Phishing simulation results are a strong positive signal in an audit — they demonstrate active testing of human controls, not just training delivery.&lt;/p&gt;




&lt;h4&gt;
  
  
  2.6 — MFA is enforced on all administrative accounts (Article 21.2i)
&lt;/h4&gt;

&lt;p&gt;Article 21.2i explicitly requires multi-factor authentication for remote access and administrative access to systems. This is one of the clearest mandatory requirements in NIS2.&lt;/p&gt;

&lt;p&gt;Document:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;List of administrative accounts (email, DNS, cloud, critical SaaS)&lt;/li&gt;
&lt;li&gt;MFA method for each (TOTP, hardware key, etc.)&lt;/li&gt;
&lt;li&gt;Enforcement status (is MFA enforced by policy, or optional?)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;MFA must be enforced, not optional. If users can bypass MFA on admin accounts, the control is not in place for NIS2 purposes.&lt;/p&gt;




&lt;h2&gt;
  
  
  NIS2 Compliance Status: A Quick Self-Assessment
&lt;/h2&gt;

&lt;p&gt;Use this scoring table to gauge where you stand before a formal audit.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Control&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;th&gt;NIS2 Article&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SPF published and valid&lt;/td&gt;
&lt;td&gt;✅ Pass · ❌ Fail · ⬜ Pending&lt;/td&gt;
&lt;td&gt;21.2d&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DKIM configured, 2048-bit keys&lt;/td&gt;
&lt;td&gt;✅ Pass · ❌ Fail · ⬜ Pending&lt;/td&gt;
&lt;td&gt;21.2d, 21.2g&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DMARC at p=quarantine or p=reject&lt;/td&gt;
&lt;td&gt;✅ Pass · ❌ Fail · ⬜ Pending&lt;/td&gt;
&lt;td&gt;21.2d&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DNSSEC enabled&lt;/td&gt;
&lt;td&gt;✅ Pass · ❌ Fail · ⬜ Pending&lt;/td&gt;
&lt;td&gt;21.2g&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MTA-STS in enforce mode&lt;/td&gt;
&lt;td&gt;✅ Pass · ❌ Fail · ⬜ Pending&lt;/td&gt;
&lt;td&gt;21.2g, 21.2j&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TLS-RPT configured&lt;/td&gt;
&lt;td&gt;✅ Pass · ❌ Fail · ⬜ Pending&lt;/td&gt;
&lt;td&gt;21.2j&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Redundant nameservers&lt;/td&gt;
&lt;td&gt;✅ Pass · ❌ Fail · ⬜ Pending&lt;/td&gt;
&lt;td&gt;21.2c&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Blacklist monitoring active&lt;/td&gt;
&lt;td&gt;✅ Pass · ❌ Fail · ⬜ Pending&lt;/td&gt;
&lt;td&gt;21.2d&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SSL expiry monitored&lt;/td&gt;
&lt;td&gt;✅ Pass · ❌ Fail · ⬜ Pending&lt;/td&gt;
&lt;td&gt;21.2g&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CAA records in place&lt;/td&gt;
&lt;td&gt;✅ Pass · ❌ Fail · ⬜ Pending&lt;/td&gt;
&lt;td&gt;21.2g&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ICT risk register maintained&lt;/td&gt;
&lt;td&gt;✅ Pass · ❌ Fail · ⬜ Pending&lt;/td&gt;
&lt;td&gt;21.2a&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Incident response plan documented&lt;/td&gt;
&lt;td&gt;✅ Pass · ❌ Fail · ⬜ Pending&lt;/td&gt;
&lt;td&gt;21.2b&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Continuous monitoring evidence&lt;/td&gt;
&lt;td&gt;✅ Pass · ❌ Fail · ⬜ Pending&lt;/td&gt;
&lt;td&gt;21.2 (general)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vendor security register&lt;/td&gt;
&lt;td&gt;✅ Pass · ❌ Fail · ⬜ Pending&lt;/td&gt;
&lt;td&gt;21.2d&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Staff security training records&lt;/td&gt;
&lt;td&gt;✅ Pass · ❌ Fail · ⬜ Pending&lt;/td&gt;
&lt;td&gt;21.2h&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MFA enforced on admin accounts&lt;/td&gt;
&lt;td&gt;✅ Pass · ❌ Fail · ⬜ Pending&lt;/td&gt;
&lt;td&gt;21.2i&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;12 or more passes, with no critical failures in DMARC, DNSSEC, or MTA-STS: you are in defensible shape for an initial audit.&lt;/p&gt;

&lt;p&gt;Fewer than 8 passes: prioritize the technical controls in Section 1 before addressing documentation. Auditors verify technical controls first, then look for documentation.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Two Controls That Get Small Businesses in Trouble Most Often
&lt;/h2&gt;

&lt;p&gt;Based on the pattern of NIS2 compliance gaps, two controls account for the majority of Article 21 failures in SMB audits.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DMARC at p=none.&lt;/strong&gt; This is the most common. Organizations set up DMARC for monitoring, never advance to enforcement, and arrive at an audit with a &lt;code&gt;p=none&lt;/code&gt; record they believe is compliant. It is not. NIS2 requires enforcement. A DMARC record with &lt;code&gt;p=none&lt;/code&gt; is treated the same as no DMARC record from a compliance perspective.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No continuous monitoring evidence.&lt;/strong&gt; The second most common. An organization has all the correct technical controls in place but cannot produce timestamped evidence that those controls were continuously active during the audit period. Running a scan the morning of the audit does not demonstrate that the controls were in place three months ago.&lt;/p&gt;

&lt;p&gt;Both of these are solvable. The DMARC fix is a record update. The monitoring evidence problem requires putting automated, continuous monitoring in place before the audit cycle starts — not after you receive the audit notice.&lt;/p&gt;




&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;NIS2 enforcement is active as of October 2024&lt;/strong&gt; — fines up to €10M for Essential Entities, €7M for Important Entities — there is no grace period for small businesses in scope&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The core technical requirement is Article 21&lt;/strong&gt; — DNS security (DNSSEC, redundant nameservers, CAA), email authentication (SPF, DKIM, DMARC at p=quarantine or p=reject), and transport encryption (MTA-STS in enforce mode, TLS-RPT)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;p=none DMARC does not satisfy Article 21.2d&lt;/strong&gt; — enforcement is required, not monitoring. This is the single most common compliance gap in SMB audits&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Continuous monitoring evidence is mandatory&lt;/strong&gt; — point-in-time scan results do not satisfy the requirement. Timestamped automated monitoring covering the audit period is what auditors ask for&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentation requirements are proportionate&lt;/strong&gt; — a dated risk register, a 3-page incident response plan, a vendor register, and staff training records are sufficient for most small businesses&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MFA on all administrative accounts is explicitly required under Article 21.2i&lt;/strong&gt; — optional MFA does not satisfy the requirement&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;*Part of an ongoing series on DNS security and compliance.&lt;/p&gt;

</description>
      <category>nis2</category>
      <category>domain</category>
      <category>dns</category>
      <category>cybersecurity</category>
    </item>
    <item>
      <title>BIMI and VMC: Should Your Business Add a Logo to Emails?</title>
      <dc:creator>Regő Botond Ronyecz</dc:creator>
      <pubDate>Sat, 30 May 2026 01:05:45 +0000</pubDate>
      <link>https://dev.to/rronyecz/bimi-and-vmc-should-your-business-add-a-logo-to-emails-42o6</link>
      <guid>https://dev.to/rronyecz/bimi-and-vmc-should-your-business-add-a-logo-to-emails-42o6</guid>
      <description>&lt;p&gt;Your logo appears in the inbox, next to your email, before the recipient opens it. No subject line tricks. No sender name optimization. Just your brand mark, visible in the inbox the same way a verified checkmark signals trust on social media.&lt;/p&gt;

&lt;p&gt;That's BIMI. It's real, it's live in Gmail, Yahoo Mail, and Apple Mail, and the setup is more straightforward than most people expect — with one significant exception that determines whether it costs you 15 minutes or $1,499 a year.&lt;/p&gt;

&lt;p&gt;This guide covers exactly what BIMI requires, what the VMC certificate is and when you actually need it, and the precise steps to get your logo showing in inboxes.&lt;/p&gt;




&lt;h2&gt;
  
  
  What BIMI Actually Is
&lt;/h2&gt;

&lt;p&gt;BIMI (Brand Indicators for Message Identification) is a DNS TXT record that links a verified logo to your email domain. When a recipient's mail client supports BIMI and sees your domain, it checks for the BIMI record, fetches the logo from the URL in that record, and displays it in the inbox next to the sender name.&lt;/p&gt;

&lt;p&gt;The result is visible in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Yahoo Mail&lt;/strong&gt; — BIMI logo shown without any additional certificate requirement&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Apple Mail&lt;/strong&gt; (iOS 16+ and macOS Ventura+) — BIMI logo shown without additional certificate&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gmail&lt;/strong&gt; — BIMI logo shown, but &lt;strong&gt;only if you have a VMC certificate&lt;/strong&gt; (more on this below)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The key distinction: Gmail treats BIMI differently from other clients. Everyone else will show your logo with a correctly configured BIMI record. Gmail requires an additional paid certificate on top of that.&lt;/p&gt;

&lt;p&gt;BIMI is not a spam filter signal. It does not directly improve your deliverability or affect whether emails reach the inbox. What it does is make your emails visually identifiable in the inbox at a glance — which affects open rates, trust, and phishing resistance (recipients learn to recognize your logo and notice when it's missing).&lt;/p&gt;




&lt;h2&gt;
  
  
  The Prerequisites: What Has to Be in Place First
&lt;/h2&gt;

&lt;p&gt;BIMI has hard requirements. If any of these are missing, the logo will not appear regardless of how correctly your BIMI record is configured.&lt;/p&gt;

&lt;h3&gt;
  
  
  DMARC at p=quarantine or p=reject
&lt;/h3&gt;

&lt;p&gt;This is the most common blocker. BIMI requires your domain to have DMARC enforcement active — &lt;code&gt;p=quarantine&lt;/code&gt; or &lt;code&gt;p=reject&lt;/code&gt;. If your DMARC policy is &lt;code&gt;p=none&lt;/code&gt;, BIMI will not activate.&lt;/p&gt;

&lt;p&gt;Check your current DMARC policy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dig _dmarc.yourdomain.com TXT +short
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you see &lt;code&gt;p=none&lt;/code&gt; in the output, fix that first. The standard approach is to start at &lt;code&gt;p=none&lt;/code&gt; to collect reports, then move to &lt;code&gt;p=quarantine&lt;/code&gt; once you've confirmed all legitimate email sources pass SPF and DKIM, then eventually to &lt;code&gt;p=reject&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Do not skip to &lt;code&gt;p=reject&lt;/code&gt; immediately. Start at &lt;code&gt;p=quarantine&lt;/code&gt;, monitor DMARC reports for two to four weeks to confirm no legitimate mail is failing, then advance to &lt;code&gt;p=reject&lt;/code&gt; if everything is clean.&lt;/p&gt;

&lt;h3&gt;
  
  
  A publicly accessible SVG logo
&lt;/h3&gt;

&lt;p&gt;BIMI requires a logo file hosted at a public HTTPS URL. This is not just any SVG file — it must be &lt;strong&gt;SVG Tiny 1.2&lt;/strong&gt;, a strict subset of the SVG specification. Regular SVG files produced by Illustrator, Figma, or most design tools will not pass BIMI validation, even if they render correctly in browsers.&lt;/p&gt;

&lt;p&gt;Common SVG Tiny 1.2 failures:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CSS &lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt; blocks — SVG Tiny 1.2 requires inline attributes, not stylesheets&lt;/li&gt;
&lt;li&gt;Missing &lt;code&gt;viewBox&lt;/code&gt; attribute&lt;/li&gt;
&lt;li&gt;Gradients and filters — not supported in SVG Tiny 1.2&lt;/li&gt;
&lt;li&gt;Non-square aspect ratio — the spec requires a square logo&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The BIMI Group publishes an official converter at &lt;code&gt;bimigroup.org/svg-conversion&lt;/code&gt; that converts standard SVG files to Tiny 1.2 compliant format. Run your logo through it, then validate the result at &lt;code&gt;validator.bimi-group.org&lt;/code&gt; before adding the DNS record. An invalid SVG means no logo — and no error message telling you why.&lt;/p&gt;

&lt;p&gt;The logo file must be hosted at a URL you control over HTTPS. A common convention is &lt;code&gt;https://yourdomain.com/logo.svg&lt;/code&gt;, but any publicly reachable HTTPS URL works.&lt;/p&gt;




&lt;h2&gt;
  
  
  The BIMI DNS Record
&lt;/h2&gt;

&lt;p&gt;Once your DMARC policy is at &lt;code&gt;p=quarantine&lt;/code&gt; or &lt;code&gt;p=reject&lt;/code&gt; and your SVG logo is validated and hosted, the DNS record is a single TXT entry:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="n"&gt;Record&lt;/span&gt; &lt;span class="n"&gt;type&lt;/span&gt;: &lt;span class="n"&gt;TXT&lt;/span&gt;
&lt;span class="n"&gt;Name&lt;/span&gt;:        &lt;span class="n"&gt;default&lt;/span&gt;.&lt;span class="err"&gt;_&lt;/span&gt;&lt;span class="n"&gt;bimi&lt;/span&gt;
&lt;span class="n"&gt;Value&lt;/span&gt;:       &lt;span class="n"&gt;v&lt;/span&gt;=&lt;span class="n"&gt;BIMI1&lt;/span&gt;; &lt;span class="n"&gt;l&lt;/span&gt;=&lt;span class="n"&gt;https&lt;/span&gt;://&lt;span class="n"&gt;yourdomain&lt;/span&gt;.&lt;span class="n"&gt;com&lt;/span&gt;/&lt;span class="n"&gt;logo&lt;/span&gt;.&lt;span class="n"&gt;svg&lt;/span&gt;; &lt;span class="n"&gt;a&lt;/span&gt;=
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;l=&lt;/code&gt; field is the URL of your logo file. The &lt;code&gt;a=&lt;/code&gt; field is where the VMC certificate URL goes — leave it empty if you don't have one (the field is still required, just with no value).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cloudflare:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. dash.cloudflare.com → select domain → DNS → Add record
2. Type: TXT
3. Name: default._bimi
4. Content: v=BIMI1; l=https://yourdomain.com/logo.svg; a=
5. Proxy status: DNS only (grey cloud — never proxy BIMI records)
6. Save
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;GoDaddy:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. My Products → DNS next to your domain → Add → Type: TXT
2. Host: default._bimi
3. TXT Value: v=BIMI1; l=https://yourdomain.com/logo.svg; a=
4. TTL: 1 Hour → Save
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Namecheap:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Domain List → Manage → Advanced DNS → Add New Record
2. Type: TXT Record
3. Host: default._bimi
4. Value: v=BIMI1; l=https://yourdomain.com/logo.svg; a=
5. TTL: Automatic → green checkmark
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;AWS Route53:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Route 53 → Hosted zones → click your domain → Create record
2. Type: TXT
3. Record name: default._bimi
4. Value: "v=BIMI1; l=https://yourdomain.com/logo.svg; a="
   (Route53 requires the value wrapped in double quotes)
5. TTL: 300 → Create records
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify the record is live:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dig default._bimi.yourdomain.com TXT +short
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  The VMC Question: Do You Actually Need It?
&lt;/h2&gt;

&lt;p&gt;This is where most BIMI guides either oversimplify or overstate the requirement. The answer depends entirely on which inbox providers matter most to your recipients.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Without a VMC:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✓ Logo appears in Yahoo Mail&lt;/li&gt;
&lt;li&gt;✓ Logo appears in Apple Mail (iOS 16+, macOS Ventura+)&lt;/li&gt;
&lt;li&gt;✗ Logo does &lt;strong&gt;not&lt;/strong&gt; appear in Gmail&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;With a VMC:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✓ Logo appears in Yahoo Mail&lt;/li&gt;
&lt;li&gt;✓ Logo appears in Apple Mail&lt;/li&gt;
&lt;li&gt;✓ Logo appears in Gmail&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A Verified Mark Certificate (VMC) is a certificate issued by a Certificate Authority that cryptographically ties your logo to your trademarked brand. The only current VMC issuer is &lt;strong&gt;DigiCert&lt;/strong&gt; — Entrust discontinued VMC issuance in 2023. The cost is approximately &lt;strong&gt;$1,499–$2,499 per year&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The VMC is not just a paid certificate. It has its own prerequisite: &lt;strong&gt;your logo must be a registered trademark&lt;/strong&gt; in the jurisdiction where you operate. DigiCert verifies this during the application process. If your logo is not formally registered as a trademark, you cannot obtain a VMC regardless of budget.&lt;/p&gt;

&lt;p&gt;The decision framework is simple:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Situation&lt;/th&gt;
&lt;th&gt;Recommendation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Your audience is primarily Yahoo Mail or Apple Mail users&lt;/td&gt;
&lt;td&gt;BIMI without VMC — free, 15-minute setup&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Your audience is primarily Gmail users and logo visibility in Gmail is a priority&lt;/td&gt;
&lt;td&gt;BIMI + VMC — $1,499+/year, requires trademark registration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Your logo is not a registered trademark&lt;/td&gt;
&lt;td&gt;BIMI without VMC — VMC is not available to you yet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;You send primarily B2B email to corporate domains on Google Workspace&lt;/td&gt;
&lt;td&gt;Consider VMC — most corporate Gmail users are on Workspace&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;You're a small SMB testing deliverability improvements&lt;/td&gt;
&lt;td&gt;Start without VMC — validate the impact before investing&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For most SMBs, the right starting point is BIMI without a VMC. Your logo will appear in Yahoo and Apple Mail immediately. If you later decide Gmail visibility justifies $1,499/year and you have a registered trademark, adding a VMC is a straightforward upgrade — you add the VMC URL to the &lt;code&gt;a=&lt;/code&gt; field in your existing BIMI record.&lt;/p&gt;




&lt;h2&gt;
  
  
  Full Setup Checklist
&lt;/h2&gt;

&lt;p&gt;Walk through these in order. Each one is a hard dependency on the next.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;□ 1. DMARC record exists with &lt;span class="nv"&gt;p&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;quarantine or &lt;span class="nv"&gt;p&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;reject
      dig _dmarc.yourdomain.com TXT +short

□ 2. SPF and DKIM both passing &lt;span class="o"&gt;(&lt;/span&gt;DMARC requires both&lt;span class="o"&gt;)&lt;/span&gt;
      Send a &lt;span class="nb"&gt;test &lt;/span&gt;email and check headers &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="nv"&gt;spf&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;pass and &lt;span class="nv"&gt;dkim&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;pass

□ 3. Logo file is SVG Tiny 1.2 compliant
      Convert: bimigroup.org/svg-conversion
      Validate: validator.bimi-group.org

□ 4. Logo file is hosted at a public HTTPS URL
      curl &lt;span class="nt"&gt;-I&lt;/span&gt; https://yourdomain.com/logo.svg
      &lt;span class="o"&gt;(&lt;/span&gt;Should &lt;span class="k"&gt;return &lt;/span&gt;200 OK&lt;span class="o"&gt;)&lt;/span&gt;

□ 5. Logo has a square aspect ratio
      Check viewBox &lt;span class="k"&gt;in &lt;/span&gt;the SVG file — width and height values should be equal

□ 6. BIMI TXT record added at default._bimi
      dig default._bimi.yourdomain.com TXT +short

□ 7. &lt;span class="o"&gt;(&lt;/span&gt;Optional&lt;span class="o"&gt;)&lt;/span&gt; VMC purchased from DigiCert and URL added to &lt;span class="nv"&gt;a&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; field
      Only &lt;span class="k"&gt;if &lt;/span&gt;trademark is registered and Gmail logo display is a priority

□ 8. Full BIMI setup validated
      bimigroup.org/bimi-generator
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  What Breaks When You Skip Steps
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;DMARC at p=none.&lt;/strong&gt; The most common reason a correctly configured BIMI record produces no visible logo. Mail clients check DMARC enforcement before rendering BIMI. A &lt;code&gt;p=none&lt;/code&gt; policy fails silently — your BIMI record is technically present, the logo URL is reachable, and nothing shows in the inbox.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Invalid SVG.&lt;/strong&gt; Standard SVG files fail BIMI validation. The failure is silent — the mail client simply doesn't display the logo. The validator at &lt;code&gt;validator.bimi-group.org&lt;/code&gt; is the only way to confirm compliance before you add the DNS record.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;HTTP instead of HTTPS for the logo URL.&lt;/strong&gt; The logo must be served over HTTPS. HTTP will not work, even if the file is reachable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Expecting the Gmail logo without a VMC.&lt;/strong&gt; Gmail requires the VMC certificate. If your BIMI record is correctly configured but the &lt;code&gt;a=&lt;/code&gt; field is empty, your logo will appear in Yahoo and Apple Mail and not in Gmail. This is expected behavior, not a configuration error.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Entrust VMC certificates.&lt;/strong&gt; Entrust discontinued VMC issuance in 2023. If you have an Entrust VMC from before that date, check its expiry — renewal is not available through Entrust. DigiCert is the only current VMC issuer.&lt;/p&gt;




&lt;h2&gt;
  
  
  Is BIMI Worth It?
&lt;/h2&gt;

&lt;p&gt;For most businesses sending high-volume B2C email — e-commerce, financial services, SaaS with a large end-user base — the answer is yes, for the no-VMC setup. The cost is 15 minutes and a compliant SVG file. Your logo appears in Yahoo and Apple Mail inboxes immediately.&lt;/p&gt;

&lt;p&gt;The case for a VMC is narrower. If your audience is primarily Gmail users, your logo is a registered trademark, and open rate impact on $1,499–$2,499/year is worth modeling for your email volume, the VMC adds Gmail coverage. For SMBs with smaller lists, the math typically favors starting with BIMI-only and revisiting VMC when volume justifies it.&lt;/p&gt;

&lt;p&gt;BIMI is a late-stage optimization. Get SPF, DKIM, DMARC, and blacklist status right first. Those affect whether your emails reach the inbox at all. BIMI affects how they look once they get there.&lt;/p&gt;

&lt;p&gt;ZeroHook's 30-point audit includes BIMI validation — it checks whether your logo is reachable at your domain, whether your DMARC policy meets the &lt;code&gt;p=quarantine&lt;/code&gt; or &lt;code&gt;p=reject&lt;/code&gt; threshold, and whether the DNS record is correctly formatted. The fix guide walks through SVG requirements and provider-specific setup steps: &lt;a href="https://zerohook.org" rel="noopener noreferrer"&gt;zerohook.org&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;BIMI is a DNS TXT record at &lt;code&gt;default._bimi&lt;/code&gt;&lt;/strong&gt; that links a verified SVG logo to your email domain so it appears in Yahoo Mail, Apple Mail, and (with a VMC) Gmail&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Two hard prerequisites:&lt;/strong&gt; DMARC at &lt;code&gt;p=quarantine&lt;/code&gt; or &lt;code&gt;p=reject&lt;/code&gt;, and an SVG Tiny 1.2 compliant logo hosted over HTTPS — standard SVG files will silently fail&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;VMC is optional for most setups&lt;/strong&gt; — without it, your logo shows in Yahoo and Apple Mail but not Gmail; with it ($1,499+/year from DigiCert, trademark required), it shows in Gmail too&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Entrust VMCs are discontinued&lt;/strong&gt; — DigiCert is the only current issuer&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Setup without VMC takes 15 minutes&lt;/strong&gt; once DMARC is enforced and the SVG is validated&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fix SPF, DKIM, and DMARC first&lt;/strong&gt; — BIMI is a branding layer on top of working email authentication, not a replacement for it&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;*Part of an ongoing series on email deliverability and DNS security.&lt;/p&gt;

</description>
      <category>email</category>
      <category>deliverability</category>
      <category>bimi</category>
      <category>vmc</category>
    </item>
    <item>
      <title>Why Most DNS Audit Tools Don't Give You the Actual Fix (And Why We Do)</title>
      <dc:creator>Regő Botond Ronyecz</dc:creator>
      <pubDate>Thu, 28 May 2026 20:23:45 +0000</pubDate>
      <link>https://dev.to/rronyecz/why-most-dns-audit-tools-dont-give-you-the-actual-fix-and-why-we-do-4no2</link>
      <guid>https://dev.to/rronyecz/why-most-dns-audit-tools-dont-give-you-the-actual-fix-and-why-we-do-4no2</guid>
      <description>&lt;p&gt;You run the audit. The results come back. SPF: &lt;strong&gt;Fail&lt;/strong&gt;. DMARC: &lt;strong&gt;Not configured&lt;/strong&gt;. Blacklist status: &lt;strong&gt;Listed on 3 databases&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You stare at the screen. The tool has done its job. It found the problems. Now what?&lt;/p&gt;

&lt;p&gt;There is no "what." The tool stops there. The next step is yours: figure out what the record should say, find the right panel in your DNS provider, format it correctly, and hope propagation confirms the fix worked. Most teams open a new tab and start Googling. Some open a support ticket and wait. Some close the browser and move on.&lt;/p&gt;

&lt;p&gt;The audit found the problem. The problem stays unfixed.&lt;/p&gt;

&lt;p&gt;This is not a small gap. It is the reason email deliverability issues persist for weeks at companies that have already run three separate audits. The diagnostic and the remedy are disconnected, and almost no tool in this space has tried to close that gap — until you understand why.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Diagnostic Business Model
&lt;/h2&gt;

&lt;p&gt;Most DNS and email security tools were built by network engineers for network engineers. The design assumption is that whoever runs the audit knows what to do with the results.&lt;/p&gt;

&lt;p&gt;That assumption made sense in 2008. DNS was managed by sysadmins who had memorized RFC 7208 and could write a DKIM TXT record from scratch. The tool's job was to surface the data. The engineer's job was to interpret and fix it.&lt;/p&gt;

&lt;p&gt;The market has changed substantially. Today, DNS is managed by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Founders at early-stage SaaS companies who registered the domain themselves&lt;/li&gt;
&lt;li&gt;Marketing managers who inherited the domain when the previous IT person left&lt;/li&gt;
&lt;li&gt;Office administrators at 40-person logistics companies who have DNS access because someone has to&lt;/li&gt;
&lt;li&gt;Developers who know their stack cold and DNS not at all&lt;/li&gt;
&lt;li&gt;MSPs managing 80 client domains across 12 different registrars&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of these people want a DNS audit result. They want to know what to type and where to type it.&lt;/p&gt;

&lt;p&gt;The tool vendors didn't adapt because their core customers — enterprise security teams, MSSPs, large IT departments — didn't need them to. The diagnostic was sufficient. The rest of the market was either too small to matter or too fragmented to serve with a standardized fix.&lt;/p&gt;




&lt;h2&gt;
  
  
  What "Not Giving You the Fix" Actually Looks Like
&lt;/h2&gt;

&lt;p&gt;Here is what a standard DNS audit result looks like across the tools most people use:&lt;/p&gt;

&lt;h3&gt;
  
  
  MXToolbox
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SPF Record Published: YES
SPF Contains characters after ALL: ERROR
SPF Record Syntax Check: ERROR
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Useful diagnostic. Clear that something is wrong. No indication of what the correct record should say.&lt;/p&gt;

&lt;h3&gt;
  
  
  Google Admin Toolbox (CheckMX)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;✓ Domain has SPF records
✗ Domain's SPF record does not include all sending sources
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Accurate. Clean output. Still no record to copy.&lt;/p&gt;

&lt;h3&gt;
  
  
  dig (command line)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;dig TXT yourdomain.com +short
&lt;span class="s2"&gt;"v=spf1 include:sendgrid.net ~all"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Shows you the current record. Does not tell you what's missing or what to add.&lt;/p&gt;

&lt;h3&gt;
  
  
  Generic audit PDF from a compliance scanner
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Finding: SPF record missing include for third-party ESP
Severity: High
Recommendation: Update SPF record to include authorized sending services
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The recommendation is technically correct and operationally useless.&lt;/p&gt;

&lt;p&gt;In every case, the tool has correctly identified that something is wrong. In no case does it tell you the specific string to add to your DNS provider's TXT record field.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why the Fix Is Harder Than It Looks
&lt;/h2&gt;

&lt;p&gt;Giving an actionable fix is not a UI decision. It requires solving several non-trivial problems simultaneously.&lt;/p&gt;

&lt;h3&gt;
  
  
  Problem 1: The fix depends on your sending stack
&lt;/h3&gt;

&lt;p&gt;An SPF record is not a universal string. It is a list of the specific mail servers authorized to send on your behalf. If you use SendGrid, the correct include is &lt;code&gt;include:sendgrid.net&lt;/code&gt;. If you use Google Workspace, it is &lt;code&gt;include:_spf.google.com&lt;/code&gt;. If you use both, plus Mailchimp and a Salesforce marketing instance, the record has to cover all of them — and stay under the 10 DNS lookup limit.&lt;/p&gt;

&lt;p&gt;A generic audit tool has no idea which ESPs you use. It can tell you your SPF is broken. It cannot tell you which services to add without knowing your sending infrastructure. The right approach is not to guess — it's to show you the email provider options and let you identify your own stack.&lt;/p&gt;

&lt;h3&gt;
  
  
  Problem 2: The fix depends on your DNS provider
&lt;/h3&gt;

&lt;p&gt;Every DNS provider has a different interface. Adding a TXT record in Cloudflare is different from Route53. The field labels in GoDaddy are named differently. Namecheap's Advanced DNS tab splits host and value in a way that confuses first-time users. AWS Route53 requires TXT values wrapped in double quotes — a detail that breaks records silently when you get it wrong.&lt;/p&gt;

&lt;p&gt;A fix that says "add this TXT record" without provider-specific steps leaves you to figure out the interface yourself. That step is exactly where non-technical users give up.&lt;/p&gt;

&lt;h3&gt;
  
  
  Problem 3: The fix has to account for what's already there
&lt;/h3&gt;

&lt;p&gt;DNS records interact. Adding an SPF include without checking the current lookup count can push you over the 10-lookup limit and break SPF for every email you send. Adding a DMARC record without knowing your current DKIM alignment state can trigger quarantining of legitimate mail. The most common SPF mistake — creating a &lt;em&gt;second&lt;/em&gt; TXT record starting with &lt;code&gt;v=spf1&lt;/code&gt; instead of editing the existing one — instantly invalidates both records and breaks all email delivery.&lt;/p&gt;

&lt;p&gt;A correct fix requires reading the existing zone state, not just flagging a missing record.&lt;/p&gt;

&lt;h3&gt;
  
  
  Problem 4: Building the provider database has no clear ROI for most tools
&lt;/h3&gt;

&lt;p&gt;Every DNS provider has its own UI patterns, field naming conventions, and record validation logic. Building and maintaining step-by-step instructions for Cloudflare, GoDaddy, Namecheap, Route53, DigitalOcean, Hostinger, and the rest — and keeping those instructions current as providers update their interfaces — requires ongoing investment.&lt;/p&gt;

&lt;p&gt;For tools that charge per scan or sell to enterprise security teams, that investment has no direct revenue justification. The enterprise buyer doesn't need the step-by-step. The SMB buyer who does need it isn't the primary customer.&lt;/p&gt;




&lt;h2&gt;
  
  
  What a Real Fix Looks Like
&lt;/h2&gt;

&lt;p&gt;Here is what the same SPF finding looks like when the tool gives you the actual remedy.&lt;/p&gt;

&lt;p&gt;If you already have an SPF record, the fix shows your current record, modifies it correctly, and gives you the exact string to replace it with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Your current record:
&lt;span class="nv"&gt;v&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;spf1 include:sendgrid.net ~all

Updated record &lt;span class="o"&gt;(&lt;/span&gt;soft fail — recommended to start&lt;span class="o"&gt;)&lt;/span&gt;:
&lt;span class="nv"&gt;v&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;spf1 include:sendgrid.net ~all

Hard fail version &lt;span class="o"&gt;(&lt;/span&gt;once you&lt;span class="s1"&gt;'ve confirmed all services pass):
v=spf1 include:sendgrid.net -all
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you don't have a record yet, the fix doesn't guess which email provider you use. Instead, it presents email provider tabs — Google Workspace, Microsoft 365, Zoho Mail, Fastmail, Protonmail, SendGrid, Amazon SES — each showing the exact &lt;code&gt;include:&lt;/code&gt; value to add for that provider. You identify your own stack, pick the right tab, and copy the value.&lt;/p&gt;

&lt;p&gt;Then, for adding the record to DNS, a second set of tabs covers each major DNS provider with numbered steps specific to that interface. For Cloudflare:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Log in at dash.cloudflare.com and select your domain.
2. Click DNS in the left sidebar.
3. Click Add record.
4. Set Type to TXT.
5. Set Name to @ (root domain).
6. Paste your complete SPF record into the Content field.
7. Leave Proxy status as DNS only (grey cloud). SPF records must never be proxied.
8. Click Save.

If a TXT record starting with 'v=spf1' already exists, click Edit on that
record instead of adding a new one — having two SPF records breaks all email delivery.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For Route53, the instructions include the detail that TXT values must be wrapped in double quotes in the Value field — a provider-specific requirement that isn't documented anywhere in the AWS console UI itself.&lt;/p&gt;

&lt;p&gt;The person reading this does not need to know what SPF is, what RFC 7208 says, or how SMTP authentication works. They need to know what to copy and where to paste it. The fix guide is structured to make that possible.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Provider Tab System, Across Every Check
&lt;/h2&gt;

&lt;p&gt;This isn't limited to SPF. Every fix guide in ZeroHook's 30-point audit follows the same structure: a corrected record or configuration, email provider tabs where relevant, and DNS provider tabs with numbered steps for each interface.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Check&lt;/th&gt;
&lt;th&gt;What the fix guide provides&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SPF&lt;/td&gt;
&lt;td&gt;Corrected record built from your existing one + email provider tabs + DNS provider steps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DKIM&lt;/td&gt;
&lt;td&gt;Key generation path at your email provider + DNS provider steps for adding the TXT/CNAME&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DMARC&lt;/td&gt;
&lt;td&gt;Starter record with correct policy + rollout timeline + DNS provider steps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CAA&lt;/td&gt;
&lt;td&gt;CA auto-detected from your SSL certificate + CAA record for that CA + DNS provider steps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MX&lt;/td&gt;
&lt;td&gt;Email provider detected from your MX records + correction steps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DNSSEC&lt;/td&gt;
&lt;td&gt;Enable signing at your DNS provider + DS record → registrar steps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MTA-STS&lt;/td&gt;
&lt;td&gt;Policy file content + hosting instructions + TXT record + DNS provider steps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Blacklist&lt;/td&gt;
&lt;td&gt;Direct link to the removal form for the specific list + what to include in the request&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SSL expiry&lt;/td&gt;
&lt;td&gt;Renewal path for your certificate provider&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Subdomain takeover&lt;/td&gt;
&lt;td&gt;Delete this specific DNS record — with the exact record name shown&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The CAA guide is worth noting specifically: it reads your current SSL certificate to detect which certificate authority issued it, then pre-populates the CAA record with that CA's domain. If you're on Let's Encrypt, the record authorizes &lt;code&gt;letsencrypt.org&lt;/code&gt;. If you're on DigiCert, it authorizes &lt;code&gt;digicert.com&lt;/code&gt;. You're not choosing from a generic list — the fix is pre-filled from what your certificate already tells the system.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Continuous Monitoring Without Fixes Is a Treadmill
&lt;/h2&gt;

&lt;p&gt;Most DNS monitoring tools alert you when something changes or breaks. That is genuinely useful. If your SPF record gets corrupted or someone removes your DMARC policy, you want to know immediately.&lt;/p&gt;

&lt;p&gt;But alerting without fixing creates a loop:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Alert fires → Team acknowledges → Ticket opened → DNS person assigned
→ DNS person researches → Fix applied (maybe) → Next alert fires
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At SMB scale, the "DNS person" is often whoever has the registrar login. The research step is where the fix dies. The ticket stays open until it gets closed as stale or until a deliverability problem becomes bad enough to force action.&lt;/p&gt;

&lt;p&gt;Continuous monitoring solves the detection problem. Provider-specific fix guides solve the remediation problem. Without both, you have a very good early warning system for problems that don't get fixed.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Economics of Staying Broken
&lt;/h2&gt;

&lt;p&gt;Here is what a persistent DNS misconfiguration actually costs.&lt;/p&gt;

&lt;p&gt;An e-commerce company sending 10,000 transactional emails per month with a 15% spam rate is losing roughly 1,500 emails to spam folders. If those emails contain order confirmations, shipping notifications, and password resets, the downstream effects are customer service contacts, abandoned carts, and churn from users who assume the product is broken.&lt;/p&gt;

&lt;p&gt;Industry estimates put the revenue impact of a 1% deliverability improvement at $10,000–$100,000 per year depending on email volume and order value. A 15% spam rate is not a 1% problem.&lt;/p&gt;

&lt;p&gt;The audit tool that tells you something is wrong but doesn't tell you how to fix it contributes nothing to that number. It identifies the cost without reducing it.&lt;/p&gt;

&lt;p&gt;A fix takes five minutes with the right instructions. The fix is worth five minutes.&lt;/p&gt;




&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Most DNS audit tools were built for engineers&lt;/strong&gt; — the output assumes you already know how to fix what they find&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The fix is non-trivial to generate&lt;/strong&gt; — it depends on your existing records, your email sending stack, and your DNS provider's specific interface conventions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No major competitor builds the provider-specific fix database&lt;/strong&gt; — it requires ongoing maintenance investment with no direct revenue justification for tools selling to enterprise teams&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The right approach is not to guess your stack&lt;/strong&gt; — email provider tabs let you identify which &lt;code&gt;include:&lt;/code&gt; values apply to your own setup; DNS provider tabs give you numbered steps for the interface you're actually looking at&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CAA and MX guides go one step further&lt;/strong&gt; — they read your existing certificate and MX records to pre-fill the correct values before you touch anything&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monitoring without remediation is a treadmill&lt;/strong&gt; — alerts tell you something is broken; fix guides tell you what to type&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;See it on your own domain, free:&lt;/strong&gt; &lt;a href="https://zerohook.org" rel="noopener noreferrer"&gt;zerohook.org&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;*Part of an ongoing series on DNS security and email deliverability.&lt;/p&gt;

</description>
      <category>dns</category>
      <category>domain</category>
      <category>tool</category>
      <category>zerohook</category>
    </item>
    <item>
      <title>SecurityScorecard vs. ZeroHook: Enterprise Security at 82% Less Cost</title>
      <dc:creator>Regő Botond Ronyecz</dc:creator>
      <pubDate>Thu, 28 May 2026 20:17:14 +0000</pubDate>
      <link>https://dev.to/rronyecz/securityscorecard-vs-zerohook-enterprise-security-at-82-less-cost-4nj2</link>
      <guid>https://dev.to/rronyecz/securityscorecard-vs-zerohook-enterprise-security-at-82-less-cost-4nj2</guid>
      <description>&lt;p&gt;The sales call goes well. The SecurityScorecard demo is polished. The dashboards are impressive. Then the quote arrives: &lt;strong&gt;$26,000 per year&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For an enterprise with a dedicated security team and a compliance budget measured in six figures, that number is unremarkable. For an SMB trying to pass a NIS2 audit or satisfy a customer security questionnaire, it ends the conversation immediately.&lt;/p&gt;

&lt;p&gt;The gap SecurityScorecard fills — continuous DNS monitoring, email security validation, compliance reporting — is real. The need doesn't disappear because the price is out of reach. What changes is where you look to fill it.&lt;/p&gt;

&lt;p&gt;This is a direct comparison between SecurityScorecard and ZeroHook across the specific capabilities that matter for SMBs: what each monitors, what evidence each produces for auditors, and what you actually pay.&lt;/p&gt;




&lt;h2&gt;
  
  
  What SecurityScorecard Is Built For
&lt;/h2&gt;

&lt;p&gt;SecurityScorecard was designed as a &lt;strong&gt;third-party risk management&lt;/strong&gt; platform. Its primary use case is not monitoring your own infrastructure — it's giving large enterprises a way to score the security posture of their vendors, partners, and supply chain at scale.&lt;/p&gt;

&lt;p&gt;The scoring model assigns letter grades (A through F) to domains based on passive signals: leaked credentials on dark web forums, open ports, DNS misconfigurations, certificate issues, and IP reputation. It's continuous, it's automated, and the dashboards are visually clear.&lt;/p&gt;

&lt;p&gt;That's genuinely useful if you're a procurement team at a Fortune 500 company evaluating hundreds of vendors. You need a standardized, comparable score across all of them.&lt;/p&gt;

&lt;p&gt;It is a significantly worse fit if what you need is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;To fix your own DNS and email security configuration&lt;/li&gt;
&lt;li&gt;To generate compliance evidence for an NIS2 or ISO 27001 auditor&lt;/li&gt;
&lt;li&gt;To monitor your own domain continuously and receive actionable alerts&lt;/li&gt;
&lt;li&gt;To do any of this at SMB budget levels&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;SecurityScorecard's passive scoring model tells you &lt;strong&gt;that&lt;/strong&gt; something is wrong. It does not tell you &lt;strong&gt;what&lt;/strong&gt; the DNS record should say, or how to fix it in Cloudflare vs. GoDaddy vs. Route53.&lt;/p&gt;




&lt;h2&gt;
  
  
  Side-by-Side: What Each Platform Actually Covers
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Email Security Monitoring
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Check&lt;/th&gt;
&lt;th&gt;SecurityScorecard&lt;/th&gt;
&lt;th&gt;ZeroHook&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SPF record validation&lt;/td&gt;
&lt;td&gt;✓ (scored)&lt;/td&gt;
&lt;td&gt;✓ (validated + fix provided)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DKIM verification&lt;/td&gt;
&lt;td&gt;✓ (scored)&lt;/td&gt;
&lt;td&gt;✓ (key strength analysis + fix)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DMARC policy enforcement&lt;/td&gt;
&lt;td&gt;✓ (scored)&lt;/td&gt;
&lt;td&gt;✓ (policy check + rollout guidance)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BIMI setup validation&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MTA-STS configuration&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TLS-RPT monitoring&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Blacklist monitoring&lt;/td&gt;
&lt;td&gt;✓ (some databases)&lt;/td&gt;
&lt;td&gt;✓ (50+ databases, real-time)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MX record validation&lt;/td&gt;
&lt;td&gt;✓ (scored)&lt;/td&gt;
&lt;td&gt;✓ (multiple servers)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Copy-paste DNS fixes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;✗&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;✓ (provider-specific)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The last row is the operational difference. SecurityScorecard shows you a C grade for your DMARC configuration. ZeroHook shows you the exact record to paste into your Cloudflare DNS panel.&lt;/p&gt;

&lt;p&gt;For a security team with a DNS engineer on staff, the grade alone is enough to start the fix. For an SMB where the founder or a generalist IT manager is handling DNS, the copy-paste fix is the difference between the problem getting resolved and the problem sitting open for six months.&lt;/p&gt;

&lt;h3&gt;
  
  
  DNS Security Monitoring
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Check&lt;/th&gt;
&lt;th&gt;SecurityScorecard&lt;/th&gt;
&lt;th&gt;ZeroHook&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;DNSSEC validation&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CAA records&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nameserver configuration and redundancy&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CNAME chain analysis&lt;/td&gt;
&lt;td&gt;Partial&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SOA parameters&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TTL optimization&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PTR / Reverse DNS&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Open resolver detection&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DNS performance benchmarking&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DANE / TLSA records&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Subdomain takeover detection&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Zone transfer vulnerability&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Compliance Evidence and Reporting
&lt;/h3&gt;

&lt;p&gt;This is where the gap becomes most significant for SMBs going through a formal audit.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;SecurityScorecard&lt;/th&gt;
&lt;th&gt;ZeroHook&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;NIS2 compliance mapping&lt;/td&gt;
&lt;td&gt;Partial (vendor risk angle)&lt;/td&gt;
&lt;td&gt;✓ (Article 21 direct mapping)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ISO 27001 Annex A mapping&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SOC2 CC6.6 mapping&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GDPR mapping&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PCI-DSS mapping&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tamper-proof audit log&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✓ (hash-verified, 365 days)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auditor PDF export&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auditor portal access&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Automated evidence collection&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Excel compliance export&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;SecurityScorecard produces dashboards and score reports. Those are useful for executive presentations and vendor risk reviews. They are not the same as a tamper-proof, timestamped audit log that an NIS2 auditor can verify independently.&lt;/p&gt;

&lt;p&gt;NIS2 auditors specifically look for continuous monitoring evidence with an unbroken chain of records. A SecurityScorecard PDF showing your score on a specific date is a point-in-time snapshot. An automated audit log with hash verification covering the past 365 days is continuous monitoring evidence.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Copy-Paste Fix Differentiator
&lt;/h2&gt;

&lt;p&gt;This deserves its own section because no competitor at any price point offers it.&lt;/p&gt;

&lt;p&gt;When SecurityScorecard flags that your SPF record is misconfigured, the remediation workflow is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Note the finding&lt;/li&gt;
&lt;li&gt;Open a ticket for your DNS team (or figure it out yourself)&lt;/li&gt;
&lt;li&gt;Research what the correct SPF record should look like for your sending services&lt;/li&gt;
&lt;li&gt;Find the right DNS panel for your registrar&lt;/li&gt;
&lt;li&gt;Make the change&lt;/li&gt;
&lt;li&gt;Wait for propagation and re-scan to confirm&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;When ZeroHook flags the same issue, the remediation workflow is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click the finding&lt;/li&gt;
&lt;li&gt;See the exact record to add, formatted for your specific DNS provider (Cloudflare, GoDaddy, Namecheap, Route53, and others)&lt;/li&gt;
&lt;li&gt;Copy and paste it&lt;/li&gt;
&lt;li&gt;Confirm&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The time difference is 2 minutes versus 2 hours if you know what you're doing, or 2 minutes versus "we'll get to it next sprint" if you don't.&lt;/p&gt;

&lt;p&gt;At SMB scale, security issues that require specialist DNS knowledge to resolve frequently don't get resolved. The provider-specific copy-paste fix removes the specialist knowledge requirement and puts the fix in reach of whoever manages the domain.&lt;/p&gt;




&lt;h2&gt;
  
  
  Pricing: The 82% Gap Explained
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th&gt;Annual Cost&lt;/th&gt;
&lt;th&gt;Per Domain&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SecurityScorecard (mid-market)&lt;/td&gt;
&lt;td&gt;~$26,000/year&lt;/td&gt;
&lt;td&gt;High, opaque&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ZeroHook Compliance Pro&lt;/td&gt;
&lt;td&gt;$4,790/year&lt;/td&gt;
&lt;td&gt;From $10/domain/mo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ZeroHook Business Security&lt;/td&gt;
&lt;td&gt;$1,430/year&lt;/td&gt;
&lt;td&gt;From $15/domain/mo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ZeroHook Deliverability&lt;/td&gt;
&lt;td&gt;$470/year&lt;/td&gt;
&lt;td&gt;From $29/domain/mo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ZeroHook Free&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;td&gt;1 domain&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The 82% figure comes from the direct comparison between ZeroHook Compliance Pro ($4,790/year) and SecurityScorecard's mid-market pricing (~$26,000/year). The Compliance Pro tier covers 50 domains continuously, includes the full 30-point audit, tamper-proof audit logs, compliance report generation, auditor portal access, and automated evidence collection.&lt;/p&gt;

&lt;p&gt;What SecurityScorecard doesn't include at any price: copy-paste DNS fixes, provider-specific remediation guidance, or a direct path from "flagged issue" to "resolved configuration."&lt;/p&gt;




&lt;h2&gt;
  
  
  When SecurityScorecard Makes Sense
&lt;/h2&gt;

&lt;p&gt;This comparison isn't arguing that SecurityScorecard is a bad product. It's a good product built for a different problem.&lt;/p&gt;

&lt;p&gt;SecurityScorecard is the right choice when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;You're a large enterprise managing third-party vendor risk&lt;/strong&gt; — you need to score hundreds of external organizations, not fix your own DNS records&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You need a standardized score your board or investors recognize&lt;/strong&gt; — SecurityScorecard grades carry weight in certain enterprise procurement contexts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You're building a vendor risk program from scratch&lt;/strong&gt; — their platform is built around that workflow&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Budget is not a constraint&lt;/strong&gt; — the product is priced for organizations where $26,000/year is a rounding error in the security budget&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ZeroHook is the right choice when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;You need to fix and monitor your own DNS and email security&lt;/strong&gt; — not score external vendors&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You're preparing for a NIS2, ISO 27001, or SOC2 audit&lt;/strong&gt; — and need compliance-ready evidence, not a dashboard grade&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You're an SMB with a budget under $500/month&lt;/strong&gt; — and need the full capability set, not a stripped-down version&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You're an MSP managing multiple client domains&lt;/strong&gt; — white-label option at $15/domain/month with 300% reseller margin&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You need actionable fixes, not just scores&lt;/strong&gt; — copy-paste DNS remediation included in every paid tier&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The MSP Angle: A Category SecurityScorecard Doesn't Serve
&lt;/h2&gt;

&lt;p&gt;SecurityScorecard has no MSP or white-label offering at SMB price points. Their partner program is aimed at large MSSPs and enterprise channel partners.&lt;/p&gt;

&lt;p&gt;ZeroHook's white-label tier is explicitly built for IT agencies and MSPs managing 20–500 client domains. At $15/domain/month cost and a recommended resale price of $60+/domain/month, the margin structure is 300% before any service fees.&lt;/p&gt;

&lt;p&gt;The deliverables — branded PDF audit reports, per-domain compliance summaries, continuous monitoring alerts — become a product an MSP can sell rather than a tool they use internally. SecurityScorecard offers no equivalent path for a 10-person IT shop managing 50 SMB clients.&lt;/p&gt;




&lt;h2&gt;
  
  
  How to Run a Direct Comparison Yourself
&lt;/h2&gt;

&lt;p&gt;If you're currently evaluating SecurityScorecard or have a renewal coming up, the fastest way to compare is to run ZeroHook's free tools against your own domain before paying for anything.&lt;/p&gt;

&lt;p&gt;ZeroHook's free tier (no credit card, no sales call) gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SPF, DKIM, DMARC validation&lt;/li&gt;
&lt;li&gt;Blacklist monitoring&lt;/li&gt;
&lt;li&gt;Email Health Score (0–100)&lt;/li&gt;
&lt;li&gt;Weekly automated scans&lt;/li&gt;
&lt;li&gt;Copy-paste DNS fixes&lt;/li&gt;
&lt;li&gt;Basic NIS2 and ISO compliance summary
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://zerohook.org
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Start with the DNS Visualizer for a visual map of your current infrastructure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://zerohook.org/dns-visualizer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For a quick revenue-impact calculation on your current deliverability rate:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://zerohook.org/email-roi-calculator
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The full 30-point audit and continuous compliance monitoring are on paid tiers starting at $49/month. No enterprise sales process, no custom quote, no minimum contract length.&lt;/p&gt;




&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SecurityScorecard was built for enterprise third-party vendor risk management&lt;/strong&gt; — it scores external organizations, not to fix your own infrastructure&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The 82% cost difference ($26,000 vs. $4,790/year) is real&lt;/strong&gt; — and the cheaper option includes features the expensive one doesn't: copy-paste DNS fixes, tamper-proof audit logs, and direct NIS2/GDPR/PCI-DSS compliance mapping&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Copy-paste provider-specific DNS fixes exist nowhere else at this price point&lt;/strong&gt; — this is the single most operationally significant differentiator for SMBs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;NIS2 auditors want continuous monitoring evidence, not dashboard grades&lt;/strong&gt; — hash-verified audit logs with 365-day retention satisfy that requirement; a SecurityScorecard PDF does not&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MSPs have a clear path with ZeroHook&lt;/strong&gt; — white-label at $15/domain/month, resell at $60+; SecurityScorecard has no equivalent SMB reseller model&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Start for free&lt;/strong&gt; — zerohook.org gives you SPF/DKIM/DMARC validation, blacklist monitoring, and copy-paste fixes before you spend a dollar&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;*Part of an ongoing series on DNS security and compliance tools. &lt;/p&gt;

</description>
      <category>cybersecurity</category>
      <category>dns</category>
      <category>compliance</category>
      <category>smb</category>
    </item>
  </channel>
</rss>
