設定 DNS 以避免網域被用於 email 欺騙攻擊

讀到 DNS settings to avoid email spoofing and phishing for unused domain ,於是把目前的網域設定了一下、發篇文章記錄一下步驟。

由於電子郵件傳輸協定(SMTP)的部分缺陷,現代的電子郵件交換機制上十分倚重 DNS 上的幾個紀錄來作為驗證; 反之當這些參數沒有被設定時,就會有可能被拿來利用——例如攻擊者假冒為特定域名發出信件,然後域名被弄進黑名單導致的問題都給網域持有人扛。

本文紀錄當一個域名沒有要進行郵件往來的時後的建議設定,若是需要收發信件的網域則建議參考郵件服務商的建議設定。

設定 MX 紀錄

MX 紀錄為 DNS 紀錄中用於告知郵件伺服器使用,因此如果某個域名本身不預期有信件往來,可以將其 MX 指向 NULL:

  • 優先級設為 0(最高)
  • 主機設為 .
$ dig tzing.tw mx
tzing.tw.               10800   IN      MX      0 .

在實務上 MX 紀錄指向的會是收件伺服器,而送件伺服器是可以不同於收件伺服器的。 雖然說沒有收信端不代表不會發信(好饒口),但至少算是某個程度上的告知這個網域想要搞自閉。

設定 SPF

承前面所說,送件伺服器是可以不同於收件伺服器的,而 Sender Policy Framework (SPF) 就是用來聲明域名本身會用哪些伺服器送信。 因此當一個域名沒有要送信時,亦可以藉由 SPF 進行發布這項訊息。

SPF 資訊是透過TXT 紀錄發布,可以對域名加上:

v=spf1 -all

其中

  • v=spf1 為 SPF 的標頭
  • -all 表示這個清單為白名單機制,請求收件方將所有不在允許清單的信件直接拒絕(或拋棄)

在標準的使用情境下會在 v=spf1-all 中間加入 IP 允許清單,而上面的表達式顧名思義就是沒有任何允許清單,並請求收件伺服器拋棄自稱來自這個網域的郵件。

設定 DKIM

DomainKeys Identified Mail (DKIM) 利用不對稱加密的性質來為郵件加上驗證,可以避免中間人攻擊,在此不贅述細節。

當一個網域沒有要送信時,也可以公告為沒有公鑰,以促使偽造信件驗證失敗。DKIM 的設定需要在子網域 *._domainkey 上設定 TXT 紀錄:

v=DKIM1; p=

舉例來說,對於我的網域(tzing.tw)就在 *._domainkey.tzing.tw 上設定了這組資訊,其中 *wildcard DNS 紀錄,即對 _domainkey.tzing.tw 下的所有子網域生效,這是因為 DKIM 內有 selector 的機制以用於發布多組公鑰用於不同服務。

參數方面,v=DKIM1; 為標頭,而 p= 原本用於公布公鑰,這裡則變成了公鑰為空字串。

設定 DMARC

DMARC (Domain-based Message Authentication, Reporting and Conformance) 除了本身也是一個郵件驗證機制,規範中也包含了當郵件不通過驗證機制時的處理手段,製造出在「要求拒絕郵件」跟「直接讓人假冒」這兩個極端點中間的緩衝區域——隨著公司規模變大,IT 人員大概會在避免公司商譽受損跟行銷信件寄不出去之間頭痛。

設定 DMARC 的方法為對子網域 _dmarc 設定 TXT 紀錄:

v=DMARC1; p=reject; sp=reject; adkim=s; aspf=s;

其中

  • v=DMARC1; 固定標頭,一樣不要動
  • p=reject; 建議拒絕來自此網域、不通過 DMARC 驗證的信件
  • sp=reject; 建議拒絕來自子網域、不通過 DMARC 驗證的信件
  • adkim=s; 建議以嚴格的(strict)模式檢查 DKIM
  • aspf=s; 建議以嚴格的模式檢查 SPF

另外 DMARC 中還有一個參數 rua 可用於請求對方將那些沒通過的信件報告給特定位址,不過在本文的情境中倒是沒有需要。

設定完成

筆者也跟著這輪檢查了下這個網域(tzing.tw):

$ dig +short tzing.tw MX
0 .
$ dig +short tzing.tw TXT
"v=spf1 -all"
$ dig +short whatever._domainkey.tzing.tw TXT
"v=DKIM1; p="
$ dig +short _dmarc.tzing.tw TXT
"v=DMARC1; p=reject; sp=reject; adkim=s; aspf=s;"

BTW,其實要檢查有沒有設定好可以直接利用第三方工具如 MX toolbox,它還會順便檢查格式有沒有錯。