คำตอบสั้น ๆ: แปลรายงาน XML ที่ผู้ให้บริการอีเมลส่งมา ให้รู้ว่ามีใครส่งอีเมลในนามโดเมนของคุณบ้าง และเข้มนโยบายได้อย่างปลอดภัย
คู่มือนี้อธิบาย DMARC ทีละขั้นตอน พร้อมคำสั่งที่ใช้ได้จริงและปัญหาที่พบบ่อย
เมื่อตั้งระเบียน DMARC พร้อมที่อยู่รับรายงาน ผู้ให้บริการอีเมลรายใหญ่จะส่งรายงานสรุปมาให้ทุกวัน บอกว่ามีใครส่งอีเมลในนามโดเมนของคุณบ้าง จาก IP ไหน และผ่านการตรวจสอบหรือไม่
ข้อมูลนี้มีค่ามาก แต่มาในรูปแบบ XML ที่บีบอัดไว้และอ่านด้วยตาเปล่าแทบไม่ได้ คู่มือนี้แปลงให้อ่านรู้เรื่องและอธิบายว่าต้องดูอะไร
สิ่งที่ต้องเตรียม
- ระเบียน DMARC ที่ตั้งพร้อมที่อยู่รับรายงานแล้ว
- กล่องจดหมายที่รับรายงาน ซึ่งควรเป็นบัญชีเฉพาะเพราะได้รับหลายฉบับต่อวัน
- เครื่อง Linux สำหรับแปลงไฟล์
dig +short TXT _dmarc.example.com
ขั้นตอนที่ 1: เข้าใจสิ่งที่ DMARC ตรวจ
DMARC ไม่ได้ตรวจแค่ว่า SPF หรือ DKIM ผ่านหรือไม่ แต่ตรวจเพิ่มว่าโดเมนที่ผ่านนั้นตรงกับโดเมนที่แสดงในช่องผู้ส่งหรือไม่ ซึ่งเรียกว่า alignment
ตัวอย่างที่ทำให้เข้าใจ อีเมลที่ส่งผ่านบริการส่งจดหมายข่าว
- ช่อง From แสดง
[email protected] - SPF ตรวจจากโดเมนของผู้ให้บริการ เช่น
mailer.provider.comซึ่งผ่าน - แต่ SPF alignment ไม่ผ่าน เพราะสองโดเมนไม่ตรงกัน
DMARC จะผ่านก็ต่อเมื่ออย่างน้อยหนึ่งใน SPF หรือ DKIM ผ่านพร้อม alignment นี่คือเหตุผลที่บริการภายนอกต้องตั้ง DKIM ด้วยโดเมนของคุณเอง
ขั้นตอนที่ 2: แปลงรายงานให้อ่านได้
บันทึกไฟล์แนบจากอีเมลรายงานลงเครื่อง แล้วแตกไฟล์
cd /tmp/dmarc
gunzip *.xml.gz 2>/dev/null
unzip -o '*.zip' 2>/dev/null
# ดูโครงสร้าง
xmllint --format report.xml | head -40
เขียนสคริปต์แปลงเป็นตารางที่อ่านง่าย
#!/bin/bash
# /usr/local/bin/dmarc-summary.sh
for f in "$@"; do
org=$(xmllint --xpath 'string(//report_metadata/org_name)' "$f" 2>/dev/null)
dom=$(xmllint --xpath 'string(//policy_published/domain)' "$f" 2>/dev/null)
echo "=== รายงานจาก $org สำหรับ $dom"
printf '%-16s %-7s %-9s %-9s %s\n' "IP" "จำนวน" "SPF" "DKIM" "ผล"
n=$(xmllint --xpath 'count(//record)' "$f" 2>/dev/null)
for i in $(seq 1 "$n"); do
ip=$(xmllint --xpath "string((//record)[$i]/row/source_ip)" "$f")
ct=$(xmllint --xpath "string((//record)[$i]/row/count)" "$f")
sp=$(xmllint --xpath "string((//record)[$i]/row/policy_evaluated/spf)" "$f")
dk=$(xmllint --xpath "string((//record)[$i]/row/policy_evaluated/dkim)" "$f")
ds=$(xmllint --xpath "string((//record)[$i]/row/policy_evaluated/disposition)" "$f")
host=$(dig +short -x "$ip" | head -1)
printf '%-16s %-7s %-9s %-9s %-10s %s\n' "$ip" "$ct" "$sp" "$dk" "$ds" "${host:-}"
done
echo
done
sudo chmod +x /usr/local/bin/dmarc-summary.sh
/usr/local/bin/dmarc-summary.sh /tmp/dmarc/*.xml
ขั้นตอนที่ 3: อ่านผลและจัดกลุ่มผู้ส่ง
จากตารางที่ได้ ให้แยก IP ออกเป็นสามกลุ่ม
กลุ่มที่ 1 ผู้ส่งที่ถูกต้องและผ่านทั้งหมด
ไม่ต้องทำอะไร นี่คือสิ่งที่ควรเป็น
กลุ่มที่ 2 ผู้ส่งที่ถูกต้องแต่ไม่ผ่าน
นี่คือกลุ่มที่ต้องแก้ก่อนเข้มนโยบาย มักเป็น
- เซิร์ฟเวอร์เว็บที่ส่งอีเมลยืนยันคำสั่งซื้อแต่ไม่ได้อยู่ใน SPF
- บริการส่งจดหมายข่าวที่ยังไม่ได้ตั้ง DKIM ด้วยโดเมนของคุณ
- ระบบ CRM หรือระบบบัญชีที่ส่งอีเมลแทนโดเมน
- เครื่องพิมพ์หรืออุปกรณ์ที่ตั้งให้ส่งอีเมล
ค้นหาว่าเป็นใครจาก Reverse DNS และปริมาณอีเมล
dig +short -x 203.0.113.99
whois 203.0.113.99 | grep -iE 'orgname|netname|descr' | head -3
กลุ่มที่ 3 ผู้ส่งที่ไม่รู้จักและไม่ผ่าน
อาจเป็นการปลอมแปลงจริง หรืออาจเป็นการส่งต่ออีเมลซึ่งทำให้ SPF ไม่ผ่านโดยธรรมชาติ ดูปริมาณประกอบ หากมีเพียงไม่กี่ฉบับมักเป็นการส่งต่อ หากมีหลายพันฉบับต่อวันคือการปลอมแปลง
ขั้นตอนที่ 4: แก้ผู้ส่งที่ถูกต้องให้ผ่าน
สำหรับเซิร์ฟเวอร์ของคุณเอง เพิ่มเข้า SPF
"v=spf1 include:_spf.google.com ip4:203.0.113.10 ~all"
สำหรับบริการภายนอก ให้ตั้ง DKIM ด้วยโดเมนของคุณ ซึ่งดีกว่าการเพิ่มเข้า SPF เพราะ
- DKIM ยังผ่านแม้อีเมลถูกส่งต่อ ส่วน SPF ไม่ผ่าน
- ไม่กินโควตาการค้นหา DNS ที่จำกัดไว้ 10 ครั้ง
ผู้ให้บริการที่จริงจังทุกรายมีตัวเลือกให้ตั้ง DKIM ด้วยโดเมนของลูกค้า มองหาคำว่า Domain Authentication หรือ Sender Authentication