讀到 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)模式檢查 DKIMaspf=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,它還會順便檢查格式有沒有錯。