تخطي إلى المحتوى
Guide

SPF، وDMARC، وDKIM: دليل مصادقة البريد الإلكتروني الكامل

| 9 min read

تعرف على كيفية حماية نظام التعرف على هوية المرسل (SPF) وDMARC وDKIM لنطاقك من الانتحال. قم بمراجعة جميع السجلات الثلاثة في 30 ثانية من خلال مكالمات API المجانية وإصلاح التكوينات الخاطئة الستة الأكثر شيوعًا.

Email security authentication flow diagram
Photo by Towfiqu barbhuiya on Unsplash

يجتاز نطاقك كل عمليات الفحص الأمني. شهادة SSL الخاصة بك صالحة، ورؤوسك ضيقة، و تم تأمين CSP. ثم تصل رسالة بريد إلكتروني تصيدية إلى البريد الوارد للعميل، من نطاقك، مع اسم شركتك في الحقل "من". البريد الإلكتروني مزيف، لكن الضرر حقيقي.

يحدث هذا لأن البريد الإلكتروني تم تصميمه في عام 1982 بدون التحقق من المرسل. أي شخص يمكن تعيين أي عنوان "من" على البريد الإلكتروني، وبدون سجلات SPF وDMARC وDKIM على جهازك المجال، فإن خوادم الاستقبال ليس لديها طريقة للقبض على التزوير. أكثر من 90% من هجمات التصيد تستخدم انتحال المجال، ومصادقة البريد الإلكتروني التي تم تكوينها بشكل خاطئ هو الباب المفتوح.

يغطي هذا الدليل ما يفعله كل سجل، وكيفية عملهم معًا، وكيفية تدقيق السجلات الثلاثة على أي مجال باستخدام برنامج نصي واحد باستخدام botoi DNS Security API.

كيف تعمل مصادقة البريد الإلكتروني

تعمل ثلاثة سجلات DNS كطبقات دفاع. كل واحد يحل مشكلة مختلفة:

  1. عامل حماية من الشمس (SPF). الإجابات: "هل يُسمح لهذا الخادم بإرسال بريد إلكتروني لهذا المجال؟"
  2. دكيم الإجابات: "هل تم تغيير هذه الرسالة بعد أن غادرت خادم المرسل؟"
  3. DMARC يجيب: "ماذا علي أن أفعل إذا فشل نظام التعرف على هوية المرسل (SPF) أو DKIM، وأين أرسل التقارير؟"

عندما يرسل شخص ما بريدًا إلكترونيًا يدعي أنه من you@example.com، الاستلام يتحقق الخادم من هذه السجلات بالتسلسل. في حالة فشل كل من SPF وDKIM، يقول DMARC p=reject، يتم إسقاط الرسالة قبل أن تصل إلى البريد الوارد. بدون الكل ثالثًا، توجد ثغرات يستغلها المهاجمون.

SPF: من يمكنه الإرسال نيابة عنك

SPF (إطار سياسة المرسل) هو سجل TXT لنظام أسماء النطاقات في جذر المجال الخاص بك. يسرد كل عنوان IP وخادم البريد المخولين بإرسال البريد الإلكتروني لنطاقك. عندما خادم الاستقبال يحصل على بريد إلكتروني من example.com، فإنه يتحقق من سجل SPF لمعرفة ما إذا كان الإرسال الخادم موجود في القائمة المعتمدة.

تحقق من سجل نظام التعرف على هوية المرسل (SPF) لأي مجال من خلال استدعاء واجهة برمجة التطبيقات (API) واحد:

curl -s -X POST https://api.botoi.com/v1/dns-security/spf-check \\
  -H "Content-Type: application/json" \\
  -d '{"domain": "example.com"}'

إجابة:

{
  "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
  }
}

الحقول الرئيسية للتحقق:

  • has_spf: هل يبدأ سجل TXT بـ v=spf1 يخرج؟ إذا كاذبة، يمكن لأي خادم تزوير البريد الإلكتروني من المجال الخاص بك.
  • valid: هل تحليل السجل دون أخطاء؟ تنكسر سجلات SPF بصمت عندما لقد تجاوزوا الحد الأقصى للبحث في DNS وهو 10.
  • all_policy: الآلية اللاحقة التي تحدد ما يحدث للمرسلين غير المدرجين في القائمة. -all (يفشل بشدة) يرفضهم. ~all (فشل ناعم) يمثلهم مشبوهين. +all يسمح للجميع، وهو ما يتعارض مع الغرض بأكمله.

حد 10 عمليات بحث

تسمح سجلات نظام التعرف على هوية المرسل (SPF) بحد أقصى 10 عمليات بحث لنظام أسماء النطاقات (DNS). كل include:, a:, mx:، و redirect: تعتبر الآلية بمثابة بحث واحد. متداخلة تشمل العد أيضا. بمجرد إضافة Google Workspace، وأداة التسويق الخاصة بك، وخدمة البريد الإلكتروني للمعاملات، وCRM، ستصل إلى هذا الحد بسرعة.

عندما تتجاوز 10 عمليات بحث، يصبح سجل نظام التعرف على هوية المرسل (SPF) بأكمله غير صالح. واجهات برمجة التطبيقات valid الميدان يمسك بهذا. قم بإصلاحه عن طريق تسوية التضمينات المتداخلة في نطاقات IP أو الدمج مقدمي الخدمات.

DMARC: ما يجب فعله عند فشل عمليات التحقق

تربط DMARC (مصادقة الرسائل وإعداد التقارير والتوافق على أساس المجال) SPF وDKIM معًا. يعيش في _dmarc.example.com كسجل TXT ويخبر الاستلام هناك أمران على الخوادم: ما يجب فعله بالرسائل التي تفشل في المصادقة، ومكان الإرسال تقارير عن تلك الإخفاقات.

تحقق من سجل DMARC الخاص بك:

curl -s -X POST https://api.botoi.com/v1/dns-security/dmarc-check \\
  -H "Content-Type: application/json" \\
  -d '{"domain": "example.com"}'

إجابة:

{
  "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"
    }
  }
}

سياسات DMARC

ال policy يحدد الحقل ما يحدث للرسائل الفاشلة:

  • none: لا تتخذ أي إجراء. مراقب فقط. تحصل على التقارير ولكن لا تزال رسائل البريد الإلكتروني المخادعة الوصول إلى صناديق البريد الوارد.
  • quarantine: نقل الرسائل الفاشلة إلى البريد العشوائي. لا يزال بإمكان المستلم العثور عليها إذا نظروا.
  • reject: إسقاط الرسائل الفاشلة بالكامل. اقوى حماية ولكن التكوين الخاطئ يعني فقدان البريد الإلكتروني الشرعي.

استراتيجية طرح DMARC الآمنة

الذهاب مباشرة إلى p=reject أمر محفوف بالمخاطر. اتبع هذا المسار:

  1. ابدأ بـ p=none; rua=mailto:dmarc@example.com لجمع التقارير لمدة 2-4 أسابيع
  2. مراجعة التقارير. تحديد أي مرسلين شرعيين يفشلون في المصادقة. إصلاح يتضمن نظام التعرف على هوية المرسل (SPF) ومفاتيح DKIM.
  3. انتقل الى p=quarantine; pct=10 لعزل 10% من الرسائل الفاشلة
  4. يزيد pct إلى 25، 50، ثم 100 خلال الأسابيع القليلة القادمة حيث تؤكد عدم تأثر أي بريد شرعي
  5. التبديل إلى p=reject; pct=100 بمجرد أن تثق في الإعداد الخاص بك

ال pct يوضح لك الحقل الموجود في استجابة واجهة برمجة التطبيقات موقعك في هذا الطرح. مجال في pct=100 مع policy=reject لديه الحماية الكاملة.

DKIM: التوقيعات المشفرة على كل بريد إلكتروني

يضيف DKIM (البريد المعرف بمفاتيح المجال) توقيعًا مشفرًا إلى رؤوس كل ملف رسالة صادرة. يقوم الخادم المرسل بتوقيع الرسالة باستخدام مفتاح خاص؛ الخادم المتلقي التحقق من ذلك مقابل المفتاح العام المنشور في DNS الخاص بك. إذا تم تغيير الرسالة أثناء النقل (تم تغيير العناوين، وتعديل النص، وإعادة توجيهه من خلال قائمة بريدية تعيد كتابة المحتوى)، و فشل التوقيع.

سجلات DKIM مباشرة في [selector]._domainkey.example.com. المحدد هو التسمية يعين مزود البريد الإلكتروني الخاص بك، مثل google لـ Google Workspace أو selector1 لمايكروسوفت 365.

التحقق من سجل 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"}'

إجابة:

{
  "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
  }
}

الحقول الرئيسية:

  • has_dkim: هل تم نشر مفتاح عام لهذا المحدد؟ إذا كان خطأ، DKIM فشل التحقق لجميع الرسائل الموقعة باستخدام هذا المحدد.
  • public_key_length: يوصي NIST بما لا يقل عن 2048 بت. المفاتيح تحت 1024 البتات ضعيفة بما يكفي لتحليلها.
  • key_type: RSA هو المعيار. Ed25519 أسرع ويستخدم مفاتيح أقصر ولكن لديه دعم محدود من مزود البريد.

DKIM وإعادة توجيه البريد الإلكتروني

ولهذا السبب فإن DKIM مهم حتى عند تكوين نظام التعرف على هوية المرسل (SPF). عندما يقوم شخص ما بإعادة توجيه بريدك الإلكتروني، عنوان IP الخاص بخادم إعادة التوجيه غير موجود في سجل نظام التعرف على هوية المرسل (SPF)، لذا يفشل نظام التعرف على هوية المرسل (SPF). لكن توقيع DKIM يستمر إعادة التوجيه (طالما لم يتم تعديل المحتوى). يتم تمرير DMARC في حالة وجود نظام SPF أو تتم محاذاة DKIM، لذا فإن DKIM هو شبكة الأمان الخاصة بك للرسائل المعاد توجيهها.

كيف يعمل الثلاثة معًا

تهديد عامل حماية من الشمس (SPF). دكيم DMARC
بريد إلكتروني مخادع من خادم غير مصرح به يكتشف يكتشف (لا يوجد توقيع صالح) يفرض السياسة
تم العبث بنص الرسالة أثناء النقل لا يكشف يكتشف يفرض السياسة
البريد الإلكتروني المعاد توجيهه من المرسل الشرعي فشل (IP خادم مختلف) التمريرات (التوقيع سليم) يتم تمريره في حالة محاذاة DKIM
انتحال النطاق الفرعي (user@fake.example.com) لا حماية لا حماية كتل عبر sp=reject
الرؤية في حالات فشل المصادقة لا أحد لا أحد يرسل تقارير مجمعة

لا يوجد سجل واحد يوفر تغطية كاملة. نظام التعرف على هوية المرسل (SPF) بدون DMARC يعني عدم فرض حالات الفشل. يعني DKIM بدون نظام التعرف على هوية المرسل (SPF) أن أي شخص لديه مفتاح صالح يمكنه الإرسال من نطاقك. DMARC بدون كليهما ليس لدى نظام التعرف على هوية المرسل (SPF) وDKIM ما يمكن فرضه ضدهما.

تدقيق المجال الخاص بك في 30 ثانية

يتحقق برنامج Shell النصي من السجلات الثلاثة ويطبع ملخص النجاح/الفشل. يستخدم البوتوي واجهة برمجة تطبيقات أمان DNS؛ لا حاجة إلى مفتاح واجهة برمجة التطبيقات (API) لما يصل إلى 5 طلبات في الدقيقة.

#!/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

تشغيله:

bash audit.sh example.com google

الوسيطة الأولى هي المجال الخاص بك؛ والثاني هو محدد DKIM الخاص بك. البرنامج النصي يجعل 3 API المكالمات (ضمن حد الطبقة المجانية)، والتحقق من كل سجل، ووضع علامات تحذيرية للتكوينات الضعيفة، ويخرج برمز غير الصفر في حالة فشل أي فحص. قم بإسقاطه في مهمة cron أو خط أنابيب CI للمراقبة المستمرة.

إذا كنت تفضل JavaScript، فإليك نفس التدقيق كوظيفة غير متزامنة:

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));

تكوينات الموفر المشترك

يحتوي كل مزود بريد إلكتروني على نظام التعرف على هوية المرسل (SPF) الخاص به، ويتضمن المجال ومحدد DKIM. هنا القيم لمقدمي الخدمات الأكثر شيوعًا:

مزود يشمل عامل الحماية من الشمس (SPF). محدد (محددات) DKIM
مساحة عمل جوجل include:_spf.google.com google
مايكروسوفت 365 include:spf.protection.outlook.com selector1, selector2
أمازون سيس include:amazonses.com يعتمد على UUID (راجع وحدة تحكم SES)
سيندغريد include:sendgrid.net s1, s2
ختم البريد include:spf.mtasv.net لكل مجال (تحقق من إعدادات Postmark DNS)
ميلشيمب / ماندريل include:servers.mcsv.net k1

إذا كنت تستخدم عدة موفري خدمات، فإن سجل نظام التعرف على هوية المرسل (SPF) الخاص بك يتضمنهم جميعًا في إدخال TXT واحد. على سبيل المثال: v=spf1 include:_spf.google.com include:sendgrid.net ~all. شاهد حد البحث البالغ 10 عند إضافة مقدمي الخدمة.

النقاط الرئيسية

  • عامل حماية من الشمس (SPF). يتحكم في الخوادم التي يمكنها إرسال البريد الإلكتروني لنطاقك. التحقق من ذلك مع ال /v1/dns-security/spf-check نقطة النهاية. انتبه إلى حد البحث البالغ 10 و تجنب +all.
  • DMARC يحدد ما يحدث عند فشل نظام التعرف على هوية المرسل (SPF) أو DKIM. طرح تدريجيا من p=none ل p=reject باستخدام pct مجال. تعيين دائما أ rua عنوان لتلقي التقارير.
  • دكيم يثبت سلامة الرسالة مع التوقيعات المشفرة. استخدم 2048 بت الحد الأدنى من المفاتيح وتحقق من نشر المحدد الخاص بك /v1/dns-security/dkim-check.
  • جميع السجلات الثلاثة تعمل معًا. نظام التعرف على هوية المرسل (SPF) وحده لا يوقف انتحال البريد الإلكتروني المُعاد توجيهه. DKIM وحده لا يخبر المستلمين بما يجب عليهم فعله عند الفشل. ليس لدى DMARC بدون نظام التعرف على هوية المرسل (SPF) وDKIM ما يمكن فرضه.
  • أتمتة الشيكات الخاصة بك. قم بتشغيل البرنامج النصي للتدقيق وفقًا لجدول زمني أو في CI للقبض على انحراف DNS، أيها الموفر عمليات الترحيل وحذف السجلات غير المقصودة قبل أن تؤثر على إمكانية التسليم.

FAQ

ما هو سجل SPF ولماذا أحتاج إليه؟
سجل SPF (إطار سياسة المرسل) هو إدخال DNS TXT يسرد كل خادم مصرح له بإرسال بريد إلكتروني نيابة عن المجال الخاص بك. وبدون ذلك، يمكن لأي خادم على الإنترنت إرسال بريد إلكتروني يبدو أنه مرسل من نطاقك، وليس لدى خوادم البريد المتلقية أي طريقة لمعرفة الفرق. تحتاج معظم النطاقات إلى سجل SPF واحد على الأقل يتضمن موفر البريد الإلكتروني الخاص بها.
كيف يمكنني التحقق مما إذا كان النطاق الخاص بي يحتوي على سجل DMARC؟
استعلم عن سجل DNS TXT على _dmarc.yourdomain.com. يمكنك القيام بذلك باستخدام dig أو nslookup أو عن طريق إرسال طلب POST إلى واجهة برمجة التطبيقات للتحقق من DMARC من botoi باستخدام اسم المجال الخاص بك. تقوم واجهة برمجة التطبيقات (API) بإرجاع السجل الذي تم تحليله بالكامل بما في ذلك عناوين السياسة والنسبة المئوية وإعداد التقارير.
هل أحتاج إلى DKIM إذا كان لدي نظام التعرف على هوية المرسل (SPF) بالفعل؟
نعم. يعمل نظام SPF وDKIM على حل مشكلات مختلفة. يتحقق نظام التعرف على هوية المرسل (SPF) من أن خادم الإرسال معتمد؛ يتحقق DKIM من عدم تغيير محتوى الرسالة أثناء النقل. تؤدي إعادة توجيه البريد الإلكتروني إلى قطع محاذاة نظام التعرف على هوية المرسل (SPF) ولكنها تحافظ على توقيعات DKIM. يتطلب DMARC تمرير أحدهما على الأقل، لذا فإن الحصول على كليهما يمنحك المرونة عند حدوث إعادة التوجيه أو الترحيل.
ماذا يحدث إذا قمت بتعيين سياسة DMARC الخاصة بي على الرفض فورًا؟
ستسقط خوادم الاستلام كل رسالة تفشل في محاذاة نظام التعرف على هوية المرسل (SPF) وDKIM. إذا كانت لديك سجلات تم تكوينها بشكل خاطئ، أو نسيت مرسلين من جهات خارجية، أو قواعد إعادة توجيه لم تأخذها في الاعتبار، فسيتم تجاهل البريد الإلكتروني الشرعي بصمت. ابدأ بـ p=none لجمع التقارير، وانتقل إلى p=quarantine بنسبة 10%، وقم بتعيين p=reject فقط بعد التأكد من مصادقة جميع رسائل البريد الشرعية.
كم مرة يجب أن أقوم بمراجعة سجلات مصادقة البريد الإلكتروني الخاصة بي؟
على الأقل، تحقق بعد كل تغيير في نظام أسماء النطاقات (DNS)، أو ترحيل موفر البريد الإلكتروني، أو عند إضافة خدمة إرسال جديدة (أدوات التسويق، أو البريد الإلكتروني للمعاملات، أو إدارة علاقات العملاء). يكتشف الفحص الآلي الأسبوعي الكسر الصامت مثل تجاوز حد البحث SPF 10 أو مفتاح DKIM منتهي الصلاحية. تعمل نقاط نهاية API لأمن DNS في botoi على تسهيل التشغيل الآلي في CI أو مهمة cron.

ابدأ البناء مع botoi

أكثر من 150 نقطة نهاية API للبحث ومعالجة النصوص وتوليد الصور وأدوات المطورين. باقة مجانية، بدون بطاقة ائتمان.