SPF についてたまに思い出す必要があるのでまとめてみた
端的に言うと...
送信元詐称した迷惑メールなどを防ぐための仕組み
どう実装されているのか?
- DNS にあらかじめSPF レコードを登録しておく
- 受信したときに、受信者は送信元のIPアドレスがDNS のレコードに登録されたIPであるか確認する
- 違う場合は認証失敗。送信できないなどの機構を作れる
具体的に追ってみよう
Case: example@gmail.com からtest@example.com へのメール配送を考えてみる
- gmail からメールを送る
- example.com のメールサーバはgmail からメールを受信する
- メールを受信した際、その送信元IPを調べる
- DNS レコードを確認する
dig +noall +answer gmail.com txt
gmail.com. 300 IN TXT "globalsign-smime-dv=CDYX+XFHUw2wml6/Gb8+59BsH31KzUr6c1l2BPvqKX8="
gmail.com. 300 IN TXT "v=spf1 redirect=_spf.google.com"
- spf1 redirect=_spf.google.com なのでそちらを調べに行く
dig +noall +answer _spf.google.com txt
_spf.google.com. 299 IN TXT "v=spf1 include:_netblocks.google.com include:_netblocks2.google.com include:_netblocks3.google.com ~all"
- netblock1~3 .google.com をinclude していることがわかる
dig +noall +answer _netblocks.google.com txt
_netblocks.google.com. 290 IN TXT "v=spf1 ip4:35.190.247.0/24 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:209.85.128.0/17 ip4:216.58.192.0/19 ip4:216.239.32.0/19 ~all"
- つまりGoogle の場合は上記のIPアドレスレンジをIPアドレスとして定義していて、これ以外のIPである場合は正規のIPではないと定義している
- ~all としているので下記を意味する
- 認証情報を公開しているが、正当なメールであっても認証失敗する可能性もある
- すべての送信元ホストにマッチする
- ~all としているので下記を意味する
SoftFailとHardFail
SPF レコードには末尾に~all や -all などの記述がある
~ がsoftfail で - がHardFailである
これは、SPF の仕組みを使ってメールを受信した側がどのような挙動を取るべきかの指標となる部分である。
例えばGoogle の場合 ~ を利用しているためSoftfail であり、認証失敗する「可能性がある」としている。
これはつまり何かしらの転送経路があった場合にはGoogle のIP アドレス以外からログを受信することがあるかもしれないことを示唆している
世の中の他のドメインについても調べてみよう
- yahoo → SoftFail
dig +noall +answer yahoo.co.jp txt
yahoo.co.jp. 900 IN TXT "google-site-verification=GvbYgNin-mY73VbS4IJK2D8nI3tHEf2NpRdy76VYqBU"
yahoo.co.jp. 900 IN TXT "v=spf1 include:spf.yahoo.co.jp ~all"
- microsoft → hardFail
dig +noall +answer microsoft.com txt | grep spf
microsoft.com. 3600 IN TXT "v=spf1 include:_spf-a.microsoft.com include:_spf-b.microsoft.com include:_spf-c.microsoft.com include:_spf-ssg-a.microsoft.com include:spf-a.hotmail.com include:_spf1-meo.microsoft.com -all"
- amazon.com → hardFail
dig +noall +answer amazon.com txt | grep spf
amazon.com. 900 IN TXT "v=spf1 include:spf1.amazon.com include:spf2.amazon.com include:amazonses.com -all"
amazon.com. 900 IN TXT "spf2.0/pra include:spf1.amazon.com include:spf2.amazon.com include:amazonses.com -all"
- facebook → hardFail
dig +noall +answer facebook.com txt | grep spf
facebook.com. 6979 IN TXT "v=spf1 redirect=_spf.facebook.com"
$ dig +noall +answer _spf.facebook.com txt | grep spf
_spf.facebook.com. 3600 IN TXT "v=spf1 ip4:66.220.144.128/25 ip4:66.220.155.0/24 ip4:66.220.157.0/25 ip4:69.63.178.128/25 ip4:69.63.181.0/24 ip4:69.63.184.0/25" " ip4:69.171.232.0/24 ip4:69.171.244.0/23 -all"
- apple → softFail
dig +noall +answer apple.com txt | grep spf
apple.com. 3600 IN TXT "v=spf1 include:_spf.apple.com include:_spf-txn.apple.com ~all"
- jal/ana → softFail
dig +noall +answer jal.co.jp txt | grep spf
jal.co.jp. 900 IN TXT "v=spf1 +ip4:203.216.142.52 +ip4:202.219.37.2 +ip4:163.211.251.0/24 +ip4:163.211.252.0/24 +ip4:163.211.253.0/24 +ip4:163.211.224.0/21 +ip4:27.112.104.239 +ip4:82.150.225.79 +ip4:163.211.240.0/24 " "+ip4:202.218.104.28/30 +ip4:202.218.104.32/30 +ip4:210.152.224.237/32 +ip4:210.152.224.238/31 +ip4:210.152.224.240/30 " "include:spf.protection.outlook.com include:_spf.google.com include:nets1.spf.messagelabs.com include:nets2.spf.messagelabs.com ~all"
$ dig +noall +answer ana.co.jp txt | grep spf
ana.co.jp. 86400 IN TXT "v=spf1 +ip4:210.231.106.160/27 include:_spf.google.com +ip4:118.103.91.0/25 +ip4:54.199.183.220 +ip4:54.199.184.14 +ip4:54.199.210.117 +ip4:202.143.69.192/26 " "include:_spf.salesforce.com +ip4:18.182.142.199 +ip4:18.178.160.229 +ip4:
SoftFail とHardFail の使い分け
勝手なイメージとして日本企業はSofFail を使っているイメージが強い。海外企業はHardFailが多い。
日本だとドラスティックにHardfail を利用してメールが配送できないといった問題を回避するためのものなのだろうか?
詳細は把握していないのでご存じの方いれば共有頂きますと幸いです。
参考
https://www.nic.ad.jp/ja/basics/terms/spf.html
https://www.ietf.org/rfc/rfc4408.txt
https://salt.iajapan.org/wpmu/anti_spam/admin/tech/explanation/spf/
https://ja.wikipedia.org/wiki/Sender_Policy_Framework