conf t

インフラエンジニアのメモ

SPFレコードの設定・書式について理解する

SPFレコードの書式ってわかりずらくないですか?

SPFレコードは省略した記述が多く設定内容がわかりずらいと思っていたので、その点について理解できるように整理しました。

対象読者はSPFレコードの役割を知っているけど記述方法がわからない人。

SPFレコードって何って人は以下などを参照ください。
なりすましメール撲滅に向けたSPF(Sender Policy Framework)導入の手引き:IPA 独立行政法人 情報処理推進機構

SPFレコードの設定確認・検証はこちらの記事を参照ください
monaski.hatenablog.com

SPFレコードの書式を理解する

"v=spf1 ip4:192.168.0.1/16 -all"

SPFレコードはDNSレコードとして登録するわけですが、
DNSレコードとしてはSPFレコードという種類はなく、SPFレコードはTXTレコードとして記述されます。
そのためSPFレコードの設定内容はダブルクオートで囲みます。
SPFレコード中で最初に出てくる「v=spf1」はspfのバージョンを示しております。
その後にspf判定内容が記述されます。
SPF判定内容ですが、基本的に受信を許可するメールサーバのIPアドレスが記載されています。 ここに記載されたIPアドレスからのメールであればメールを受信し、記載がなければメールを拒否したりします。

SPFレコードの構成要素
SPFレコードはmechanismとqualifierから構成されています。
mechanismはどういったIPをマッチさせるかを記述し、qualifierはマッチした後の処理方法です。
1つのqualifierと1つのmechanismとその値が1かたまりで記述されます。
左から見ていってマッチした塊で指定されているqualifierの処理がメールに対して適用されます。
1かたまりは以下の書式になっています。

<qualifier><mechanism>:<値>

デフォルトのqualifierは+。qualifilerは省略されることが多いです。
値も両略されることが多いので、省略されていることを意識しデフォルト値について知っておかないと 混乱するので注意してください。

大抵の場合、SPFレコードの値の一番右側には-allもしくは~allが記述され、
どのmechanismにもマッチしなかった場合はそのメールを拒否するように設定されます。

qualifiler

qualifilerはmechanismにマッチした際にどのような判定とするか記述します。

qualifiler 判定結果
"+" Pass
"-" Fail
"~" SoftFail
"?" Neutral

qualifilerの記述がないときは+が記述されているとみなしてください。
+は省略が可能です。

SPFレコードの判定結果

SPFレコードの主な判定結果の意味は以下の通りです。

判定結果 処理
Pass メールを許可します
Fail メールを拒否します
SoftFail メールを拒否しますがFailよりは弱い拒否です
None 送信元ドメインにはSPFレコードが登録されていません
Neutral どれにもマッチしなかった場合など。

1点注意してほしいのは、判定結果を受けて、実際にメールがどう処理されるかは、
受信側サーバの設定次第だということです。
例えばSPFレコードの判定結果がFailの場合はメールを受信拒否・削除するメールサーバもあれば、
より厳しく、判定結果がSoftFailでもFailでもメールを受信拒否・削除するサーバもありえます。

つまりサーバ管理者がどのような方針で運用しているのかによります。

FailもSoftFailも拒否する運用がセキュリティレベルは最も高いですが、
送信元ドメインSPFレコードを間違って登録しているなどの理由で、必要なメールまで遮断してしまう可能性もあります。
そのため、判定はするがメールは受信拒否・削除しないで全部通すというところもあるかもしれません。

SoftFailの”弱い拒否”とは
SoftFailの”弱い拒否”とは、Failの場合より正しさが上として扱ってくださいということです。
例えばFailの場合は受信拒否するが、SoftFailの場合は許可する運用が考えられます。
ただし前述したとおり、SPFレコードの判定結果を受けて、実際にどう処理するかは受信側サーバがどのように
設定されるかによりますので、SoftFailもFailも区別しないサーバも存在しえます。

mechanism

よく使われるmechanismについて説明します。
他のmechanismは参考URLを参照してください。

all
全ての場合にマッチするmechanismです。
どこで使うかというと、SPFレコードの値の一番最後です。
最後に配置することで、どの条件にもマッチしなかった場合にどうするかを記述できます。大抵はその場合はメールを拒否します。
ファイアウォールで最後にdeny allがあるのと同じですね。

ip4
送信元メールサーバのIPアドレスが、指定したネットワークアドレスの範囲内にあればマッチする。
例:

"v=spf1 ip4:192.168.0.1/16 -all"

この場合は、送信元メールサーバのIPアドレスが、
192.168.0.1 から 192.168.255.255の範囲にあればマッチする。

a
そのドメインのAレコードにメール送信元サーバのIPアドレスがあればマッチする。
何も指定されていない場合は、そのSPFレコードが登録されているドメインを指す。

例えばexample.comSPFレコードが以下の場合

"v=spf1 a -all"  

このSPFレコード中のaの意味は、 メール送信元サーバのIPアドレスが、example.comのAレコードと一致したら、
そのメールを許可するという意味になります。
省略しないで書くとこうなります。

"v=spf1 +a:example.com -all"  

mx
そのドメインのMXレコードにメール送信元サーバのIPアドレスがあればマッチする。
何も指定されていない場合は、そのSPFレコードが登録されているドメインを指す。

inclued
引数のドメインSPFレコードを参照し、参照先でマッチすればマッチする。
参照先のドメインでもさらにincludeが指定されており、何重かの入れ子構造になっている場合もある。

実際にSPFレコードを見てみる

以下にSPFレコードの例を挙げる。
例:

"v=spf1 a:example.com -all"  

上記だと、aとallがmechanism、
allの前の-はqualifier
aの後のexample.comは値です。
上記例ではaはqualifierが省略されています。省略されている場合は+(許可)とみなされます。

メール送信元サーバのIPアドレスが100.1.1.1だとして、実際にSPFレコード判定を行ってみます。
example.comには100.1.1.1のAレコードは登録されていないものとします。

評価する際は左から見ていくので、最初に「+a:example.com」を判定が行われます。
ここでマッチすれば+が指定されているので、メールはPassと判定され許可されます。
example.comに登録されているAレコードには100.1.1.1がありませんでしたので、ここではマッチしません。
マッチしない場合は、1つ右側の判定に移り、「-all」を判定します。
これは全ての場合にマッチし、qualifierが-なので、ここまで判定が回ってきた場合は無条件で判定結果Failとなります。

参考:

http://www.openspf.org/SPF_Record_Syntax