如何替 sendmail 加入 SPF, DKIM, DMARC 來提升信件可靠度?

如何替 sendmail 加入 SPF, DKIM, DMARC 來提升信件可靠度? 已關閉迴響。 /

電子郵件因為容易假冒、濫發,長久以來造成人們對 email 的不信件感,現在的系統會透過 SPF, DKIM, DMARC 等附件的技術來作認證,提升郵件的可信度。

什麼是SPF?

SPF, Sender Policy Framework, 也就是發信政策架構,他的作法是利用網域所有人的 DNS 控制權來作判斷。

例如,本網站的域名是 qna.tw,那我就可以利用 DNS 來宣告這個域名的信件只會從那些主機或IP寄出,如果不在宣告範圍內的,就可能是假的。

宣告完成後,當任何一個郵件主機收到署名是 qna.tw 的信,他們會先查 qna.tw 的 DNS 記錄有沒有宣告 SPF,再看裡面註明的主機範圍是否相符,然後作出判斷。

設定範例:IN TXT "v=spf1 +a +mx include:_spf.google.com ip4:61.216.156.127/26 ip4:112.121.100.224/27 ~all"
意即,除了從 google, 辦公室主機 或機房主機外,一概不在宣告範圍內。

什麼是 DKIM?

DKIM, DomainKeys Identified Mail, 這是寄件主機在發信前對郵件內容的驗證,主要用來確認郵件沒被動手腳。

安裝:

  1. 在 FreeBSD Ports 裡安裝 /usr/ports/mail/opendkim/
    cd /usr/ports/mail/opendkim/
    make clean install
  2. 透過 webmin 將 opendkim 加入 sendmail (偷懶招,省得還要打一堆指令)
    在 webmin 的 Sendmail 伺服器頁面中選 Sendmail M4 Configuration, 然後從頁末的 Add new entry of type 功能,加入
    INPUT_MAIL_FILTER(`opendkim', `S=inet:8891@localhost, F=T, T=R:2m')
    然後編譯設定檔,然後套用。
  3. 設定 opendkim.conf
    cd /usr/local/etc/mail/
    vi opendkim.conf
    輸入
    Socket inet:8891@localhost
    KeyTable refile:/var/db/dkim/KeyTable
    SigningTable refile:/var/db/dkim/SigningTable
    Syslog yes
    UserID smmsp
    Mode sv
    SubDomains yes
    Canonicalization relaxed/relaxed
    DNSTimeout 10
    SignatureAlgorithm rsa-sha256
    X-Header yes
    Logwhy yes
  4. 建立相關認證檔
    產生 qna.tw 的認證檔,指令 opendkim-genkey -r -d qna.tw
    然後 mv default.txt /var/db/dkim/qna.tw.dns   (這就是 dns 要設定的公鑰)
    然後 mv default.private /var/db/dkim/qna.tw.key  (這是主機上作加密的私鑰)
    再把 KeyTable 和 SigningTable 打好 (這其實就是對應設定的概念)
  5. KeyTable
    default._domainkey.qna.tw qna.tw:default:/var/db/dkim/qna.tw.key
    default._domainkey.www.qna.tw www.qna.tw:default:/var/db/dkim/qna.tw.key
  6. SigningTable
    *@qna.tw default._domainkey.qna.tw
    *@www.qna.tw default._domainkey.qna.tw
  7. 在 DNS 中加入 DKIM 的公鑰 (其實就是 qna.tw.dns 的內容)
    default._domainkey IN TXT ( "v=DKIM1; k=rsa; s=email; "
    "p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDQ3b54IIqYz7geWJcfSLB1oZrxMB2+MR2PSpP2PZyRPZEEUKwGVCARnefyCVRO5LmlIyhi/dJnbkYnL/xz37OTQrbMEL9CEqpc0/jqS+XstYWYWQHkqK/SbsusAuDpjc7FniT+tEIqUpYks1D/MCz5IdaSgOZXLPOYPK+dlzA8OQIDAQAB" ) ; ----- DKIM key default for qna.tw
  8. 都設定好了之後,就可以啟用 opendkim
    /usr/local/etc/rc.d/milteropendkim start
  9. 然後 DNS 和 sendmail 都要重新啟動,之後寄信出去時就都會附加 DKIM 的認證檔頭讓收件主機作驗證了。

什麼是 DMARC?

DMARC, Domain Message Authentication Reporting & Conformance, 意思就是當有人假冒你公司的名義發信時,你希望的統一處理回報方式,這往往可以顯示一個企業是否注意自己的名聲和有沒有具體作為。

因此,DMARC 這是必須先有 SPF 和(或) DKIM 後才能作的機制。也就是,當 SPF 或 DKIM 的機制找到異常使用時,透過 DMARC 的宣告來作對應的處理。

例如 _dmarc IN TXT "v=DMARC1; p=none; adkim=s; aspf=r; rua=mailto:charlie@qna.tw"

標記名稱 是否必要 用途 範例

v

必要 通訊協定版本 v=DMARC1

p

必要 網域政策 p=quarantine

pct

選用 需篩選的郵件百分比 pct=20

rua

選用 回報彙整報告的 URI rua=mailto:aggrep@example.com

sp

選用 網域的子網域政策 sp=reject

aspf

選用 SPF 校正模式 aspf=r

以這個範例來說,因為 qna.tw 並不以 email 為主要通訊,所以有異常是不作回報的。

安裝時,一樣到 FreeBSD ports /usr/ports/mail/opendmarc 去 make clean install

然後,一樣用 sendmail M4 Configuration 加入這個機制 INPUT_MAIL_FILTER(`opendmarc', `S=inet:8893@localhost')

然後設定 /usr/local/etc/mail/opendmarc.conf

寫入
PidFile /var/run/opendmarc.pid
RejectFailures false
Syslog true
SyslogFacility mail
TrustedAuthservIDs mail.domain.com
IgnoreHosts /var/db/opendmarc/ignore.hosts
UMask 002
UserID mailnull:mailnull
Socket inet:8893@localhost
FailureReportsSentBy charlie@qna.tw
FailureReportsBcc charlie@qna.tw
FailureReports false
AutoRestart true
PublicSuffixList /var/db/opendmarc/effective_tld_names.dat
HistoryFile /var/log/opendmarc.log

最後啟動 /usr/local/etc/rc.d/opendmarc start

然後在 DNS 裡加入 _dmarc IN TXT "v=DMARC1; p=none; adkim=s; aspf=r; rua=mailto:charlie@qna.tw"

重新啟動 DNS 和 sendmail 之後,以後寄出的信件檔頭就會有 DMARC 的宣告內容和自動採取對應的作法了。

收件者收到的郵件就會呈現 SPF, DKIM, DMARC 都是 PASS 的狀態,這樣的郵件對各收件主機來說的可信度最高。

 

 

 

 

[解決] sendmail 錯誤訊息 5.3.0 unknown mailer error 139

No Comments /

某日在作一些主機昇級動作之後,sendmail 出現 5.3.0 unknown mailer error 139 的訊息,造成極大困擾。

因為筆者有把 gmail 信箱裡特定信件自動轉寄到公司郵件主機備份的設定,而這個錯誤會造成不正常的退件。不只是 gmail, 只要任何寄信到公司郵件主機的人,都會收到退件。

一開始,從字面上的訊息,以為是 mail.local 這支程式出現異常。因為連 sendmail 官方網頁都說這訊息是 mail.local 在異常時回傳的錯誤代碼。 More

sendmail .forward 設定細節

No Comments /

為了有效控制郵件的傳送,sendmail 提供了 .forward 和 aliases 的設定方式,兩者各有優缺點。
這裡把 .forward 的使用方式作個筆記

~/.forward 內容範例
More