SPF について知らなかった 3 つのこと

Posted on

SPF (Sender Policy Framework) の設定をするときに知らなかったことがいくつかありました。 SPF についてはうろ覚えの知識だったので、この機会に RFC を読んで仕様を確認してみました。

SPF レコードタイプは使わない

SPF を設定するときは TXT レコードに追加するほかに、専用の SPF レコードタイプが用意されています。ですが、SPF レコードタイプは相互運用性の観点から勧められていません。

RFC 7208 の 14.1. The SPF DNS Record Type から引用します。

Studies have shown that RRTYPE 99 has not seen any substantial use, and in fact its existence and mechanism defined in [RFC4408] have led to some interoperability issues. Accordingly, its use is no longer appropriate for SPF version 1; implementations are not to use it.

最後に "implementations are not to use it." とあるので、非推奨ではなく使うべきではありません。 Route 53 には SPF レコードタイプの設定ができますが、SPF を追加するときは TXT レコードを使いましょう。

SPF の DNS ルックアップ は 10 回まで

SPF の設定をするとき include を使うことがあります。たとえば G Suite の推奨設定はこうなっています。

v=spf1 include:_spf.google.com ~all

_spf.google.com の TXT レコードを調べてみると、さらに 3 つの include が返ってきます。メールサーバの IP アドレスはその先に設定されています。

$ dig +short _spf.google.com. txt
"v=spf1 include:_netblocks.google.com include:_netblocks2.google.com include:_netblocks3.google.com ~all"

$ dig +short _netblocks.google.com. txt
"v=spf1 ip4:64.18.0.0/20 ip4:64.233.160.0/19 ip4:66.102.0.0/20 ip4:66.249.80.0/20 ip4:72.14.192.0/18 ip4:74.125.0.0/16 ip4:108.177.8.0/21 ip4:173.194.0.0/16 ip4:207.126.144.0/20 ip4:209.85.128.0/17 ip4:216.58.192.0/19 ip4:216.239.32.0/19 ~all"

G Suite だと計 4 回の DNS ルックアップが行われていることになります。

ここで注意しないといけないのは、SPF の DNS ルックアップは 10 回までに制限されているということです。 RFC 7208 の 4.6.4. DNS Lookup Limits から引用します。

SPF implementations MUST limit the total number of those terms to 10 during SPF evaluation, to avoid unreasonable load on the DNS.

たとえば、G Suite のほかに Amazon SES や SendGrid なども使いたい場合は DNS ルックアップが 10 回を超えるかもしれません。 10 回を超えると無効な SPF レコードとして扱われるので SPF の効果が期待できません。

G Suite のように include の先で何回の DNS ルックアップが発生するかはコントロールできないので、無効な SPF レコードになっていないか定期的に確認するとよさそうです。 SPF Record Testing Tools を使えば簡単に確認できます。

G Suite はドメイン エイリアスに SPF を設定しても効かない

これは G Suite 固有の問題だと思いますが、ドメイン エイリアスに SPF を設定しても効きません。

たとえば foo@example.com に対して foo@example.org というエイリアスを設定していて、普段は foo@example.org からメールを送信しているとします。この場合、example.org に SPF レコードを設定しても効きません。

メールヘッダを見ればわかりますが Received-SPF ヘッダはエイリアス元のドメインを見ています(今回の例だと foo@example.com の方です)。なので、SPF レコードは example.com の方に設定しないと効果がありません。これに気づかずにハマりました。

まとめ

仕様を知るために RFC を読む、原因を探るときはログ(今回だとメールヘッダ)を確認するという当たり前のことをおろそかにしてはダメですね。