# SPF メール送信なりすまし対策

SPF は Sender Policy Framework の略でメールの送信元ドメインの偽称を防ぎ、正当性を検証する技術です。DNS に SPF レコード追加することにより、送信ドメイン認証を行いなりすましメール送信することを防げます。メール送信時ドメイン認証技術は SPF DKIM DMARC 3種類ありますが、SPF が一番導入しやすいため、広く利用されています。jp ドメイン名全体の SPF と DMARC の最新 2020 年 5 月の調査結果では受信したメールに対して 65.1%の普及率に達しています。

# SPF レコードの書き方

DNS に SPF レコードを TXT で追加します。

ドメイン. IN TXT”【SPF version】 【qualifier】【mechanism】:【値】”

  • で囲む文字列最大 255 文字
  • mechanism は複数設定できるが、SPF レコードを複数指定するとエラー

SPF レコードの内容3つの部分

  • SPF version
  • qualifier
  • mechanism:値

一般的な TXT 書き方例

v=spf1 +ip4:192.168.0.1 -all

# SPF version

SPF version v=spf1 が基本的で、それ以外に spf2.0/pra,mfrom もあります。
「v=spf1.0」と書くとエラーになります。

# qualifier 限定子

読み方 kwɔ́ləfàiər

qualifier 限定子は - ~ ? 4種類あります。

限定子 判定 備考
+ Pass 正当なメールとして処理
- Fail 不正メールとして処理し、配信拒否
~ SoftFail 不正メールとして処理するが、配信行う
? Neutral SPF 指定のないその他のもの処理

※ サーバーによって SoftFail でも配信拒否されることがあります。

# mechanism メカニズム

読み方 mékənìzm

mechanism と値で書いた判定ルールにマッチした場合に設定した qualifier の値を返します。

メカニズム 機能
all なし すべての送信元ホストにマッチする。SPF レコードの末尾に置かれ、デフォルト動作を定義するために利用される
include ドメイン名 引数に与えられたドメインの SPF レコードを使って認証処理を行い、その結果が Pass か TempError、または PermError の場合のみ値が採用される。include に指定された先のドメインの SPF レコードによって Fail の判定が与えられても、それが認証結果としては採用されない
a ドメイン名 送信元ホストの IP アドレスが、ドメイン名に与えられた FQDN の A レコードのいずれかであれば条件マッチする
mx ドメイン名 送信元ホストの IP アドレスが、ドメイン名に対応する MX レコードに指定されているホストの A レコードのいずれかであれば条件マッチする。 MX は複数与えられる場合があるが、10 個までの MX ホストに対して検査を行う
ptr ドメイン名 送信元ホストの IP アドレスをリバースルックアップし、得られたホスト名でさらに正引きを実施し、IP アドレスを得る。その IP アドレスと送信元ホストの IP アドレスが含まれる場合、そのホスト名が引数に与えられたドメイン名と一致するかそのサブドメインである場合、認証成功となる。リバースルックアップに失敗した場合は Fail とみなす。負荷の多い処理となるため、あまり利用は推奨されない
ip4 IP ネットワークアドレス(CIDR 表記可能)または IP アドレス 送信元ホストの IP アドレスが、引数に指定される IP ネットワークに含まれているか IP アドレスにマッチする場合、認証成功となる
ip6 IPv6 ネットワークアドレスまたは IPv6 アドレス 送信元ホストの IPv6 アドレスが、引数に指定される IPv6 ネットワークに含まれているか IPv6 アドレスにマッチする場合、認証成功となる
exists ドメイン名 引数であるドメイン名に指定された表記で A レコードルックアップを実施し、該当の A レコードが存在すればマッチする。SPF のマクロ機能とあわせての利用を想定している

# ip4 - IP アドレスを使用したメカニズム

ip4:192.168.0.1/16

「ip4」は指定した IP アドレスと送信元の IP アドレスが一致するかを確認します。上記のように"/16"とすることでマスク指定が可能です。
また、"ip4"ではなく"ip6"と記載することで IPv6 での指定も可能です。

# mx - MX レコードを使用したメカニズム

mx:hapicode.com

「mx」は指定したドメインの MX レコードに設定されているドメインの IP アドレスと送信元の IP アドレスが一致するかを確認します。

# a - A レコードを使用したメカニズム

a:hapicode.com

「a」は指定したドメインの A レコードに設定されている IP アドレスと送信元の IP アドレスが一致するかを確認します。

# incluede - 他ドメインの SPF レコードを使用したメカニズム

include:hapicode2.com

「include」は指定したドメインの SPF レコードを確認します。

# ptr - 逆引きで得たドメインを使用したメカニズム

ptr:hapicode.com

「ptr」は送信元の IP アドレスの逆引きによって取得したドメインと指定したドメインが一致するかを確認します。「ptr」は DNS サーバの不可が高くなるといった理由からあまり推奨されていないので、使う機会はほとんどないです。

# all - 全てマッチとなるメカニズム

all

「all」は他のメカニズムとは違い必ずマッチするメカニズムです。
基本的に SPF レコードの最後に記載し、その他のメカニズムにマッチしなかった場合にどのクオリファイアを返すのかを指定します。

# 書き方例

example.jp. IN TXT "v=spf1 +ip4:192.168.0.0/24 -all"
example.jp. IN TXT "spf2.0/pra,mfrom +ip4:192.168.0.0/24 -all"
example.jp. IN TXT " v=spf1 include:_spf.example.jp -all"
example.jp. IN TXT " v=spf1 redirect=example.com"
example.jp. IN TXT "v=spf1 +ip4:192.168.0.0/24 +ip4:10.0.0.0/24 -all"
``

注意点

  • バージョンの間違い
  • 余分な空白文字
  • 記号の間違い
  • 末尾に「all」と記載
2022-02-06
  • server

関連記事

robots.txt の書き方
5 分で VPN サーバー立てる! wg-easy の使い方
積水ハウス 個人情報流出 SQL インジェクション攻撃か
ZeroSSL で無料 SSL できるけど Let's Encrypt と比較
ジェネレーティブ AI と大規模言語モデル(LLM)を学ぶためのリソース
XZ Utils 事件対応
Ubuntu で Web サーバーを構築する手順
メールサーバー移行と POP & IMAP 設定
Docker Supervisor 使ってバッチ処理
よく使う WSL コマンド
自宅サーバー構築!  Nextcloud で NAS クラウドストレージ
no such file or directory: /usr/share/zsh/vendor-completions/_docker
oh my zsh 使うべし
AWS CloudWatch ログ監視で Lambda 処理
AWS SES メール開封確認  DB に集計
Vim 操作とショートカット
DDNS 無料ダイナミック DNS サービス 4 つ
Nginx 基本設定
Windows Mac Linux hosts ファイル場所
AWS Unresolved resource dependencies [AWSEBV2LoadBalancer] エラー
ディスク容量を確認する df コマンド
Laravel Address already in use の原因
content-security-policy 設定
AWS Elastic Beanstalk php.ini 設定変更
AWS Elastic Beanstalk 環境設定
AWS のタイムゾーンを UTC 協定世界時から JST 日本標準時に変更
Docker の基本的な使い方
Amazon DynamoDB 制限調査
AWS 504 Gateway Timeout エラー対応
Shell と Bash のいろいろ
Mac ターミナル SSH 接続設定
Elastic Beanstalk \$\SERVER['REMOTEADDR'] 取得できない
crontab 設定いろいろ
AWS EC2 の amazon-linux-extras の話
デプロイツール Capistrano
解決! xserver php バージョンアップした時に ssh 環境に反映されない
youtube 見れるように vpn サーバー建ててみた
xserver に vim インストール
xserver に nodejs インストール
レンタルサーバーなら xserver おすすめ理由
Docker command でドッカー練習する時のメモ
Windows10 Home に Docker 入れた時のメモ
Centos7 Webserver 構築の時のメモ