« Blog

MTA-STS và TLS-RPT cho người mới

MTA-STS buộc các máy chủ gửi thư tới bạn phải dùng kết nối mã hoá, TLS-RPT gửi báo cáo khi có lỗi. Bài này giải thích cách hoạt động, cách triển khai an toàn ở chế độ testing và những chỗ hay sai.

Vấn đề MTA-STS giải quyết

Khi hai máy chủ thư nói chuyện với nhau qua cổng 25, kết nối mã hoá (STARTTLS) chỉ là tuỳ chọn: máy chủ gửi hỏi "bên bạn có hỗ trợ mã hoá không?" và nếu nghe không thì gửi thư dạng thô. Kẻ đứng giữa đường truyền có thể xoá lời đáp đó (tấn công hạ cấp) hoặc giả mạo máy chủ nhận để đọc trộm thư.

MTA-STS (Mail Transfer Agent Strict Transport Security) cho phép tên miền của bạn tuyên bố: "thư gửi tới tôi phải đi qua máy chủ MX này, bằng TLS với chứng chỉ hợp lệ, nếu không thì đừng gửi". TLS-RPT bổ sung báo cáo: bên gửi báo cho bạn khi họ không kết nối TLS được tới máy chủ của bạn. Đây là việc vệ sinh cấu hình, không khẩn cấp bằng SPF, DKIM, DMARC, nhưng rẻ và nên làm khi đã ổn định các phần kia.

Ba mảnh ghép

1. Bản ghi TXT báo hiệu tại _mta-sts.example.vn:

v=STSv1; id=20261016T000000Z

id gồm 1 đến 32 chữ cái hoặc chữ số (không dấu gạch, dấu chấm hay dấu hai chấm; RFC 8461), ví dụ ngày giờ 20261016T000000Z. Bạn đổi nó mỗi khi sửa chính sách để bên gửi biết cần tải lại.

2. Tệp chính sách tại https://mta-sts.example.vn/.well-known/mta-sts.txt. Đây phải là website HTTPS thật sự, chứng chỉ do CA công khai cấp, không được chuyển hướng:

version: STSv1
mode: testing
mx: mx1.example.vn
mx: mx2.example.vn
max_age: 86400

Mỗi dòng mx: là một máy chủ nhận thư; tên phải khớp đúng các bản ghi MX hiện tại (xem bằng dig +short MX example.vn), có thể dùng ký tự thay thế dạng *.mail.example.net. mode có ba giá trị: none (tắt), testing (chỉ báo cáo, không từ chối) và enforce (từ chối thư nếu không thoả chính sách). max_age là số giây bên gửi được nhớ chính sách.

3. Bản ghi TLS-RPT tại _smtp._tls.example.vn:

v=TLSRPTv1; rua=mailto:tlsrpt@example.vn

Báo cáo là tệp JSON nén gửi mỗi ngày từ các nhà cung cấp lớn như Google hay Microsoft.

Lộ trình an toàn

  1. Chạy testing với max_age: 86400 ít nhất vài tuần, kèm TLS-RPT, rồi đọc báo cáo: nếu có lỗi chứng chỉ hoặc MX không khớp thì sửa.
  2. Chỉ khi báo cáo sạch mới đổi mode: enforce, tăng max_age lên 604800 (một tuần) hoặc hơn, và đổi id trong bản ghi TXT.
  3. Giữ chứng chỉ của mta-sts.example.vn và của các máy chủ MX luôn còn hạn. Trong chế độ enforce, chứng chỉ hết hạn nghĩa là thư tới bị trả lại. Xem bài về chứng chỉ TLS hết hạn.

Theo nền tảng

Google Workspace, Microsoft 365. Máy chủ MX do nhà cung cấp quản lý, nên danh sách mx: phải lấy đúng từ bản ghi MX họ yêu cầu bạn đặt (Microsoft 365 là *.mail.protection.outlook.com). Với Google Workspace, MX mới là smtp.google.com; MX cũ là aspmx.l.google.com và altN.aspmx.l.google.com, nên chính sách công khai của Google khai ba dòng mx: smtp.google.com, mx: aspmx.l.google.com, mx: *.aspmx.l.google.com. Ký tự * chỉ thay cho đúng một nhãn, nên *.google.com không bao phủ aspmx.l.google.com. Hãy đọc tài liệu mới nhất của họ về MTA-STS trước khi bật enforce.

Zoho Mail. MX thường là mx.zoho.com, mx2.zoho.com, mx3.zoho.com (khu vực khác dùng tên miền Zoho tương ứng như zoho.eu hay zoho.in). Liệt kê đúng các tên đó, nhưng hãy xác nhận lại bằng dig MX.

Cloudflare. Bản ghi TXT _mta-sts và _smtp._tls thêm ở DNS, Records. Để phục vụ tệp chính sách bạn có thể dùng Cloudflare Pages hoặc Workers với tên miền mta-sts.example.vn; hoặc đặt bản ghi mta-sts trỏ về hosting có sẵn.

cPanel. Tạo tên miền con mta-sts (Domains), bật AutoSSL cho nó, rồi dùng File Manager tạo thư mục .well-known (nhớ bật Show Hidden Files) trong thư mục gốc của tên miền con và đặt tệp mta-sts.txt.

DirectAdmin. Tương tự: tạo subdomain mta-sts, cấp chứng chỉ Let's Encrypt, đặt tệp ở public_html/.well-known/mta-sts.txt của subdomain.

Nginx. Một khối server riêng cho tên miền con:

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

Apache. Một VirtualHost HTTPS cho mta-sts.example.vn với DocumentRoot /var/www/mta-sts và tệp ở /var/www/mta-sts/.well-known/mta-sts.txt. Dùng ForceType text/plain cho tệp nếu máy chủ trả sai loại nội dung.

Cách tự kiểm tra

dig +short TXT _mta-sts.example.vn
curl -sS -o /dev/null -w '%{http_code} %{content_type} %{redirect_url}\n' https://mta-sts.example.vn/.well-known/mta-sts.txt
curl -s https://mta-sts.example.vn/.well-known/mta-sts.txt
dig +short TXT _smtp._tls.example.vn
dig +short MX example.vn

Lệnh curl đầu phải in 200 text/plain và để trống phần chuyển hướng (có địa chỉ sau cùng nghĩa là đang bị chuyển hướng, bên gửi sẽ không chấp nhận). Lệnh curl thứ hai in nội dung chính sách, và mọi mx: trong đó phải khớp kết quả của lệnh dig MX (kể cả ký tự *). Để kiểm tra TLS của máy chủ nhận thư:

openssl s_client -starttls smtp -connect mx1.example.vn:25 -servername mx1.example.vn -verify_hostname mx1.example.vn </dev/null

Trong kết quả tìm Verification: OK (hoặc Verify return code: 0 (ok)). Tuỳ chọn -verify_hostname là bắt buộc để kiểm tra tên: nếu thiếu nó, OpenSSL vẫn báo OK dù chứng chỉ không thuộc máy chủ đó (-servername chỉ gửi tên cho máy chủ chọn chứng chỉ). Nếu chứng chỉ của MX sai tên hay hết hạn (kết quả như Verify return code: 62 (hostname mismatch)), đừng bật enforce. Nhiều mạng gia đình chặn cổng 25 đi ra ngoài; khi đó hãy chạy lệnh từ một máy chủ.

Nguồn tham khảo

  1. RFC 8461: SMTP MTA Strict Transport Security (MTA-STS)
  2. RFC 8460: SMTP TLS Reporting
  1. DMARC: từ p=none lên quarantine và reject một cách an toàn

    · 6 phút đọc

    DMARC cho người nhận biết phải làm gì với thư mạo danh tên miền của bạn. Bài này đi từng bước: bắt đầu p=none kèm rua, đọc báo cáo, nâng lên quarantine với pct tăng dần rồi reject, và những bẫy dễ làm mất thư thật.

    #email #dmarc #dns

  2. DKIM: bật và kiểm tra chữ ký email

    · 5 phút đọc

    DKIM gắn chữ ký số vào mỗi email để người nhận biết thư đúng do tên miền của bạn gửi và không bị sửa nội dung. Bài này hướng dẫn bật DKIM trên Google Workspace, Microsoft 365, Zoho, cPanel, DirectAdmin và cách tự kiểm tra.

    #email #dkim #dns

  3. Chứng chỉ TLS hết hạn: nguyên nhân và cách phòng

    · 6 phút đọc

    Chứng chỉ hết hạn là sự cố rất phổ biến nhưng phòng được gần như hoàn toàn. Bài này liệt kê các nguyên nhân thật sự hay gặp (gia hạn tự động hỏng, quên nạp lại máy chủ, email nhắc gửi nhầm người) và cách đặt giám sát bằng openssl.

    #web #tls #https