ป้องกันอีเมลสวมรอย (Email spoofing) ด้วย SPF, DKIM และ DMARC

Email spoofing คือการสวมรอยอีเมลโดยระบุชื่อผู้ส่งเป็นโดเมนที่ต้องการสวมรอย ซึ่งการสวมรอยนั้น ทำได้ง่ายมาก เนื่องจาก protocol ของอีเมลไม่มีกลไกยืนยันตัวตนผู้ส่ง เป้าหมายของการสวมรอยก็เพื่อหลอกให้ผู้รับเข้าใจผิด (เช่น เห็นว่าเป็นอีเมลจากลูกค้า จากธนาคาร จากหัวหน้างานหรือผู้บริหารในองค์กร) เพื่อเพิ่มโอกาสในการเปิดอ่านอีเมล เพื่อหวังผลการโจมตีในอีเมลนั้นอีกที เช่น ส่งไฟล์แนบที่มีไวรัส โทรจัน หรือมัลแวร์ต่างๆ

โดยสรุปก็คือ การสวมรอยอีเมลนั้น ทำได้ง่าย และโอกาสโจมตีสำเร็จสูง หากผู้รับไหวตัวไม่ทัน

(ภาพจาก techtarget.com)

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

ทั้งนี้ ในระดับผู้ดูแลระบบ เราสามารถป้องกันการสวมรอยอีเมลในโดเมนเราได้ ด้วยการใช้ SPF, DKIM และ DMARC เรามาดูกันทีละตัวเลยครับ


SPF: ประกาศ IP ให้โลกรู้

SPF (Sender Policy Framework) ช่วยให้เจ้าของโดเมนสามารถประกาศหมายเลข IP ที่จะใช้ส่งอีเมลออกจากโดเมนตัวเองได้ โดยการประกาศหมายเลข IP ไว้ที่ DNS record เพื่อให้ผู้รับสามารถตรวจสอบได้ว่า อีเมลที่ได้รับจากโดเมนนั้นๆ สวมรอยมาหรือไม่

ตัวอย่างเช่น โดเมนของเรา มี IP ที่เราใช้ส่งอีเมลคือ 123.456.7.890 หากผู้โจมตี (spammer) สวมรอยส่งอีเมลด้วยชื่อโดเมนเรา แต่ส่งจาก server ของผู้โจมตี ซึ่งจะมี IP ที่แตกต่างกับ IP ของเรา ผู้รับก็จะสามารถแยกแยะได้ ว่าอีเมลนั้น ส่งมาจาก server อื่น ซึ่งมีความเป็นไปได้ว่าจะโดนสวมรอยโดเมนเพื่อโจมตี

SPF ไม่ได้ใช้ป้องกันแดด แต่เอาไว้ป้องกัน spam

ตัวอย่างของ SPF record

v=spf1 ip4:123.456.7.890 include:_spf.google.com ~all

DKIM: ใส่ลายเซ็นดิจิทัลให้อีเมล

คล้ายกับ SPF ที่ใช้การประกาศหมายเลข IP บน DNS record แต่สำหรับ DKIM (DomainKeys Identified Mail) จะเป็นการประกาศ public key บน DNS record แทน

เมื่อเริ่มต้นกระบวนการ ระบบจะสร้าง private key และ public key ที่คู่กันขึ้นมา key 2 ตัวนี้จะเข้าชุดกัน โดยเมื่อใช้ตัวใดตัวหนึ่ง เข้ารหัสข้อมูลไว้ จะสามารถใช้อีกตัวหนึ่งถอดรหัสข้อมูลกลับมาได้ (หากสนใจ สามารถอ่านเพิ่มเติมได้ที่ blognone) ซึ่ง DKIM นั้น จะเก็บ private key ไว้กับตัว และให้เราประกาศ public key ทาง DNS record

เมื่อมีการส่งอีเมลจากระบบ ข้อมูลอีเมลจะถูกเข้ารหัสด้วย private key และแนบข้อมูลที่เข้ารหัส (เรียกว่าค่า hash) ไปกับ header (ตัวเนื้อหาข้อมูลไม่ได้ถูกล๊อคแต่อย่างใด เพียงแค่หยิบมาเข้ารหัสเพื่อจะใช้ค่า hash) ในฝั่งผู้รับ เมื่อได้รับอีเมลแล้ว สามารถไปหยิบ public key ที่เราวางไว้ให้ เพื่อมาถอดรหัส และตรวจสอบว่าข้อมูลที่ถอดรหัสแล้ว ตรงกับเนื้อหาที่ได้รับมาหรือไม่ ทำให้สามารถยืนยันได้ว่า ข้อมูลที่ได้รับนั้น ไม่ได้ถูกแก้ไขระหว่างทาง

ตัวอย่างของ DKIM

v=DKIM1; p=publickey

ตัวอย่างกระบวนการเข้ารหัสและถอดรหัสด้วยคู่ของ public และ private key (ภาพจาก shankaraman wordpress)

DMARC: ต่อยอดของเดิม เพิ่มเติมคือ report

DMARC (Domain-based Message Authentication, Reporting and Conformance) เป็นการต่อยอด โดยใช้ข้อมูลยืนยันตัวตนของ SPF เพื่อพิสูจน์ที่มา และใช้ DKIM เพื่อยืนยันว่าข้อมูลไม่ถูกแก้ไข สิ่งที่เพิ่มขึ้นมาคือการ report โดยใน DMARC เราจะต้องระบุอีเมลที่ใช้รับ report เพื่อรับ report จากโดเมนอื่นๆ ที่ร่วมโครงการ DMARC โดยใน report จะมีข้อมูลแสดงปริมาณอีเมลที่ถูกส่งในนามโดเมนของเรา รวมถึงผลลัพธ์ของการยืนยันตัวตน เพื่อให้เราสามารถปรับค่า policy ให้เหมาะสมได้

ผังแสดงลำดับการตรวจสอบเพื่อใช้ DMARC policy (ภาพจาก returnpath.com)

ตัวอย่าง DMARC record

v=DMARC1; p=none; rua=mailto:postmaster@your_domain.com


เราห้ามโจรไม่ได้ และการป้องกันอีกครึ่งหนึ่งอยู่กับผู้รับ

สิ่งที่เราทำได้คือ การเปิดเผยข้อมูลที่จำเป็น เพื่อให้ผู้รับ สามารถตรวจสอบได้ว่าอีเมลที่ส่งไปในนามโดเมนนั้นๆ ถูกสวมรอยมา หรือถูกแก้ไขระหว่างทางหรือไม่ แต่เราไม่สามารถหยุดการโดนสวมรอยได้ เนื่องจาก spammer สามารถสวมรอยโดเมนเราได้ โดยไม่ต้องเจาะระบบใดๆ เลยด้วยซ้ำ และหากฝั่งผู้รับไม่ตรวจสอบที่มาตามมาตรฐานที่กำหนด ก็จะไม่เกิดประโยชน์ใดๆ

สำหรับใครที่มีปัญหาเรื่องอีเมล spam อยู่ (ไม่ว่าจะโดนสวมรอยโดเมนไปยิ่งใส่คนอื่น หรือโดนยิ่ง spam มาเข้า user ในโดเมน) สามารถติดต่อได้ที่บริษัท tangerine ครับ

---





ความคิดเห็น

โพสต์ยอดนิยมจากบล็อกนี้

การเรียกใช้งาน Google Apps Script

ลดเวลาการเรียก API ใน Apps Script ด้วย fecthAll

ออกแบบระบบให้คุยข้าม module กันได้ ด้วย Pub/Sub