SPF ってなんだろう？まとめてみた

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 としているので下記を意味する
      * 認証情報を公開しているが、正当なメールであっても認証失敗する可能性もある
      * すべての送信元ホストにマッチする

# 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