SPF, DKIM, DMARC

สำหรับระบบ mail

นอกจาก DNS MX record ที่ใช้รับอีเมล์จากภายนอก และ DNS record สำหรับ URL ที่ใช้ access ระบบ mail แล้ว

ยังมี DNS record ของ SPF, DKIM, และ DMARC ที่เราควรจะสร้างใน DNS domain ของเราให้เรียบร้อยด้วยนะครับ


SPF – Sender Policy Framework

SPF record ใน DNS domain ของเราใช้ประกาศว่า IP address ของเครื่อง หรืออุปกรณ์ที่เราอนุญาตให้ส่งอีเมล์ในนาม SMTP domain ของเรามี IP อะไรบ้าง?

ถ้า mail server ที่กำลังส่ง mail มี IP address ตรงกับที่ประกาศไว้ใน SPF record ของเขา ผู้รับก็จะสรุปผลของ SPF ว่า pass

แต่ในบางกรณี เช่น ผู้รับมี mail gateway เพื่อ relay อีเมล์เข้าหา mail server ด้านในอีกต่อนึง หาก mail server ผู้รับไม่มีค่า setting ที่ใช้แก้ไขกรณีแบบนี้ หรือมี แต่ไม่ได้ตั้งค่าช่วยไว้

เมื่อผู้รับเห็น IP ของ mail server ที่กำลังส่งอีเมล์หาตนไม่ตรงกับที่ประกาศไว้ใน SPF record ผลของ SPF ก็จะ fail ได้ครับ

เพื่อหลีกเลี่ยงปัญหานี้ เราจึงต้องใช้ DKIM ช่วย


DKIM – DomainKeys Identified Mail

DKIM ใช้การ sign อีเมล์ก่อนที่จะส่งด้วย private key ของ mail server ผู้ส่ง แล้วแปะ DKIM signature ไปกับอีเมล์ด้วย

เมื่อ enable DKIM แล้ว ผู้ส่งจะต้องประกาศ DNS record ของ DKIM ไว้ใน DNS domain ของตัวเองด้วย เพื่อให้ผู้รับมา query จนพบ แล้วนำ public key ที่ได้ไปใช้ verify DKIM signature ของผู้ส่ง

ไม่ว่าอีเมล์ฉบับนั้นจะถูก forward หรือ relay สักกี่ครั้ง DKIM signature ตัวเดิมก็จะยังฝังอยู่กับอีเมล์ฉบับนั้นไม่เปลี่ยนแปลง

ทำให้การ verify DKIM ทางฝั่งผู้รับจึง pass เสมอ ถึงแม้ว่า SPF อาจจะ fail ก็ตามนั่นเองครับ


DMARC – Domain-based Message Authentication, Reporting and Conformance

DMARC คือ DNS record อีกตัวนึงที่เราควรประกาศไว้ใน DNS domain ของเรา โดยใช้ค่า p=none, หรือ p=quarantine, หรือ p=reject เพื่อแนะนำผู้รับว่า ถ้าอีเมล์ที่ถูกระบุว่าส่งมาจาก domain ของเรามีค่า SPF และ DKIM ไม่ผ่านทั้งคู่ (DMARC fail) เราอยากให้ผู้รับทำอะไรกับอีเมล์ฉบับนั้น

SPF ไม่ผ่าน + DKIM ไม่ผ่าน = DMARC fail

หาก SPF หรือ DKIM อย่างใดอย่างนึง pass ผลของ DMARC จะ pass เสมอ

ตัวอย่างเช่น Microsoft อยากให้ mail server ของผู้รับทุกรายช่วย reject อีเมล์จาก @microsoft.com ที่มี SPF fail และ DKIM fail ทั้งคู่ (DMARC fail)

อย่างไรก็ตาม ถึงแม้ผู้ส่งจะแนะนำให้ทำอย่างไร แต่ผู้รับก็ไม่จำเป็นต้องเชื่อฟังและทำตามนะครับ

ผู้รับอาจจะรับอีเมล์ที่ fail ทั้ง SPF, DKIM, DMARC และ p=reject เข้ามาในระบบ

แต่เขาก็จะใช้ anti-malware หรือ anti-spam engine ของเขา ช่วย scan อีกทีอยู่ดี ซึ่งผลลัพธ์อาจจะจบลงที่อีเมล์ฉบับนั้นถูกส่งเข้า Junk Email folder ของ user ก็ได้

ซึ่ง diagram การทำงานของ DMARC แบบง่ายๆ เราอาจดูจากตัวอย่างนี้ก็ได้นะครับ

ตอนนี้เรารู้จักกับ SPF, DKIM, และ DMARC แล้ว

ต่อมาเรามาดูตัวอย่างผลลัพธ์ของ SPF, DKIM, DMARC ที่สามารถเกิดขึ้นได้กันนะครับ


No SPF, No DKIM, No DMARC -> SPF = none, DKIM = none, DMARC = none

เริ่มจากผู้ส่งไม่มี DNS record ของ SPF, DKIM, DMARC อยู่เลย

ผลของ SPF, DKIM, DMARC ทางฝั่งผู้รับ ก็จะเป็น none ทั้งหมด


Valid SPF, No DKIM, No DMARC -> SPF=pass, DKIM=none, DMARC=bestguesspass

เพิ่ม SPF record ที่ถูกต้อง

ผลที่ได้จะเป็น SPF=pass, DKIM=none, DMARC=bestguesspass (ผู้ส่งไม่ได้สร้าง DMARC record ไว้ แต่ SPF ผ่าน ผู้รับจึงตัดสินใจว่า DMARC ก็ควรผ่านนั่นเองครับ)


Invalid SPF, No DKIM, No DMARC -> SPF=fail, DKIM=none, DMARC=none

ลองแก้ SPF ให้ผิด

จะได้ผลลัพธ์เป็น SPF=fail, DKIM=none, DMARC=none


Invalid SPF, valid DKIM, No DMARC -> SPF=fail, DKIM=pass, DMARC=bestquesspass

SPF ยังผิดอยู่ แต่เราเพิ่ม DKIM DNS record ที่ถูกต้องเข้าไป

ผู้รับจะหา public key ของผู้ส่งเจอจาก DKIM DNS record แล้วนำไป verify DKIM signature ของผู้ส่งที่แปะมากับอีเมล์ได้

ผลลัพธ์จึงเป็น SPF=fail, DKIM=pass, DMARC=bestquesspass


Valid SPF, valid DKIM, No DMARC -> SPF=pass, DKIM=pass, DMARC=bestguesspass

แก้ SPF ให้ถูกต้อง (DKIM record ก็ยังอยู่)

ผลลัพธ์ที่ได้จึงเป็น SPF=pass, DKIM=pass, DMARC=bestguesspass


(Recommended) valid SPF, valid DKIM, valid DMARC -> SPF=pass, DKIM=pass, DMARC=pass

เพิ่ม DMARC DNS record (จาก 5) เพื่อกำหนด DMARC policy

ตัวอย่างเช่น เราสร้าง DMARC record เลียนแบบ microsoft.com แต่เราอยากใช้แค่ p=quarantine (microsoft.com ใช้ p=reject)

เมื่อมี DMARC DNS record แล้ว ผลลัพธ์ที่ได้ของ SPF, DKIM, และ DMARC จึง pass ทั้งหมดเลยครับ

อย่างไรก็ดี สุดท้ายแล้วก็อยู่ที่ผู้รับอยู่ดีว่าจะนำผลลัพธ์นี้ ไปช่วยในการตัดสินใจทำอะไร?

ตัวอย่างเช่น แม้จะ pass ทั้ง 3 อย่าง แต่ anti-spam engine ของ Exchange Online ก็ยังต้อง scan อีเมล์ฉบับนั้นต่ออยู่ดี เช่นในรูปนี้ อีเมล์ทั้งหมดก็ยังตก Junk Email folder ของผู้รับอยู่ดีนะครับ


Valid SPF, No DKIM, valid DMARC -> SPF=pass, DKIM=fail, DMARC=pass

ลองลบ DKIM DNS record เพื่อให้ DKIM fail

ผลลัพธ์ที่ได้ DMARC จะยัง pass อยู่ (เพราะ SPF=pass)


No SPF, valid DKIM, valid DMARC -> SPF=none, DKIM=pass, DMARC=pass

ลบ SPF แต่เพิ่ม DKIM กลับมา

เมื่อมี DKIM DNS record ผู้รับจะหา public key เจอ

ผลลัพธ์ของ DKIM จึง pass

ทำให้ DMARC=pass โดยไม่ต้องสนใจผลของ SPF


No SPF, No DKIM, valid DMARC -> SPF=none, DKIM=fail, DMARC=fail

ในตัวอย่างสุดท้าย ลองลบทั้ง SPF และ DKIM ดู

เมื่อ SPF และ DKIM ไม่ผ่านทั้ง 2 ตัว จึงจะสามารถทำให้ DMARC fail ได้ครับ (SPF=none, DKIM=fail, DMARC=fail)

และเมื่อ DMARC fail ค่า DMARC policy ที่เราตั้งไว้ ก็จะแนะนำผู้รับให้ quarantine อีเมล์ฉบับนั้นครับ


อย่างไงก็ตาม วกกลับมาที่เรื่องเดิม นั่นคือ ต่อให้ผลลัพธ์จะเป็นอย่างไร DMARC อาจจะ fail แล้ว policy แนะนำผู้รับให้ quarantine หรือ reject อีเมล์ แต่ผู้รับอาจจะไม่ทำตามก็ได้

ดังนั้น งานฝั่งผู้รับ เราก็ปล่อยให้ผู้รับเป็นคนจัดการไป

ส่วนเรา ในฐานะผู้ส่ง ควรจะสร้าง SPF, DKIM, และ DMARC ที่ถูกต้องไว้ใน SMTP domain ของเราให้ครบ เพื่อให้ผู้รับภายนอกสามารถนำสิ่งที่เราประกาศไว้ ไปใช้ประโยชน์ ช่วยตัดสินใจต่อได้ ก็จะเป็นเรื่องที่ดีครับ


อ่านเพิ่มเติม

Zeen Social Icons