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
- Chạy
testingvớimax_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. - Chỉ khi báo cáo sạch mới đổi
mode: enforce, tăngmax_agelên 604800 (một tuần) hoặc hơn, và đổiidtrong bản ghi TXT. - Giữ chứng chỉ của
mta-sts.example.vnvà 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ủ.