สำหรับระบบ 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 ของเราให้ครบ เพื่อให้ผู้รับภายนอกสามารถนำสิ่งที่เราประกาศไว้ ไปใช้ประโยชน์ ช่วยตัดสินใจต่อได้ ก็จะเป็นเรื่องที่ดีครับ
อ่านเพิ่มเติม