CertaDNS

Getting from p=none to p=reject without blocking your own mail

A staged path to DMARC enforcement driven by what your aggregate reports actually show, including how long each stage needs and the signals that say you are not ready to advance.

Last reviewed

p=reject is the goal, and it is one DNS edit away at any moment. The reason not to make that edit today is that you almost certainly have senders you have forgotten about, and at p=reject their mail stops being delivered — silently, from your point of view, because the rejection happens at the receiving end.

The path below is not a waiting game. Each stage exists to answer a specific question, and you move on when it is answered rather than when a number of weeks has elapsed.

The principle

You are not tightening a policy. You are building an inventory of everything that sends as your domain, and the policy follows the inventory. A team that knows all its senders can go to p=reject in a fortnight; one that does not should not go there in a year.

What p=none actually costs you

Nothing, in deliverability terms — and that is the trap. A domain can sit at p=none for years generating reports nobody reads, and it is exactly as spoofable as a domain with no DMARC at all. The record is not the protection; the enforcement is.

The stages

StageRecordQuestion it answersMove on when
1. Observep=none; rua=…Who sends as this domain?Two full reporting cycles with no new sending sources appearing. Two weeks minimum — monthly and quarterly processes are the ones that surprise you.
2. Fixp=noneCan every legitimate sender authenticate and align?Every source you recognise passes DMARC. Not SPF or DKIM individually — DMARC, which means aligned.
3. Quarantinep=quarantineDid we miss anything that only shows up under enforcement?A week or two with no complaints and no new failing sources. Failures now land in spam rather than being lost, which makes this the safe place to find out.
4. Rejectp=reject; sp=rejectDone.

Stage 2 is where the actual work is, and it is where most rollouts stall. Stages 1 and 3 are mostly waiting; stage 2 is chasing down a marketing tool nobody remembers buying and getting DKIM turned on for it.

Reading the reports

Aggregate reports arrive as gzipped XML, once a day per receiver. They are not readable by hand at any volume, but the structure is simple: for each sending IP, a count of messages and the SPF and DKIM results, with the domains each authenticated.

The questions worth asking of them, in order:

  1. Which sources do I not recognise? Some will be spoofing. Most, at the start, will be a service a colleague signed up for.
  2. Which recognised sources fail? Fix these before anything else. A high-volume legitimate sender failing is what turns enforcement into an incident.
  3. Which fail on alignment rather than authentication? A source showing SPF pass but DMARC fail is an alignment problem, and the fix is different — usually enabling DKIM with your own domain rather than touching SPF.
  4. What proportion of my volume passes? This is the number that tells you whether to advance. It should be high and stable, not high once.

If reports are not arriving at all, check external destination authorisation before assuming nothing is being sent — it is the most common cause and it is invisible from your side.

Signals you are not ready

  • New sending sources still appearing. Every new one is something you would have broken. Wait for the rate to reach zero.
  • A recognised sender that passes SPF but not DKIM. It will survive direct delivery and fail the moment anything forwards it. Get DKIM on before you enforce.
  • SPF returning permerror. Your record is over a limit and is failing for everyone. Fix that first — the SPF Inspector will say which limit.
  • No reports from the large receivers. If Google and Microsoft are missing from your reports, you are not seeing the majority of your mail, and the numbers you are reading are not representative.
  • An annual process you have not seen run. The invoice run, the renewal notices, the thing that only fires in January. Enforcing in December is a specific kind of mistake.

On pct, and why it is not a dial

pct applies the policy to a random sample. It is genuinely useful as a ramp — p=quarantine; pct=25 limits the blast radius of a mistake to a quarter of your mail — but two things are worth knowing.

First, it is not a percentage of failures, it is a percentage of messages evaluated. Second, and more importantly, it is very easy to leave behind. p=reject; pct=10 reads like enforcement and delivers nine out of ten spoofed messages. If you use it, put a date in the calendar for removing it.

A finished record looks like GitHub's — enforcement, subdomains covered explicitly, full percentage, reporting on:

$ dig +short TXT _dmarc.github.com
"v=DMARC1; p=quarantine; sp=reject; pct=100;
  rua=mailto:dmarc@github.com; ruf=mailto:dmarc@github.com; fo=1"
Note sp=reject: subdomains are held to a stricter policy than the organisational domain.

Set sp= before you need it

Subdomains inherit p= unless sp= says otherwise, so a domain at p=reject is already covered. The reason to set sp=reject explicitly is that it stays correct if someone later relaxes p= during an incident — attackers reach for subdomains precisely because they look more plausible than a look-alike domain.

Check this on your own domain

Free, no account, reads public DNS only.

Related

CertaDNS automates most of what is described above — Email Authentication. The manual route above works perfectly well; the product exists because keeping it correct as your senders change is the part that does not stay done.