Mail P4: Thiết lập SPF & DKIM với Postfix trên Debian

Bản ghi SPF và DKIM là gì?

SPF và DKIM là hai loại bản ghi TXT trong DNS cho phép bạn phát hiện hành vi giả mạo email và giúp các email hợp pháp được gửi vào hộp thư đến của người nhận thay vì thư mục thư rác. thư mục thư rác của người nhận nếu họ không thêm bạn vào sổ địa chỉ.

Bản ghi SPF (Khung chính sách người gửi) chỉ định máy chủ hoặc địa chỉ IP nào được phép gửi email thay mặt cho miền. Bạn chỉ nên cho phép máy chủ email của riêng bạn hoặc máy chủ của ISP gửi email cho miền của bạn.

DKIM (Thư được xác định bằng khóa miền) sử dụng khóa riêng để thêm chữ ký vào email được gửi từ miền của bạn. Máy chủ SMTP nhận sẽ xác minh chữ ký bằng cách sử dụng khóa chung tương ứng, được xuất bản trong vùng DNS của miền của bạn.

Tạo SPF Record trên DNS

Trên giao diện quản lý DNS, tạo mới record TXT như sau.

Record Type   Name    Value
TXT           @       v=spf1 mx ~all
  • TXT cho biết đay là bản ghi TXT record.
  • Nhập @ vào trường tên để thể hiện miền apex (z-log.net).
  • v=spf1 cho biết đây là bản ghi SPF và phiên bản bản ghi SPF là SPF1.
  • mx có nghĩa là tất cả các máy chủ được liệt kê trong bản ghi MX đều được phép gửi email cho miền của bạn và tất cả các máy chủ khác đều không được phép.
  • ~all chỉ ra rằng email từ miền của bạn chỉ được đến từ các máy chủ được chỉ định trong bản ghi SPF. Email từ các máy chủ khác sẽ bị gắn cờ là không đáng tin cậy. Các lựa chọn thay thế có thể là +all, -all, ?all, nhưng chúng hiếm khi được sử dụng.

-all có nghĩa là các email được gửi từ các máy chủ không được phép sẽ bị từ chối, không bao giờ rơi vào hộp thư đến hoặc thư mục thư rác của người nhận. Tôi đã thấy nó được facebook.com sử dụng, nhưng nhìn chung chúng tôi không cần một chính sách nghiêm ngặt như vậy.

Một số người có thể nghĩ rằng -all sẽ tốt hơn vì nó sẽ từ chối email từ các máy chủ không đáng tin cậy. Chà, sử dụng -all trong chính sách SPF của bạn có thể khiến email của chính bạn bị từ chối khi người nhận có hai máy chủ SMTP và khi máy chủ SMTP chính ngừng hoạt động ngoại tuyến, email của bạn sẽ được lưu trữ tạm thời trên máy chủ SMTP dự phòng. Khi máy chủ SMTP chính trực tuyến trở lại, email sẽ được chuyển tiếp từ máy chủ SMTP dự phòng đến máy chủ SMTP chính. Vì bạn không liệt kê máy chủ SMTP dự phòng của người nhận trong bản ghi SPF của bạn, email sẽ bị máy chủ SMTP chính của người nhận từ chối. Vì vậy, bạn nên sử dụng ~all trong chính sách SPF của mình..

Bạn cũng có thể liệt kê một địa chỉ IP cụ thể trong bản ghi SPF của mình.

TXT    @     v=spf1 mx ip4:12.34.56.78 ~all

Lưu ý rằng một số trình quản lý DNS yêu cầu bạn bọc bản ghi SPF bằng dấu ngoặc kép như bên dưới.

Để kiểm tra xem bản ghi SPF của bạn có được phổ biến ra Internet công cộng hay không, bạn có thể sử dụng tiện ích dig trên Linux box như bên dưới (Trên Debian, bạn cần cài đặt gói bind9-dnsutils để sử dụng lệnh dig: sudo apt install bind9 -dnsutils).

dig z-log.net txt

Cũng có thể sử dụng công cụ khảo sát dmarcian.com để kiểm tra cú pháp bản ghi SPF của mình.

Cấu hình SPF Policy Agent trên Debian Server

Cần yêu cầu máy chủ Postfix SMTP của mình kiểm tra bản ghi SPF cho các email đến. Điều này không giúp gửi email đi nhưng sẽ giúp phát hiện các email đến giả mạo.

sudo apt install postfix-policyd-spf-python

Sau đó chỉnh sửa tệp cấu hình quy trình chính Postfix.

sudo nano /etc/postfix/master.cf

Thêm các dòng sau vào cuối tệp để thông báo cho Postfix khởi động trình nền chính sách SPF khi nó tự khởi động.

policyd-spf  unix  -       n       n       -       0       spawn
    user=policyd-spf argv=/usr/bin/policyd-spf

Lưu và đóng tập tin.Tiếp theo, chỉnh sửa tập tin cấu hình chính của Postfix.

sudo nano /etc/postfix/main.cf

Thêm các dòng sau vào cuối tệp. Dòng đầu tiên chỉ định cài đặt thời gian chờ của tác nhân chính sách Postfix. Các dòng sau sẽ áp đặt hạn chế đối với các email đến bằng cách từ chối email trái phép và kiểm tra bản ghi SPF.

policyd-spf_time_limit = 3600
smtpd_recipient_restrictions =
   permit_mynetworks,
   permit_sasl_authenticated,
   reject_unauth_destination,
   check_policy_service unix:private/policyd-spf

Lưu và đóng tệp, sau đó khởi động lại Postfix.

sudo systemctl restart postfix

Lần tới, khi bạn nhận được email từ miền có bản ghi SPF, bạn có thể xem kết quả kiểm tra SPF trong tiêu đề raw email. Tiêu đề sau cho biết người gửi đã gửi email từ máy chủ được ủy quyền.

Received-SPF: Pass (sender SPF authorized).

Thiết lập DKIM trên máy chủ Debian

Cài đặt OpenDKIM để triển khai mã nguồn mở của hệ thống xác thực người gửi DKIM.

sudo apt install opendkim opendkim-tools

Sau đó thêm người dùng postfix vào nhóm opendkim.

sudo gpasswd -a postfix opendkim

Sửa tệp cấu hình chính OpenDKIM.

sudo nano /etc/opendkim.conf

Bỏ ghi chú các dòng sau.

Canonicalization   relaxed/simple
Mode               sv
SubDomains         no

Tìm dòng sau.

#Nameservers   127.0.0.1

Đổi thành.

Nameservers     8.8.8.8,1.1.1.1

Điều này yêu cầu OpenDKIM sử dụng 8.8.8.8 và 1.1.1.1 để truy vấn các bản ghi DNS. Bạn nên sử dụng nhiều máy chủ định danh. Nếu một máy chủ bị lỗi thì máy chủ còn lại vẫn có thể trả lời các truy vấn DNS. Hãy phân tách từng địa chỉ IP bằng dấu phẩy.

Tiếp theo, thêm các dòng sau vào cuối tập tin này.

# Map domains in From addresses to keys used to sign messages
KeyTable           refile:/etc/opendkim/key.table
SigningTable       refile:/etc/opendkim/signing.table

# Hosts to ignore when verifying signatures
ExternalIgnoreList  /etc/opendkim/trusted.hosts

# A set of internal hosts whose mail should be signed
InternalHosts       /etc/opendkim/trusted.hosts

Lưu và đóng file.

Tạo Signing Table, Key Table, and Trusted Hosts File

Tạo cấu trúc thư mục cho OpenDKIM.

sudo mkdir -p /etc/opendkim/keys

Thay đổi chủ sở hữu từ root thành opendkim và đảm bảo chỉ người dùng opendkim mới có thể đọc và ghi vào thư mục khóa.

sudo chown -R opendkim:opendkim /etc/opendkim
sudo chmod go-rw /etc/opendkim/keys

Tạo signing table.

sudo nano /etc/opendkim/signing.table

Thêm dòng sau vào tệp. Dòng này cho OpenDKIM biết rằng nếu người gửi trên máy chủ của bạn đang sử dụng địa chỉ @z-log.net thì dòng này phải được ký bằng khóa riêng được xác định theo default._domainkey.z-log.net. dòng này cho biết rằng tên miền phụ của bạn cũng sẽ được ký bằng khóa riêng.

*@z-log.net      default._domainkey.z-log.net
*@*.z-log.net    default._domainkey.z-log.net

Lưu và đóng file. Sau đó tạo key table.

sudo nano /etc/opendkim/key.table

Thêm dòng sau, để cho biết vị trí private key.

default._domainkey.z-log.net     z-log.net:default:/etc/opendkim/keys/z-log.net/default.private

Lưu và đóng file. Tiếp theo, tạo file trusted hosts.

sudo nano /etc/opendkim/trusted.hosts

Thêm các dòng sau vào tệp mới tạo. Điều này cho OpenDKIM biết rằng nếu một email đến từ localhost hoặc từ cùng một tên miền thì OpenDKIM sẽ ký vào email nhưng sẽ không thực hiện xác minh DKIM trên email.

127.0.0.1
localhost

.z-log.net

Lưu và đóng file.

Lưu ý: Bạn không nên thêm dấu hoa thị vào tên miền như sau: *.example.com mà chỉ nên có dấu chấm trước tên miền.

Tạo Private/Public Keypair

Tạo hai khóa:

  • private key khóa riêng để ký các email gửi đi.
  • public key để nhận máy chủ SMTP nhằm xác minh chữ ký DKIM. Khóa này sẽ được xuất bản trong vùng DNS của bạn để máy chủ SMTP nhận có thể tìm thấy nó.

Tạo một thư mục riêng cho tên miền.

sudo mkdir /etc/opendkim/keys/z-log.net

Tạo keys sử dụng opendkim-genkey tool.

sudo opendkim-genkey -b 2048 -d z-log.net -D /etc/opendkim/keys/z-log.net -s default -v

Lệnh trên sẽ tạo các khóa 2048 bit. -d (domain) chỉ định tên miền. -D (directory) chỉ định thư mục nơi các khóa sẽ được lưu trữ và chúng tôi sử dụng mặc định làm bộ chọn (-s), còn được gọi là name. Sau khi lệnh được thực thi, khóa riêng sẽ được ghi vào tệp default.private và khóa chung sẽ được ghi vào tệp default.txt.

Đặt opendkim làm chủ sở hữu của khóa riêng.

sudo chown opendkim:opendkim /etc/opendkim/keys/z-log.net/default.private

Và thay đổi quyền để chỉ người dùng opendkim mới có quyền truy cập đọc và ghi vào tệp.

sudo chmod 600 /etc/opendkim/keys/z-log.net/default.private

Publish Your Public Key trên DNS Records

Hiển thị khóa công khai.

sudo cat /etc/opendkim/keys/z-log.net/default.txt

The string sau tham số p parameter là public key.

Trong trình quản lý DNS của bạn, tạo bản ghi TXT, nhập default._domainkey vào trường tên. Sau đó quay lại cửa sổ terminal, sao chép mọi thứ trong dấu ngoặc đơn và dán vào trường giá trị của bản ghi DNS. Bạn cần xóa tất cả double dấu ngoặc kép và khoảng trắng trong trường giá trị. Nếu bạn không xóa chúng thì bài kiểm tra khóa ở bước tiếp theo có thể sẽ thất bại.

Kiểm tra DKIM Key

Nhập lệnh sau trên máy chủ Debian để kiểm tra khóa của bạn.

sudo opendkim-testkey -d z-log.net -s default -vvv
opendkim-testkey: using default configfile /etc/opendkim.conf
opendkim-testkey: checking key 'default._domainkey.z-log.net'
opendkim-testkey: key secure
opendkim-testkey: key OK

Bạn có thể truy cập https://www.dmarcanalyzer.com/dkim/dkim-check/, nhập default làm bộ chọn và nhập tên miền của bạn để kiểm tra việc truyền bá bản ghi DKIM.

Nếu bạn thấy Khóa không an toàn trong đầu ra lệnh, đừng hoảng sợ. Điều này là do DNSSEC chưa được bật trên tên miền của bạn. DNSSEC là một tiêu chuẩn bảo mật cho truy vấn DNS an toàn. Hầu hết các tên miền chưa bật DNSSEC. Hoàn toàn có không cần lo lắng về việc Key không an toàn. Bạn có thể tiếp tục làm theo hướng dẫn này.

Nếu thấy lỗi query timed out nghĩa là server của bạn có vấn đề về độ phân giải DNS. Bạn có thể chạy lại lệnh trên xem có hoạt động không. Nếu vẫn không được thì bạn có thể comment dòng sau trong /etc/opendkim.conf và khởi động lại opendkim.service.

TrustAnchorFile /usr/share/dns/root.key

Kết nối Postfix tới OpenDKIM

Postfix có thể giao tiếp với OpenDKIM thông qua một tệp socket Unix. Tệp socket mặc định được OpenDKIM sử dụng là /run/opendkim/opendkim.sock, như được hiển thị trong tệp /etc/opendkim.conf file. Nhưng postfix SMTP daemon shipped with Debian runs in a chroot jail, có nghĩa là daemon SMTP phân giải tất cả các tên tệp liên quan đến thư mục hàng đợi Postfix (/var/spool/postfix). Vì vậy, chúng ta cần thay đổi tệp socket OpenDKIM Unix.

Tạo thư mục để chứa tệp OpenDKIM socket file và chỉ cho phép người dùng opendkim và nhóm postfix truy cập vào nó.

sudo mkdir /var/spool/postfix/opendkim

sudo chown opendkim:postfix /var/spool/postfix/opendkim

Sau đó chỉnh sửa tệp cấu hình chính OpenDKIM.

sudo nano /etc/opendkim.conf

Tìm dòng sau.

Socket local:/run/opendkim/opendkim.sock

Thay thế nó bằng dòng sau.

Socket local:/var/spool/postfix/opendkim/opendkim.sock

Tìm dòng sau

SOCKET=local:$RUNDIR/opendkim.sock

Đổi thành

SOCKET="local:/var/spool/postfix/opendkim/opendkim.sock"

Lưu và đóng file.

Tiếp theo, chúng ta cần chỉnh sửa tệp cấu hình chính Postfix.

sudo nano /etc/postfix/main.cf

Thêm các dòng sau vào cuối tệp này để Postfix có thể gọi OpenDKIM thông qua giao thức milter.

# Milter configuration
milter_default_action = accept
milter_protocol = 6
smtpd_milters = local:opendkim/opendkim.sock
non_smtpd_milters = $smtpd_milters

Lưu và đóng tệp, sau đó khởi động lại dịch vụ opendkim và postfix.

sudo systemctl restart opendkim postfix

Kiểm tra SPF và DKIM

Giờ đây, bạn có thể gửi email kiểm tra từ máy chủ thư đến tài khoản Gmail của mình để xem liệu kiểm tra SPF và DKIM có vượt qua hay không. Ở bên phải của thư email đã mở trong Gmail, nếu bạn nhấp vào nút hiển thị bản gốc từ menu thả xuống , bạn có thể xem kết quả xác thực.

Nếu thư của bạn chưa được ký và kiểm tra DKIM không thành công, bạn có thể kiểm tra nhật ký postfix (/var/log/mail.log) để xem cấu hình của bạn có vấn đề gì. Nếu bạn thấy thông báo sau trong nhật ký thư,

warning: connect to Milter service local:opendkim/opendkim.sock: No such file or directory

bạn có thể muốn kiểm tra xem dịch vụ opendkim systemd có thực sự đang chạy hay không.

sudo systemctl status opendkim

Nếu opendkim đang chạy và bạn vẫn thấy lỗi trên, bạn có thể cần chỉnh sửa tệp /etc/postfix/main.cf, thay đổi

smtpd_milters = local:opendkim/opendkim.sock

Thành

smtpd_milters = local:/opendkim/opendkim.sock

Sau đó restart Postfix.

Máy chủ email của bạn cũng sẽ thực hiện kiểm tra SPF và DKIM trên miền của người gửi. Bạn có thể xem kết quả trong tiêu đề email. Sau đây là kiểm tra SPF và DKIM trên người gửi bằng Gmail.

Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=2607:f8b0:4864:20::c2d; helo=mail-yw1-xc2d.google.com; envelope-from=someone@gmail.com; receiver=<UNKNOWN> 
Authentication-Results: email.linuxbabe.com;
	dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="XWMRd2co";
	dkim-atps=neutral

Lỗi cấu hình trong ứng dụng email

Việc ký DKIM có thể không thành công nếu bạn không sử dụng đúng cài đặt SMTP/IMAP trong ứng dụng email của mình.

Cài đặt đúng:

Giao thức SMTP: nhập mail.your-domain.com làm tên máy chủ, chọn cổng 587 và STARTTLS. Chọn mật khẩu thông thường làm phương thức xác thực.

Giao thức IMAP: nhập mail.your-domain.com làm tên máy chủ, chọn cổng 143 và STARTTLS. Chọn mật khẩu thông thường làm phương thức xác thực.

hoặc

Giao thức SMTP: nhập mail.your-domain.com làm tên máy chủ, chọn cổng 465 và SSL/TLS. Chọn mật khẩu thông thường làm phương thức xác thực.

Giao thức IMAP: nhập mail.your-domain.com làm tên máy chủ, chọn cổng 993 và SSL/TLS. Chọn mật khẩu thông thường làm phương thức xác thực.

Cài đặt sai:

Sử dụng cổng 25 làm cổng SMTP trong ứng dụng thư khách email để gửi đi.

Không có phương pháp mã hóa nào được chọn.

Cổng 25 nên được sử dụng để liên lạc giữa máy chủ SMTP với máy chủ SMTP. Vui lòng không sử dụng cổng này trong ứng dụng email của bạn để gửi email đi.

Bạn nên chọn phương thức mã hóa (STARTTLS hoặc SSL/TLS) trong ứng dụng email của mình.

Kiểm tra Email Score and Placement

Bạn cũng có thể truy cập https://www.mail-tester.com. Bạn sẽ thấy một địa chỉ email duy nhất. Gửi email từ miền của bạn đến địa chỉ này rồi kiểm tra điểm của bạn. Như bạn có thể thấy, tôi đã đạt điểm tuyệt đối.

Mail-tester.com chỉ có thể hiển thị cho bạn điểm số của người gửi. Có một dịch vụ khác tên là GlockApps cho phép bạn kiểm tra xem email của bạn có được đặt trong hộp thư đến hoặc thư mục thư rác của người nhận hay bị từ chối hoàn toàn hay không. Dịch vụ này hỗ trợ nhiều nhà cung cấp email phổ biến như Gmail, Outlook , Hotmail, YahooMail, thư iCloud, v.v.

Hộp thư Microsoft

Nếu email của bạn bị Microsoft Outlook hoặc Hotmail từ chối, bạn cần gửi biểu mẫu thông tin người gửi https://support.microsoft.com/en-us/getsupport?oaspworkflow=start_1.0.0.0&wfname=capsub&productkey=edfsmsbl3&locale=en-us&ccsid=635714983457075069, sau đó, email của bạn sẽ được Outlook/hotmail chấp nhận nhưng vẫn có thể bị gắn nhãn là thư rác.

Nguồn tham khảo: linuxbabe.com

Bình luận

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *