> Kuenhourg's 隨手記事簿: SPF基本概念

2013年11月6日 星期三

SPF基本概念


SPF 基本概念
SPF是讓收信端郵件伺服器,根據來信中寄件者網域資料,主動向寄信端所屬DNS伺服器核對其DNS紀錄。收信端郵件伺服器依照比對結果決定接收與否。

在網路上寄件者可匿名或假他人之名,垃圾信發送者假借別人的電子郵件帳號寄信,以避免信件被退回到自己真正的郵件信箱中;詐騙集團盜用別人的電子郵件帳號避免自己行蹤敗露;電腦病毒或蠕蟲想刻意模糊自己的出處而隨機使用任一電子郵件帳號;帳號密碼盜賊裝扮成某人的好友來信竊取私人機密等等不勝枚舉。(PS:當初電子郵件定義白皮書時始料未及的如果)。
此時,SPF機制讓寄信端在寄出的信封時,請收信端與所屬的DNS伺服器做驗證是否為「網域合法註冊者!」。
同時,收信端也能對寄信端DNS的回應做出判斷此來信是否為垃圾信?如您想對SPF紀錄做更深入的瞭解,請到 OpenSPF官網SPF

SPF 有哪些需求?
要想用 SPF 來保護你的系統,你必須配置 DNS,添加 TXT 記錄,用於容納 SPF 問詢的資訊。
配置你的電子郵件系統(Postfix, Sendmail)使用 SPF,也就是說對伺服器上每封進入的郵件進行驗證。
第一步要在郵件伺服器所屬的功能變數名稱伺服器上進行調整。
首先需要確定的一點是功能變數名稱伺服器(BIND)所使用的語法。
SPF TXT 記錄,SPF 記錄包含在一個 TXT 記錄之中,格式如:v=spf1 [[pre] type [ext] ] ... [mod]

每個參數的含義如下表所示: 


參數

描述

v=spf1

SPF 的版本。如果使用 Sender ID 的話,這個欄位就應該是 v=spf2

pre

定義匹配時的返回值。

可能的返回值包括:


返回值

描述

+

缺省值。在測試完成的時候表示通過。

-

表示測試失敗。這個值通常是 -all,表示沒有其他任何匹配發生。

~

表示軟失敗,通常表示測試沒有完成。

註:參數若比對失敗,信件仍能寄進來,但該信件標題會加註 'SPF-Failure' ,並置於垃圾信件資料夾中。

?

表示不置可否。這個值也通常在測試沒有完成的時候使用。

type

定義使用的確認測試的類型。

可能的值包括:


候選值

描述

include

包含一個給定的功能變數名稱的測試
include:domain 的形式書寫。

all

終止測試序列。
比如,如果選項是 -all,那麼到達這條記錄也就意味著測試失敗了。但是如果無法確定,可以使用”?all”來表示,這樣,測試將被接受。

ip4

使用 IPv4 進行驗證。
這個可以以 ip4:ipv4 ip4:ipv4/cidr 的形式使用。建議使用這個參數,以減少功能變數名稱伺服器的負荷。

ip6

使用 IPv6 進行驗證。

A

使用一個功能變數名稱進行驗證。
這將引起對功能變數名稱伺服器進行一次 ARR 查詢。
可以按照 a:domain, a:domain/cidr a/cidr 的形式來使用。

註:比對 dns 中的 a 紀錄,若沒有指定哪個網功能變數名稱,則以目前的的網域為主。

mx

使用 DNS MX RR 進行驗證。
MX RR
定義了收信的 MTA,這可能和發信的 MTA 是不同的,這種情況基於 mx 的測試將會失敗。
可以用 mx:domain, mx:domain/cidr mx/cidr 這些形式進行 mx 驗證。

註:比對 dns 中的 mx 紀錄,若沒有指定哪個網功能變數名稱,則以目前的網域為主。

ptr

使用功能變數名稱伺服器的 PTR RR 進行驗證。
這時,SPF 使用 PTR RR 和反向圖進行查詢。如果返回的主機名位於同一個功能變數名稱之內,就驗證通過了。
這個參數的寫法是 ptr:domain

註:比對 dns 中的 ptr 紀錄,若沒有指定哪個網功能變數名稱,則以目前的網域為主。

exist

驗證功能變數名稱的存在性。
可以寫成 exist:domain 的形式。

ext

定義對 type 的可選擴展。如果沒有這個欄位,那麼僅使用單個記錄進行問詢。

mod

這是最後的類型指示,作為記錄的一個修正值。


修正值

描述

Redirect

重定向查詢,使用給出的功能變數名稱的 SPF 記錄。以 redirect=domain 的方式使用。

Exp

這條記錄必須是最後一條,允許給出一條定制的失敗消息。

 IN TXT "v=spf1 mx -all exp=getlost.example.com"

 getlost IN TXT "You are not authorized to send mail for the domain"

範例: 
"v=spf1 include:_spf.google.com ~all"