MTA-STS: บังคับ TLS ให้อีเมลขาเข้า พร้อมรายงาน TLS-RPT

ตั้งค่า MTA-STS ให้โดเมนบังคับผู้ส่งส่งอีเมลผ่าน TLS ที่ใบรับรองถูกต้อง สร้างไฟล์นโยบาย ระเบียน _mta-sts และ TLS-RPT แล้วเปลี่ยนจาก testing เป็น enforce

โดย ทีมงาน THAI DATA CLOUD อัปเดต อ่าน 10 นาที

แชร์FacebookXLINELinkedIn
MTA-STS — MTA-STS: บังคับ TLS ให้อีเมลขาเข้า พร้อมรายงาน TLS-RPT
MTA-STS: บังคับ TLS ให้อีเมลขาเข้า พร้อมรายงาน TLS-RPT

คำตอบสั้น ๆ: ตั้งค่า MTA-STS ให้โดเมนบังคับผู้ส่งส่งอีเมลผ่าน TLS ที่ใบรับรองถูกต้อง สร้างไฟล์นโยบาย ระเบียน _mta-sts และ TLS-RPT แล้วเปลี่ยนจาก testing เป็น enforce

คู่มือนี้อธิบาย MTA-STS ทีละขั้นตอน พร้อมคำสั่งที่ใช้ได้จริงและปัญหาที่พบบ่อย

MTA-STS (SMTP MTA Strict Transport Security ตาม RFC 8461) คือกลไกที่ให้โดเมนประกาศต่อเซิร์ฟเวอร์ผู้ส่งว่า อีเมลที่ส่งมาหาโดเมนนี้ต้องส่งผ่าน TLS ไปยัง MX ที่มีชื่อตรงกับนโยบายและมีใบรับรองที่ถูกต้องเท่านั้น ปกติ SMTP ใช้ STARTTLS แบบ "ถ้าได้ก็ดี" ผู้โจมตีที่อยู่กลางทางจึงตัด STARTTLS ทิ้งแล้วอ่านอีเมลแบบข้อความธรรมดาได้ MTA-STS ปิดช่องนี้

คู่มือนี้เหมาะกับผู้ดูแลโดเมนและระบบอีเมลขององค์กร ไม่ว่าจะใช้เมลเซิร์ฟเวอร์ของตัวเอง Microsoft 365 หรือ Google Workspace เมื่อทำครบ คุณจะมีไฟล์นโยบายที่เผยแพร่ผ่าน HTTPS ระเบียน _mta-sts และ _smtp._tls ใน DNS รายงาน TLS-RPT รายวัน และแผนเปลี่ยนจากโหมด testing เป็น enforce อย่างปลอดภัย

แผนภาพผู้ส่งอีเมลอ่านระเบียน _mta-sts ดึงไฟล์นโยบาย MTA-STS ผ่าน HTTPS แล้วส่งอีเมลด้วย TLS ไปยัง MX และส่งรายงาน TLS-RPT
ผู้ส่งดึงนโยบายผ่าน HTTPS แล้วยอมส่งเฉพาะ MX ที่อยู่ในรายการและผ่าน TLS ส่วนผลรายวันส่งไปที่ rua

สิ่งที่ต้องเตรียม

  • สิทธิ์แก้ DNS ของโดเมน (วิธีตรวจผลดู ตรวจสอบ DNS ด้วย nslookup และ dig)
  • เว็บเซิร์ฟเวอร์ที่ให้บริการ HTTPS สำหรับชื่อ mta-sts.example.com ได้ พร้อมใบรับรองจาก CA สาธารณะ เช่น Let's Encrypt
  • รายชื่อ MX ทั้งหมดของโดเมน และทุก MX ต้องรองรับ STARTTLS ด้วยใบรับรองที่ตรงกับชื่อโฮสต์ ไม่หมดอายุ และไม่ใช่ self-signed
  • กล่องอีเมลรับรายงาน เช่น [email protected]
  • ตั้ง SPF, DKIM และ DMARC ไว้แล้ว (MTA-STS ไม่ได้แทนกัน ทำงานคนละด้าน)

กลไกนี้ปกป้องอีเมลขาเข้าของโดเมนคุณ ส่วนอีเมลขาออกจะได้รับการปกป้องเมื่อโดเมนปลายทางตั้งนโยบายไว้และเซิร์ฟเวอร์ผู้ส่งของคุณรองรับการตรวจนโยบาย

ขั้นตอนที่ 1: ตรวจ MX และใบรับรองของทุก MX

ดูรายชื่อ MX แล้วทดสอบ STARTTLS ของแต่ละตัวจากเซิร์ฟเวอร์ที่ออกพอร์ต 25 ได้ (อินเทอร์เน็ตบ้านมักบล็อกพอร์ต 25) ผลต้องแสดงชื่อในใบรับรองตรงกับชื่อ MX และ Verification: OK

dig +short MX example.com
openssl s_client -starttls smtp -connect mail.example.com:25 -verify_hostname mail.example.com -brief </dev/null

ถ้าใช้บริการอีเมลสำเร็จรูป ให้จดชื่อ MX ตามที่ผู้ให้บริการกำหนด เช่น Microsoft 365 ใช้ชื่อลงท้าย mail.protection.outlook.com ซึ่งเขียนในนโยบายเป็น *.mail.protection.outlook.com ได้ ผู้ให้บริการเหล่านี้ดูแลใบรับรองฝั่ง MX ให้แล้ว

ขั้นตอนที่ 2: เขียนไฟล์นโยบายในโหมด testing

สร้างไฟล์ข้อความชื่อ mta-sts.txt โหมด testing หมายถึงผู้ส่งยังส่งอีเมลตามปกติแม้ TLS ไม่ผ่าน แต่จะรายงานปัญหาผ่าน TLS-RPT จึงเป็นจุดเริ่มที่ปลอดภัย

version: STSv1
mode: testing
mx: mail.example.com
mx: backup-mx.example.com
max_age: 86400
  • mx: ใส่ทุก MX บรรทัดละหนึ่งชื่อ ใช้ *. แทนหนึ่งระดับซับโดเมนได้ MX ที่ไม่อยู่ในรายการจะถูกมองว่าไม่ผ่านเมื่อเป็น enforce
  • max_age: เวลาที่ผู้ส่งจำนโยบายไว้ หน่วยวินาที สูงสุด 31557600 (ประมาณ 1 ปี) ช่วงทดสอบใช้ 86400 (1 วัน)

ขั้นตอนที่ 3: เผยแพร่ไฟล์ผ่าน HTTPS

สร้างระเบียน A ของ mta-sts.example.com ชี้ไปยังเว็บเซิร์ฟเวอร์ เช่น 203.0.113.10 ออกใบรับรองให้ชื่อนี้ แล้ววางไฟล์ให้เปิดได้ที่ https://mta-sts.example.com/.well-known/mta-sts.txt ตัวอย่างสำหรับ Nginx

server {
    listen 443 ssl;
    server_name mta-sts.example.com;
    ssl_certificate     /etc/letsencrypt/live/mta-sts.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/mta-sts.example.com/privkey.pem;
    location = /.well-known/mta-sts.txt {
        root /var/www/sts-policy;
        default_type text/plain;
    }
}

ไฟล์ต้องตอบ HTTP 200 โดยตรง ผู้ส่งจะไม่ตาม redirect ดังนั้นห้ามมีกฎบังคับเปลี่ยนเส้นทางไปหน้าอื่น และใบรับรองต้องถูกต้องเสมอ ถ้าใบรับรองของ mta-sts หมดอายุ ผู้ส่งจะดึงนโยบายใหม่ไม่ได้

หน้าจอเทอร์มินัลตรวจระเบียน _mta-sts, ไฟล์นโยบาย MTA-STS ผ่าน curl, ระเบียน TLS-RPT และ STARTTLS ของ MX
ไฟล์ต้องตอบ 200 แบบ text/plain และ MX ต้องผ่านการตรวจใบรับรอง

ขั้นตอนที่ 4: เพิ่มระเบียน _mta-sts ใน DNS

เพิ่มระเบียน TXT ที่ชื่อ _mta-sts.example.com ค่า v=STSv1; id=20261021T090000 ค่า id เป็นตัวอักษรหรือตัวเลข 1–32 ตัว ใช้วันเวลาจะจำง่าย ผู้ส่งดูค่านี้เพื่อรู้ว่านโยบายเปลี่ยนหรือไม่ ทุกครั้งที่แก้ไฟล์นโยบายต้องเปลี่ยน id ไม่เช่นนั้นผู้ส่งจะใช้นโยบายเดิมที่จำไว้ต่อจนครบ max_age

ขั้นตอนที่ 5: เปิดรายงาน TLS-RPT

เพิ่มระเบียน TXT ที่ชื่อ _smtp._tls.example.com ค่า v=TLSRPTv1; rua=mailto:[email protected] ตาม RFC 8460 ผู้ให้บริการอีเมลรายใหญ่จะส่งรายงานรายวันเป็นไฟล์ JSON บีบอัด สรุปจำนวนการเชื่อมต่อที่สำเร็จและล้มเหลว พร้อมประเภทความผิดพลาด

"summary": {
  "total-successful-session-count": 1520,
  "total-failure-session-count": 3
},
"failure-details": [
  { "result-type": "certificate-host-mismatch",
    "receiving-mx-hostname": "backup-mx.example.com",
    "failed-session-count": 3 }
]
ลำดับการเปิดใช้ MTA-STS จากโหมด testing อ่านรายงาน TLS-RPT แก้ปัญหา แล้วเปลี่ยนเป็น enforce พร้อมเปลี่ยน id
อย่าข้ามช่วง testing และเปลี่ยน id ทุกครั้งที่แก้ไฟล์นโยบาย

ขั้นตอนที่ 6: อ่านรายงานช่วง testing แล้วแก้ให้หมด

ปล่อยโหมด testing ไว้อย่างน้อย 1–2 สัปดาห์ แล้วไล่ดู result-type ในรายงาน ค่าที่พบบ่อยคือ certificate-host-mismatch (ชื่อในใบรับรองไม่ตรง MX), certificate-expired, certificate-not-trusted (self-signed หรือ chain ไม่ครบ), starttls-not-supported และ sts-policy-fetch-error (ดึงไฟล์นโยบายไม่ได้) แก้ทีละรายการจนรายงานเหลือแต่การเชื่อมต่อที่สำเร็จ

ขั้นตอนที่ 7: เปลี่ยน MTA-STS เป็น enforce

แก้ไฟล์นโยบายเป็น mode: enforce และเพิ่ม max_age เป็น 604800 (7 วัน) ก่อน เมื่อมั่นใจจึงขยายเป็นหลายสัปดาห์ จากนั้นเปลี่ยน id ในระเบียน _mta-sts ทันที ตั้งแต่นี้ผู้ส่งที่รองรับมาตรฐานนี้จะไม่ส่งอีเมลถ้า TLS ไม่ผ่าน อีเมลจะค้างคิวที่ผู้ส่งและตีกลับเมื่อหมดเวลาลองใหม่

คำเตือนเมื่อย้ายระบบอีเมล: ถ้าจะเปลี่ยน MX ให้เพิ่มชื่อ MX ใหม่ในนโยบายและเปลี่ยน id ก่อนแก้ระเบียน MX แล้วรอให้ครบ max_age จึงลบชื่อเก่าออก ถ้าย้ายกะทันหัน ผู้ส่งที่จำนโยบายเก่าไว้จะปฏิเสธ MX ใหม่

รายการตรวจสอบก่อนเปลี่ยน MTA-STS เป็น enforce เช่น MX ครบในนโยบาย ใบรับรองถูกต้อง และรายงานไม่มีความล้มเหลว
ทุกข้อต้องผ่านก่อนเปลี่ยนโหมด มิฉะนั้นอีเมลจากผู้ส่งบางรายจะค้างหรือตีกลับ

ปัญหาที่พบบ่อยเกี่ยวกับ MTA-STS

ตั้ง MTA-STS แบบ enforce แล้วอีเมลจะหายหรือไม่?

อีเมลไม่หายทันที แต่ผู้ส่งจะไม่ส่งถ้า TLS ไปยัง MX ไม่ผ่านตามนโยบาย อีเมลจะค้างในคิวและตีกลับหาผู้ส่งเมื่อหมดเวลา จึงต้องผ่านโหมด testing และอ่านรายงาน TLS-RPT ให้เรียบร้อยก่อนเปลี่ยนเป็น enforce

แก้ไฟล์นโยบายแล้ว ทำไมผู้ส่งยังใช้ค่าเดิม?

เกือบทุกครั้งเป็นเพราะลืมเปลี่ยน id ในระเบียน _mta-sts ผู้ส่งเก็บนโยบายไว้ตาม max_age และดึงใหม่เมื่อเห็น id เปลี่ยน ให้เปลี่ยน id แล้วตรวจด้วย dig +short TXT _mta-sts.example.com ว่าค่าใหม่กระจายแล้ว

MTA-STS ต่างจาก DANE อย่างไร ต้องเลือกอย่างใดอย่างหนึ่งไหม?

DANE ยืนยันใบรับรองของ MX ผ่านระเบียน TLSA ที่ต้องเปิด DNSSEC ส่วนวิธีในคู่มือนี้ใช้ HTTPS และใบรับรองจาก CA สาธารณะ จึงตั้งง่ายกว่าเมื่อโดเมนยังไม่มี DNSSEC ทั้งสองใช้ร่วมกันได้ และผู้ส่งบางรายรองรับเพียงแบบเดียว

MX ใช้ใบรับรอง self-signed ได้หรือไม่?

ไม่ได้ ผู้ส่งตรวจใบรับรองของ MX แบบเดียวกับเว็บ คือต้องออกโดย CA ที่เชื่อถือได้ ชื่อตรงกับ MX และไม่หมดอายุ ถ้ายังใช้ self-signed ให้เปลี่ยนเป็นใบรับรองสาธารณะก่อนตั้งนโยบาย

ถ้าต้องการให้ช่วยตั้ง MTA-STS และ TLS-RPT ให้โดเมนขององค์กร หรือย้ายไปใช้ Cloud Mail Server ที่ดูแลใบรับรองให้ ติดต่อทีมงาน THAI DATA CLOUD อ่านข้อกำหนดฉบับเต็มได้ที่ RFC 8461 (MTA-STS) และ RFC 8460 (TLS-RPT)

อ่านเพิ่มเติมเกี่ยวกับ MTA-STS

แชร์FacebookXLINELinkedIn

มีคำถามเรื่องบริการ? ติดต่อทีมงาน