Security Auditor — looks up the TXT record at
_dmarc.<domain> of the audited URL and checks that it is a single, well-formed DMARC record with an enforcing policy (p=quarantine or p=reject) and an aggregate-report address (rua).Protection
Tells receiving mail servers to quarantine or reject email that pretends to come from your domain but fails SPF and DKIM.
Standards
Follows RFC 7489, Domain-based Message Authentication, Reporting, and Conformance (DMARC), March 2015.
_dmarc.<domain> publishes the domain owner’s policy (p=none, p=quarantine or p=reject) and, through the rua tag, where receivers should send aggregate reports about mail that claims the domain. Without an enforcing policy, phishing sent in the company’s name is still delivered; without reports, nobody notices. This auditor reads that record for the host of the audited URL.
How it works
- Domain — takes the host of the audited URL and strips one leading
www.;https://www.example.com/pageis audited asexample.com. A URL that is empty, cannot be parsed or has no hostname ends the audit with501. - Lookup — queries the TXT records at
_dmarc.<domain>through the system resolvers, with no cache and no organizational-domain fallback:shop.example.comis audited at_dmarc.shop.example.com, not at_dmarc.example.com. SERVFAIL, a timeout or any resolver failure ends the audit with500; NXDOMAIN and NODATA are “no record”. This auditor never fetches the audited page. - Select — keeps the TXT values that start with
v=DMARC1(case-insensitive). None at all is400when the name has no TXT record, or401when it has TXT records of another kind; more than one is402(RFC 7489 section 6.6.3: receivers then apply no policy). - Rules on the record — only when exactly one
v=DMARC1record exists, its tags are parsed (;-separatedkey=value, keys case-insensitive). A missing or invalidptag fails (403);p=nonewarns (300); a missing or blankruawarns (301). - Aggregate — FAIL wins over WARNING; when every rule passes the audit is
SUCCESS(200) and the message names the policy, theaspfandadkimalignment modes (defaultr) and theruaandrufaddresses. - Specification pin — every run emits
37A-DnsMailDmarcAuditor-100(INFORMATION), naming RFC 7489, Domain-based Message Authentication, Reporting, and Conformance (DMARC) (March 2015). It does not change the overall status.
What it audits
Every row maps to onecheckRule* method and one CheckCode, in the order the auditor runs them. CheckCode suffixes use status ranges: 100 information, 200 success, 300–399 warning, 400–499 fail, 500–599 error. {fqdn} is _dmarc.<domain>, {record} the DMARC record text and {url} the audited URL.
Output documentation
Every check carries
domain, dmarcFqdn, txtRecords (all TXT values found), recordCount (how many start with v=DMARC1), dmarcRecord (the single record, or null), dmarcTags, policy, subdomainPolicy, pct, rua, ruf, aspf and adkim (the last two default to r) in its data. The 500 check carries domain, dmarcFqdn and error; the 501 check carries url and error.
Risks and considerations
Why DMARC matters
- Email is the most common way into a company: an invoice, a password reset or a “message from the CEO” that only looks like it comes from your domain. SPF and DKIM let receivers detect the forgery; DMARC is what tells them to act on it.
p=noneis the right first step while you discover every legitimate sender from the reports, but it protects nobody. Move top=quarantineand thenp=rejectonce the reports are clean.- The
ruareports are the only feedback loop: without them, a newly added marketing tool that fails alignment, or a spoofing campaign against your customers, stays invisible.
What this auditor does not check
- Only
_dmarc.<host>of the audited URL is queried. RFC 7489 lets receivers fall back to the organizational domain’s record for a subdomain (sptag); this auditor does not, so a subdomain without its own record fails even when the parent domain enforces DMARC. - The SPF and DKIM records themselves, the
pct,sp,foandrftags, and whether theruaandrufmailboxes accept reports (the external-destination verification of RFC 7489 section 7.1) are not evaluated. - A record whose syntax is broken beyond the
vandptags is reported only through the tags this auditor reads.
Changes from the previous version
- A missing or invalid
ptag was aWARNING(it was read asp=none); it is nowFAIL(403), as RFC 7489 requires the tag. - A missing
ruawas only noted in the success message; it is now aWARNING(301). - Several
v=DMARC1records were silently reduced to the first one; they are nowFAIL(402). - An invalid URL or a URL without a hostname was
FAIL; it is nowERROR(501), as the audit could not run. - A failed DNS lookup (SERVFAIL, timeout) was reported as a missing record (
FAIL); it is nowERROR(500), so a resolver problem is never charged as a finding against the domain.