SPF, DMARC et DKIM : le guide complet d'authentification des emails
Découvrez comment SPF, DMARC et DKIM protègent votre domaine contre l'usurpation d'identité. Auditez les 3 enregistrements en 30 secondes avec des appels API gratuits et corrigez les 6 erreurs de configuration les plus courantes.
Votre domaine réussit toutes les analyses de sécurité. Votre certificat SSL est valide, vos en-têtes sont serrés, votre CSP est verrouillé. Puis un e-mail de phishing arrive dans la boîte de réception d'un client, provenant de votre domaine, avec le nom de votre entreprise dans le champ "De". L'e-mail est faux, mais les dégâts sont réels.
Cela se produit parce que le courrier électronique a été conçu en 1982 sans vérification intégrée de l’expéditeur. N'importe qui pouvez définir n'importe quelle adresse « De » sur un e-mail, et sans enregistrements SPF, DMARC et DKIM sur votre domaine, les serveurs de réception n'ont aucun moyen de détecter la contrefaçon. Plus de 90 % des attaques de phishing utilisent l'usurpation d'identité de domaine et une authentification de courrier électronique mal configurée constituent la porte ouverte.
Ce guide explique ce que fait chaque enregistrement, comment ils fonctionnent ensemble et comment auditer les trois. sur n'importe quel domaine avec un seul script en utilisant le API de sécurité DNS botoi.
Comment fonctionne l'authentification par courrier électronique
Trois enregistrements DNS fonctionnent comme des couches de défense. Chacun résout un problème différent :
- FPS réponses : "Ce serveur est-il autorisé à envoyer des e-mails pour ce domaine ?"
- DKIM répond : "Ce message a-t-il été modifié après avoir quitté le serveur de l'expéditeur ?"
- DMARC réponses : « Que dois-je faire si SPF ou DKIM échoue, et où puis-je envoyer des rapports ? »
Quand quelqu'un envoie un e-mail en prétendant provenir de you@example.com, la réception
Le serveur vérifie ces enregistrements dans l'ordre. Si SPF et DKIM échouent tous les deux et que DMARC indique
p=reject, le message est supprimé avant d'atteindre la boîte de réception. Sans tout
Troisièmement, il existe des failles que les attaquants exploitent.
SPF : qui peut envoyer en votre nom
SPF (Sender Policy Framework) est un enregistrement DNS TXT à la racine de votre domaine. Il répertorie chaque
Adresse IP et serveur de messagerie autorisé à envoyer des e-mails pour votre domaine. Lorsqu'un serveur de réception
reçoit un e-mail de example.com, il vérifie l'enregistrement SPF pour voir si l'envoi
le serveur est sur la liste approuvée.
Vérifiez l'enregistrement SPF de n'importe quel domaine avec un seul appel API :
curl -s -X POST https://api.botoi.com/v1/dns-security/spf-check \\
-H "Content-Type: application/json" \\
-d '{"domain": "example.com"}'
Réponse:
{
"success": true,
"data": {
"domain": "example.com",
"has_spf": true,
"record": "v=spf1 include:_spf.google.com ~all",
"mechanisms": ["include:_spf.google.com", "~all"],
"all_policy": "~all",
"includes": ["_spf.google.com"],
"valid": true
}
}
Les champs clés à vérifier :
-
has_spf: Effectue un enregistrement TXT commençant parv=spf1exister? Si faux, n'importe quel serveur peut falsifier les e-mails de votre domaine. -
valid: L'enregistrement est-il analysé sans erreurs ? Les enregistrements SPF se brisent silencieusement lorsque ils dépassent la limite de 10 recherches DNS. -
all_policy: Le mécanisme de suivi qui définit ce qui arrive aux expéditeurs non répertoriés.-all(échec difficile) les rejette.~all(échec logiciel) les rend suspects.+allpermet à tout le monde, ce qui va à l’encontre de l’objectif même.
La limite de 10 recherches
Les enregistrements SPF autorisent un maximum de 10 recherches DNS. Chaque include:, a:,
mx:, et redirect: le mécanisme compte pour une recherche. Inclut imbriqué
compter aussi. Une fois que vous avez ajouté Google Workspace, votre outil marketing, votre service de messagerie transactionnelle,
et un CRM, vous atteignez rapidement cette limite.
Lorsque vous dépassez 10 recherches, l’intégralité de l’enregistrement SPF devient invalide. Les API valid
le champ attrape ça. Corrigez-le en aplatissant les inclusions imbriquées dans des plages IP ou en consolidant
fournisseurs.
DMARC : que faire en cas d'échec des contrôles
DMARC (Domain-based Message Authentication, Reporting, and Conformance) lie SPF et DKIM
ensemble. Il vit à _dmarc.example.com sous forme d'enregistrement TXT et indique la réception
serveurs deux choses : que faire des messages qui échouent à l'authentification et où les envoyer
rapports sur ces échecs.
Vérifiez votre enregistrement DMARC :
curl -s -X POST https://api.botoi.com/v1/dns-security/dmarc-check \\
-H "Content-Type: application/json" \\
-d '{"domain": "example.com"}'
Réponse:
{
"success": true,
"data": {
"domain": "example.com",
"has_dmarc": true,
"record": "v=DMARC1; p=reject; rua=mailto:dmarc@example.com; pct=100",
"policy": "reject",
"subdomain_policy": null,
"reporting": {
"rua": ["mailto:dmarc@example.com"],
"ruf": []
},
"pct": 100,
"alignment": {
"dkim": "r",
"spf": "r"
}
}
}
Politiques DMARC
La policy Le champ détermine ce qui arrive aux messages ayant échoué :
-
none: Ne rien faire. Surveiller uniquement. Vous recevez des rapports mais des e-mails usurpés continuent accéder aux boîtes de réception. -
quarantine: déplacez les messages ayant échoué vers le spam. Le destinataire peut toujours les retrouver s'ils regardent. -
reject: Supprimez entièrement les messages défaillants. La protection la plus solide, mais une mauvaise configuration signifie une perte de courrier électronique légitime.
Stratégie de déploiement DMARC sécurisée
Aller directement à p=reject est risqué. Suivez ce chemin :
- Commencez par
p=none; rua=mailto:dmarc@example.compour collecter des rapports pendant 2 à 4 semaines - Examiner les rapports. Identifiez tous les expéditeurs légitimes qui échouent à l’authentification. Corrigez leurs inclusions SPF et leurs clés DKIM.
- Passer à
p=quarantine; pct=10mettre en quarantaine 10 % des messages ayant échoué - Augmenter
pctà 25, 50, puis 100 au cours des prochaines semaines, à mesure que vous confirmez qu'aucun courrier légitime n'est affecté - Passer à
p=reject; pct=100une fois que vous avez confiance en votre configuration
La pct Le champ de la réponse de l'API vous indique où vous en êtes dans ce déploiement. Un domaine
à pct=100 avec policy=reject a une protection complète.
DKIM : signatures cryptographiques sur chaque email
DKIM (DomainKeys Identified Mail) ajoute une signature cryptographique aux en-têtes de chaque message sortant. Le serveur expéditeur signe le message avec une clé privée ; le serveur de réception le vérifie par rapport à une clé publique publiée dans votre DNS. Si le message a été modifié pendant le transport (en-têtes modifiés, corps modifié, transmis via une liste de diffusion qui réécrit le contenu), le la signature échoue.
DKIM enregistre en direct sur [selector]._domainkey.example.com. Le sélecteur est une étiquette
votre fournisseur de messagerie attribue, comme google pour Google Workspace ou selector1
pour Microsoft 365.
Vérifiez un enregistrement DKIM :
curl -s -X POST https://api.botoi.com/v1/dns-security/dkim-check \\
-H "Content-Type: application/json" \\
-d '{"domain": "example.com", "selector": "google"}'
Réponse:
{
"success": true,
"data": {
"domain": "example.com",
"selector": "google",
"has_dkim": true,
"record": "v=DKIM1; k=rsa; p=MIIBIjANBgkq...",
"key_type": "rsa",
"public_key_length": 2048
}
}
Champs clés :
-
has_dkim: Une clé publique est-elle publiée pour ce sélecteur ? Si faux, DKIM la vérification échoue pour tous les messages signés avec ce sélecteur. -
public_key_length: NIST recommande un minimum de 2048 bits. Clés inférieures à 1024 les bits sont suffisamment faibles pour être pris en compte. -
key_type: RSA est la norme. Ed25519 est plus rapide et utilise des clés plus courtes mais a un support limité du fournisseur de messagerie.
DKIM et transfert d'e-mails
C'est pourquoi DKIM est important même lorsque SPF est configuré. Quand quelqu'un transfère votre e-mail, l'adresse IP du serveur de transfert ne figure pas dans votre enregistrement SPF, donc SPF échoue. Mais la signature DKIM survit au transfert (tant que le contenu n'est pas modifié). DMARC réussit si l'un ou l'autre SPF ou DKIM s'aligne, donc DKIM est votre filet de sécurité pour les messages transférés.
Comment les trois travaillent ensemble
| Menace | FPS | DKIM | DMARC |
|---|---|---|---|
| E-mail usurpé provenant d'un serveur non autorisé | Détecte | Détecte (pas de signature valide) | Applique la politique |
| Corps du message falsifié pendant le transit | Ne détecte pas | Détecte | Applique la politique |
| E-mail transféré d'un expéditeur légitime | Échec (IP de serveur différente) | Laissez-passer (signature intacte) | Réussi si DKIM s'aligne |
| Usurpation de sous-domaine (user@fake.example.com) | Aucune protection | Aucune protection | Bloque via sp=reject |
| Visibilité sur les échecs d'authentification | Aucune | Aucune | Envoie des rapports globaux |
Aucun enregistrement ne fournit une couverture complète. SPF sans DMARC signifie que les échecs ne sont pas appliqués. DKIM sans SPF signifie que toute personne disposant d'une clé valide peut envoyer depuis votre domaine. DMARC sans les deux SPF et DKIM n’ont rien contre quoi s’opposer.
Auditez votre domaine en 30 secondes
Ce script shell vérifie les trois enregistrements et imprime un résumé réussite/échec. Il utilise le botoi API de sécurité DNS ; aucune clé API n'est nécessaire pour un maximum de 5 requêtes par minute.
#!/bin/bash
# Audit SPF, DMARC, and DKIM for a domain in 30 seconds
DOMAIN=\${1:-"example.com"}
DKIM_SELECTOR=\${2:-"google"}
API="https://api.botoi.com/v1/dns-security"
PASS=0
FAIL=0
echo "Auditing email authentication for \$DOMAIN"
echo "==========================================="
# SPF check
SPF=\$(curl -s -X POST "\$API/spf-check" \\
-H "Content-Type: application/json" \\
-d "{\\"domain\\": \\"\$DOMAIN\\"}")
HAS_SPF=\$(echo "\$SPF" | jq -r '.data.has_spf')
SPF_VALID=\$(echo "\$SPF" | jq -r '.data.valid')
SPF_RECORD=\$(echo "\$SPF" | jq -r '.data.record // "not found"')
ALL_POLICY=\$(echo "\$SPF" | jq -r '.data.all_policy // "none"')
if [ "\$HAS_SPF" = "true" ] && [ "\$SPF_VALID" = "true" ]; then
echo "[PASS] SPF: \$SPF_RECORD"
PASS=\$((PASS + 1))
else
echo "[FAIL] SPF: \$SPF_RECORD"
FAIL=\$((FAIL + 1))
fi
if [ "\$ALL_POLICY" = "+all" ]; then
echo " WARNING: +all allows any server to send as your domain"
fi
# DMARC check
DMARC=\$(curl -s -X POST "\$API/dmarc-check" \\
-H "Content-Type: application/json" \\
-d "{\\"domain\\": \\"\$DOMAIN\\"}")
HAS_DMARC=\$(echo "\$DMARC" | jq -r '.data.has_dmarc')
POLICY=\$(echo "\$DMARC" | jq -r '.data.policy // "not set"')
PCT=\$(echo "\$DMARC" | jq -r '.data.pct // 0')
if [ "\$HAS_DMARC" = "true" ]; then
echo "[PASS] DMARC: policy=\$POLICY pct=\$PCT%"
PASS=\$((PASS + 1))
else
echo "[FAIL] DMARC: no record found"
FAIL=\$((FAIL + 1))
fi
if [ "\$POLICY" = "none" ]; then
echo " WARNING: policy=none only monitors, does not enforce"
fi
# DKIM check
DKIM=\$(curl -s -X POST "\$API/dkim-check" \\
-H "Content-Type: application/json" \\
-d "{\\"domain\\": \\"\$DOMAIN\\", \\"selector\\": \\"\$DKIM_SELECTOR\\"}")
HAS_DKIM=\$(echo "\$DKIM" | jq -r '.data.has_dkim')
KEY_TYPE=\$(echo "\$DKIM" | jq -r '.data.key_type // "unknown"')
KEY_LEN=\$(echo "\$DKIM" | jq -r '.data.public_key_length // 0')
if [ "\$HAS_DKIM" = "true" ]; then
echo "[PASS] DKIM: selector=\$DKIM_SELECTOR key_type=\$KEY_TYPE key_length=\$KEY_LEN"
PASS=\$((PASS + 1))
else
echo "[FAIL] DKIM: no record for selector '\$DKIM_SELECTOR'"
FAIL=\$((FAIL + 1))
fi
if [ "\$HAS_DKIM" = "true" ] && [ "\$KEY_LEN" -lt 2048 ] 2>/dev/null; then
echo " WARNING: DKIM key is \$KEY_LEN bits (2048 recommended)"
fi
# Summary
echo ""
echo "Results: \$PASS passed, \$FAIL failed"
[ "\$FAIL" -eq 0 ] && echo "All checks passed." || exit 1
Exécutez-le :
bash audit.sh example.com google
Le premier argument est votre domaine ; le second est votre sélecteur DKIM. Le script crée 3 API appels (dans la limite du niveau gratuit), vérifie chaque enregistrement, signale les avertissements pour les configurations faibles, et quitte avec un code différent de zéro si une vérification échoue. Déposez-le dans une tâche cron ou un pipeline CI pour une surveillance continue.
Si vous préférez JavaScript, voici le même audit qu'une fonction asynchrone :
async function auditEmailAuth(domain, dkimSelector = "google") {
const api = "https://api.botoi.com/v1/dns-security";
const headers = { "Content-Type": "application/json" };
const [spf, dmarc, dkim] = await Promise.all([
fetch(\`\${api}/spf-check\`, {
method: "POST",
headers,
body: JSON.stringify({ domain }),
}).then((r) => r.json()),
fetch(\`\${api}/dmarc-check\`, {
method: "POST",
headers,
body: JSON.stringify({ domain }),
}).then((r) => r.json()),
fetch(\`\${api}/dkim-check\`, {
method: "POST",
headers,
body: JSON.stringify({ domain, selector: dkimSelector }),
}).then((r) => r.json()),
]);
return {
domain,
spf: {
exists: spf.data.has_spf,
valid: spf.data.valid,
record: spf.data.record,
allPolicy: spf.data.all_policy,
},
dmarc: {
exists: dmarc.data.has_dmarc,
policy: dmarc.data.policy,
pct: dmarc.data.pct,
reporting: dmarc.data.reporting?.rua || [],
},
dkim: {
exists: dkim.data.has_dkim,
selector: dkimSelector,
keyType: dkim.data.key_type,
keyLength: dkim.data.public_key_length,
},
};
}
// Usage
const report = await auditEmailAuth("example.com", "google");
console.log(JSON.stringify(report, null, 2));
Configurations de fournisseur courantes
Chaque fournisseur de messagerie possède son propre domaine d'inclusion SPF et son propre sélecteur DKIM. Voici les valeurs pour les prestataires les plus courants :
| Fournisseuse | Le SPF inclut | Sélecteur(s) DKIM |
|---|---|---|
| Espace de travail Google | include:_spf.google.com |
google |
| Microsoft 365 | include:spf.protection.outlook.com |
selector1, selector2 |
| AmazonSES | include:amazonses.com |
Basé sur l'UUID (vérifiez la console SES) |
| EnvoyerGrille | include:sendgrid.net |
s1, s2 |
| Cachet de la poste | include:spf.mtasv.net |
Par domaine (vérifiez les paramètres DNS Postmark) |
| MailChimp / Mandrill | include:servers.mcsv.net |
k1 |
Si vous utilisez plusieurs fournisseurs, votre enregistrement SPF les inclut tous dans une seule entrée TXT.
Par exemple: v=spf1 include:_spf.google.com include:sendgrid.net ~all. Regarder
la limite de 10 recherches à mesure que vous ajoutez des fournisseurs.
Points clés
-
FPS contrôle quels serveurs peuvent envoyer des e-mails pour votre domaine. Vérifiez-le avec
le
/v1/dns-security/spf-checkpoint final. Surveillez la limite de 10 recherches et éviter+all. -
DMARC définit ce qui se passe en cas d'échec de SPF ou DKIM. Déployer progressivement à partir de
p=noneàp=rejecten utilisant lepctchamp. Toujours réglé unruaadresse pour recevoir les rapports. -
DKIM prouve l'intégrité des messages avec des signatures cryptographiques. Utiliser 2048 bits
clés minimum et vérifiez que votre sélecteur est publié avec
/v1/dns-security/dkim-check. - Les trois disques fonctionnent ensemble. SPF à lui seul n’arrête pas l’usurpation d’e-mails transférés. DKIM seul ne dit pas aux récepteurs quoi faire en cas d'échec. DMARC sans SPF et DKIM n'a rien à appliquer.
- Automatisez vos contrôles. Exécutez le script d'audit selon un planning ou dans CI pour détecter la dérive DNS, le fournisseur migrations et suppressions accidentelles d’enregistrements avant qu’elles n’affectent la délivrabilité.
FAQ
- Qu'est-ce qu'un enregistrement SPF et pourquoi en ai-je besoin ?
- Un enregistrement SPF (Sender Policy Framework) est une entrée DNS TXT qui répertorie tous les serveurs autorisés à envoyer des e-mails au nom de votre domaine. Sans cela, n'importe quel serveur sur Internet peut envoyer des e-mails qui semblent provenir de votre domaine, et les serveurs de réception de courrier n'ont aucun moyen de faire la différence. La plupart des domaines nécessitent au moins un enregistrement SPF incluant leur fournisseur de messagerie.
- Comment puis-je vérifier si mon domaine possède un enregistrement DMARC ?
- Recherchez l'enregistrement DNS TXT sur _dmarc.yourdomain.com. Vous pouvez le faire avec dig, nslookup ou en envoyant une requête POST à l'API de vérification botoi DMARC avec votre nom de domaine. L'API renvoie l'enregistrement complet analysé, y compris les adresses de stratégie, de pourcentage et de rapport.
- Ai-je besoin de DKIM si j’ai déjà un SPF ?
- Oui. SPF et DKIM résolvent différents problèmes. SPF vérifie que le serveur d'envoi est autorisé ; DKIM vérifie que le contenu du message n'a pas été modifié pendant le transit. Le transfert d’e-mails rompt l’alignement SPF mais préserve les signatures DKIM. DMARC nécessite qu'au moins l'un d'entre eux soit réussi, donc avoir les deux vous donne de la résilience lors du transfert ou du relais.
- Que se passe-t-il si je configure ma politique DMARC pour qu'elle soit rejetée immédiatement ?
- Les serveurs de réception supprimeront tous les messages qui échouent à l'alignement SPF et DKIM. Si vous avez mal configuré des enregistrements, oublié des expéditeurs tiers ou des règles de transfert dont vous n'avez pas tenu compte, les e-mails légitimes seront ignorés en silence. Commencez par p=none pour collecter les rapports, passez à p=quarantine à 10 % et définissez p=reject uniquement après avoir confirmé l'authentification de tous les courriers légitimes.
- À quelle fréquence dois-je auditer mes enregistrements d’authentification de courrier électronique ?
- Au minimum, vérifiez après chaque changement de DNS, migration de fournisseur de messagerie ou lors de l'ajout d'un nouveau service d'envoi (outils marketing, e-mail transactionnel, CRM). Une vérification automatisée hebdomadaire détecte les pannes silencieuses comme le dépassement de la limite de recherche SPF 10 ou une clé DKIM expirée. Les points de terminaison de l'API de sécurité DNS botoi facilitent l'automatisation dans CI ou dans une tâche cron.
Commencez a construire avec botoi
150+ endpoints API pour la recherche, le traitement de texte, la generation d'images et les utilitaires pour developpeurs. Offre gratuite, sans carte bancaire.