ตั้ง DKIM SPF DMARC ป้องกันอีเมลปลอมบน VPS
DKIM, SPF, และ DMARC เป็น 3 มาตรฐานความปลอดภัยอีเมลที่ช่วยยืนยันว่าอีเมลมาจากโดเมนของคุณจริง ไม่ถูกปลอมแปลง ถ้า VPS ของคุณรัน mail server เช่น Postfix ต้องตั้ง protocol ทั้ง 3 นี้เพื่อป้องกัน attacker ปลอมตัวเป็นโดเมนของคุณ และเพิ่มความน่าเชื่อถือ ให้อีเมลของคุณถูก deliver เข้า inbox แทนที่จะตกไปอยู่ในแฟ้ม spam
ติดตั้ง OpenDKIM
# ติดตั้ง OpenDKIM
sudo apt update
sudo apt install opendkim opendkim-tools libopendkim-perl -y
# เปิดใช้งาน service
sudo systemctl enable --now opendkim
# ตรวจ status
sudo systemctl status opendkim
สร้าง DKIM Key Pair
# สร้างโฟลเดอร์ keys
sudo mkdir -p /etc/opendkim/keys
sudo chown opendkim:opendkim /etc/opendkim/keys
sudo chmod 700 /etc/opendkim/keys
# ไปที่โฟลเดอร์
cd /etc/opendkim/keys
# สร้าง key pair สำหรับโดเมนของคุณ (เปลี่ยน example.com)
sudo opendkim-genkey -b 2048 -d example.com -D /etc/opendkim/keys -s default -v
# ปรับ permission
sudo chown opendkim:opendkim /etc/opendkim/keys/default.private
sudo chown opendkim:opendkim /etc/opendkim/keys/default.txt
ตั้งค่า OpenDKIM Configuration
# แก้ไฟล์ config หลัก
sudo nano /etc/opendkim.conf
เพิ่มหรือแก้ไขบรรทัดเหล่านี้ (ตรวจสอบค่าต่างๆ ให้ตรงกับที่คุณตั้ง):
Domain example.com
KeyFile /etc/opendkim/keys/default.private
Selector default
Socket inet:8891@localhost
CanonicalHeadersOnly yes
Mode sv
SubDomains yes
ออกจากไฟล์ด้วย Ctrl+X แล้วตอบ Y เพื่อบันทึก
เพิ่ม DKIM DNS Record
ดูคีย์สาธารณะที่สร้างไป:
sudo cat /etc/opendkim/keys/default.txt
ผลลัพธ์จะเป็นแบบนี้:
default._domainkey.example.com. IN TXT "v=DKIM1; h=sha256; k=rsa; p=MIIBIjANBgkq..."
ไปที่ control panel ของคุณ แก้ไข DNS record ที่ระดับ subdomain default._domainkey (หรือ default._domainkey.example.com ถ้า panel ต้องการ FQDN) แล้วเพิ่ม TXT record ด้วยค่า v=DKIM1; h=sha256; k=rsa; p=MIIBIjANBgkq... (คัดลอกเฉพาะส่วน p= เท่านั้น)
เพิ่ม SPF DNS Record
เพิ่ม SPF record บนโดเมนของคุณ (ไม่ใช่ subdomain) เป็น TXT record:
v=spf1 ip4:YOUR_VPS_IP -all
แทน YOUR_VPS_IP ด้วย IP address ของ VPS ของคุณ เช่น v=spf1 ip4:203.0.113.5 -all
ถ้า VPS ใช้ mail relay หรือมีหลาย server:
v=spf1 ip4:203.0.113.5 ip4:203.0.113.10 mx -all
เพิ่ม DMARC DNS Record
สร้าง DMARC record บนโดเมนของคุณ (subdomain ชื่อ _dmarc) เป็น TXT record:
v=DMARC1; p=quarantine; rua=mailto:[email protected]
ความหมาย:
v=DMARC1— versionp=quarantine— policy (quarantine = ส่งเข้า spam folder ถ้า fail, none = เฉพาะ report, reject = บล็อคเลย)rua=mailto:[email protected]— ส่ง aggregate report ให้ email นี้
สำหรับการทดสอบเริ่มแรก ใช้ p=none ก่อน แล้ว upgrade เป็น p=quarantine หรือ p=reject หลังจากตรวจสอบแล้วว่าไม่มี legitimate email fail
# เวอร์ชั่นเต็ม
v=DMARC1; p=quarantine; rua=mailto:[email protected]; ruf=mailto:[email protected]; fo=1
ตรวจสอบว่า DKIM SPF DMARC ทำงานถูกต้อง
# ตรวจ DKIM public key
dig default._domainkey.example.com TXT
# ตรวจ SPF record
dig example.com TXT
# ตรวจ DMARC record
dig _dmarc.example.com TXT
# ตรวจ OpenDKIM signature
sudo opendkim-testkey -d example.com -s default
# ดู log OpenDKIM
sudo journalctl -u opendkim -f
ส่งอีเมลทดสอบไปที่ Gmail หรือ Yahoo แล้วดูส่วน "Show original" ในอีเมลนั้น มีAuthentication-Results header ที่บอก DKIM/SPF/DMARC ผลการตรวจสอบหรือไม่:
เสริมอีกทาง: ใช้ Email Deliverability Checker ของ dnsxray.com ตรวจ MX, SPF, DKIM, DMARC ของโดเมนพร้อมกันจากภายนอก จะเห็นเหมือนที่ Mail Server ปลายทางเห็น ถ้า Record ไหนหายหรือ Syntax ผิดจะโชว์ทันที
Authentication-Results: gmail.com;
dkim=pass [email protected] header.s=default header.b=...;
spf=pass (google.com: domain of [email protected] designates 203.0.113.5 as permitted sender) [email protected];
dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=example.com
แก้ปัญหาที่พบบ่อย
Error: "DKIM signature did not pass"
DNS record ไม่ถูกต้องหรือ key pair ไม่ตรงกัน
# ตรวจ DKIM key ตรงกับ DNS หรือไม่
sudo opendkim-testkey -d example.com -s default -vv
# ถ้าพบปัญหา สร้าง key ใหม่
cd /etc/opendkim/keys
sudo rm default.private default.txt
sudo opendkim-genkey -b 2048 -d example.com -D /etc/opendkim/keys -s default
sudo chown opendkim:opendkim default.private
# คัดลอก public key (default.txt) ลง DNS ใหม่แล้วรอ propagate
Error: "SPF: Too many DNS lookups"
SPF record มี include chain ยาวเกินไป จน DNS lookup เกิน 10 ครั้งซึ่งเป็นขีดจำกัดสูงสุดของ SPF
# ดู SPF chain ว่ากี่ lookup
dig example.com TXT +trace
# ลดจำนวน include ใน SPF record เช่น
v=spf1 ip4:203.0.113.5 -all
# แทนของ
v=spf1 ip4:203.0.113.5 include:thirdparty.com include:another.com -all
Error: "DMARC alignment failure"
DKIM หรือ SPF fail หรือ domain ไม่ align ระหว่าง From: header กับ Return-Path
# ตรวจ From: header ตรงกับ domain ที่ DKIM sign หรือไม่
# ตรวจ SPF นี้อนุญาต server นี้หรือไม่
dig example.com TXT
Error: "OpenDKIM failed to load key"
File permission ผิดหรือ path config ไม่ถูกต้อง
# ตรวจ permission
ls -la /etc/opendkim/keys/default.private
# ต้องเป็น opendkim:opendkim และ mode 600
sudo chown opendkim:opendkim /etc/opendkim/keys/default.private
sudo chmod 600 /etc/opendkim/keys/default.private
# restart OpenDKIM
sudo systemctl restart opendkim
Error: "SPF record return permerror"
SPF syntax มีข้อผิดพลาด หรือ IP address ใช้ CIDR notation ผิด
# ตรวจ SPF syntax ด้วย tool online เช่น
# mxtoolbox.com/spf.aspx
# ตรวจ format ของ IP address ต้องเป็น
v=spf1 ip4:203.0.113.5/32 -all
# ถ้า IP range
v=spf1 ip4:203.0.113.0/24 -all
คำถามที่พบบ่อย
ต้องตั้ง DKIM SPF DMARC ทั้ง 3 อันไหม
ไม่ต้องทั้ง 3 อัน แต่แนะนำให้ตั้งทั้ง 3 SPF ป้องกัน spoofing ขั้นพื้นฐาน DKIM ตรวจสอบว่า email ไม่ถูก tamper บนทาง DMARC บอก receiver ว่า ถ้า email fail DKIM หรือ SPF ให้ทำอย่างไร ทั้ง 3 อันรวมกันให้ protection ที่ดีที่สุด
DKIM key ต้องสร้างใหม่ทุกกี่ปี
ไม่จำเป็น DKIM key ใช้ได้ตลอด แต่ปฏิบัติด้าน security บ้างแล้ว rotate key ทุก 1-2 ปี คุณสามารถสร้าง key ใหม่ เพิ่มทั้ง 2 key (เก่าและใหม่) ลง DNS ไว้แล้วค่อยลบ key เก่า
DMARC report ถูกส่งไปที่ไหน
DMARC report ถูกส่งไปยัง email address ที่กำหนดใน rua= (aggregate report) มาทุกวัน หรือ ruf= (forensic report) เมื่อ email fail ตรวจสอบ DMARC alignment Report มีจำนวน email ที่ pass/fail DKIM SPF และ domain alignment จึงช่วยคุณตรวจจับการปลอมตัวได้