サーバにSPFを設定しよう
メール受信時に送信者側が「SPF」を設定しているかどうかである程度の迷惑メールが判定できます。OS: Alma Linux 9.6 ソフト: Postfix 3.5.25 pypolicyd-SPF 2.9.3 # dnf install pypolicyd-spf メタデータの期限切れの最終確認: 00:00:00 前の 2025年06月04日 12時34分56秒 に実施しました。 依存関係が解決しました。 ========================================================================================================================= パッケージ アーキテクチャー バージョン リポジトリー サイズ ========================================================================================================================= インストール: pypolicyd-spf noarch 2.9.3-4.el9 epel 62 k 依存関係のインストール: python3-authres noarch 1.2.0-6.el9 epel 42 k python3-py3dns noarch 3.2.1-7.el9 epel 48 k python3-pyspf noarch 2.0.14-13.el9 epel 51 k トランザクションの概要 ========================================================================================================================= インストール 4 パッケージ ダウンロードサイズの合計: 203 k インストール後のサイズ: 591 k これでよろしいですか? [y/N]: y パッケージのダウンロード: (1/4): python3-authres-1.2.0-6.el9.noarch.rpm 782 kB/s | 42 kB 00:00 (2/4): pypolicyd-spf-2.9.3-4.el9.noarch.rpm 1.0 MB/s | 62 kB 00:00 (3/4): python3-py3dns-3.2.1-7.el9.noarch.rpm 783 kB/s | 48 kB 00:00 (4/4): python3-pyspf-2.0.14-13.el9.noarch.rpm 1.8 MB/s | 51 kB 00:00 ------------------------------------------------------------------------------------------------------------------------- 合計 310 kB/s | 203 kB 00:00 トランザクションを確認しています トランザクションの確認に成功しました。 トランザクションをテストしています トランザクションのテストに成功しました。 トランザクションを実行しています 準備中 : 1/1 インストール中 : python3-py3dns-3.2.1-7.el9.noarch 1/4 インストール中 : python3-pyspf-2.0.14-13.el9.noarch 2/4 インストール中 : python3-authres-1.2.0-6.el9.noarch 3/4 scriptletの実行中: pypolicyd-spf-2.9.3-4.el9.noarch 4/4 インストール中 : pypolicyd-spf-2.9.3-4.el9.noarch 4/4 scriptletの実行中: pypolicyd-spf-2.9.3-4.el9.noarch 4/4 検証中 : pypolicyd-spf-2.9.3-4.el9.noarch 1/4 検証中 : python3-authres-1.2.0-6.el9.noarch 2/4 検証中 : python3-py3dns-3.2.1-7.el9.noarch 3/4 検証中 : python3-pyspf-2.0.14-13.el9.noarch 4/4 インストール済み: pypolicyd-spf-2.9.3-4.el9.noarch python3-authres-1.2.0-6.el9.noarch python3-py3dns-3.2.1-7.el9.noarch python3-pyspf-2.0.14-13.el9.noarch 完了しました! -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= // conf ファイルを注釈(英語)月に変更する # mv /etc/python-policyd-spf/policyd-spf.conf /etc/python-policyd-spf/policyd-spf.conf.org # cp /usr/share/doc/pypolicyd-spf/policyd-spf.conf.commented /etc/python-policyd-spf/policyd-spf.conf // policyd-spf.conf を編集する # vi /etc/python-policyd-spf/policyd-spf.conf # HELO check rejection policy. Options are: # HELO_reject = SPF_Not_Pass (default) - Reject if result not Pass/None/Tempfail. # HELO_reject = Softfail - Reject if result Softfail and Fail # HELO_reject = Fail - Reject on HELO Fail # HELO_reject = Null - Only reject HELO Fail for Null sender (SPF Classic) # HELO_reject = False - Never reject/defer on HELO, append header only. # HELO_reject = No_Check - Never check HELO. ##HELO_reject = Fail # とりあえず不問と知る HELO_reject = False # Mail From rejection policy. Options are: # Mail_From_reject = SPF_Not_Pass - Reject if result not Pass/None/Tempfail. # Mail_From_reject = Softfail - Reject if result Softfail and Fail # Mail_From_reject = Fail - Reject on Mail From Fail (default) # Mail_From_reject = False - Never reject/defer on Mail From, append header only # Mail_From_reject = No_Check - Never check Mail From/Return Path. # デフォルトのまま。Fail判定はブロックする。 Mail_From_reject = Fail # Policy for rejecting due to SPF PermError. Options are: # PermError_reject = True # PermError_reject = False # 恒久的なエラー(構文ミスなど)があっても受信する PermError_reject = False # Policy for deferring messages due to SPF TempError. Options are: # 一時的なエラーの場合、保留(再送を促す)する TempError_Defer = True # TempError_Defer = False ###TempError_Defer = False Default # Do not check SPF for localhost addresses - add to skip addresses to # skip SPF for internal networks if desired. Defaults are standard IPv4 and # IPv6 localhost addresses. ##skip_addresses = 127.0.0.0/8,::ffff:127.0.0.0/104,::1 # 自サーバのIPアドレスとローカルIPアドレスをセットする skip_addresses = 555.666.777.888/32,3000:4000:5000:6000:7000:8000:9000:0001,127.0.0.0/8,::ffff:127.0.0.0/104,::1 【説明】 HELO_reject ・メールセッションの開始時に、送信側のSMTPクライアントが自身のホスト名を名乗るコマンド(HELO または EHLO)を送信します。 ・この名乗られたホスト名(helo=... に記載されるホスト名)のDNSレコード(通常はAレコードまたはAAAAレコード)をSPFレコードとして参照し、実際に接続してきたIPアドレスがそのホスト名で許可されているかをチェックします。 ・これは、メールエンベロープの情報よりも先に検証されるため、より初期段階のチェックとなります。 Mail_From_reject ・MAIL FROM: コマンドで指定されるメールアドレス(いわゆる「エンベロープFrom」または「Return-Path」)のドメインに対してSPFチェックを行います。 ・実際にメールを送信してきたIPアドレスが、このドメインのSPFレコードで許可されているかを検証します。 ・迷惑メールやフィッシングメールの多くは、この Mail From ドメインを詐称して送信されるため、SPFチェックにおいて最も重要な検証ポイントの一つとされています。 skip_addresses ・SPFを確認しないIPアドレス。 ・ローカルネットやサーバ自身を設定する。 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= // /etc/potfix/master.cf を編集する master.cfを編集して、postfix から policyed-SPFを呼び出してもらう。 # vi /etc/postfix/master.cf 一番最後の行に以下を追加 # SPF検証設定 policyd-spf unix - n n - 0 spawn user=nobody argv=/usr/libexec/postfix/policyd-spf // /etc/postfix/main.cf を編集する # vi /etc/postfix/main.cf smtpd_recipient_restrictions = # permit_mynetworks permit_sasl_authenticated reject_unauth_destination check_policy_service unix:private/policyd-spf <-- 追加 policyd-spf_time_limit = 3600 <-- 追加 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= 文法チェック # postfix check # systemctl restart postfix # systemctl status postfix Active: active (running) の表示があればOK -*-*-*-*- おまけ -*-*-*-*- SPFの判定がされれば、以下の様にログが残ります。 【例】 Aパターン Jun 3 12:51:04 mz policyd-spf[453411]: prepend Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=***.***.***.***; helo=hogehoga; envelope-from=nanja@hogehoge; receiver=Bパターン Jun 3 23:35:58 mon policyd-spf[583082]: prepend Received-SPF: None (mailfrom) identity=mailfrom; client-ip=***.***.***.***; helo=hogehoga; envelope-from=kanja@hogehogu; receiver= Cパターン Jun 4 10:30:01 mz policyd-spf[666644]: 550 5.7.23 Message rejected due to: SPF fail - not authorized. Please see http://www.openspf.net/Why?s=mfrom;id=support@example.jp;ip=203.0.113.20;r= Jun 4 10:30:01 mz postfix/smtpd[666639]: NOQUEUE: reject: RCPT from white.mail.com[203.0.113.10]: 550 5.7.23 : Recipient address rejected: Message rejected due to: SPF fail - not authorized. Please see http://www.openspf.net/Why?s=mfrom;id=support@example.jp;ip=203.0.113.20;r= ; from= to= proto=ESMTP helo= Jun 4 10:30:01 mz postfix/smtpd[666639]: disconnect from white.mail.com[203.0.113.10] ehlo=2 starttls=1 mail=1 rcpt=0/1 rset=1 quit=1 commands=6/7 Dパターン Jun 4 10:35:01 mz policyd-spf[12348]: prepend Received-SPF: Softfail (mailfrom) identity=mailfrom; client-ip=203.0.113.20; helo=suspicious.host; envelope-from=marketing@example.org; receiver= Eパターン Jun 4 10:40:01 mz policyd-spf[12352]: prepend Received-SPF: Neutral (mailfrom) identity=mailfrom; client-ip=203.0.113.30; helo=neutral-sender.com; envelope-from=info@example.net; receiver= Fパターン Jun 4 10:45:01 mz policyd-spf[12356]: prepend Received-SPF: PermError (mailfrom) identity=mailfrom; client-ip=203.0.113.40; helo=error-prone.net; envelope-from=test@bad-spf.com; receiver= Jun 4 10:45:01 mz postfix/smtpd[12355]: NOQUEUE: reject: RCPT from error-prone.net[203.0.113.40]: 550 5.7.1 : Sender address rejected: SPF PermError; from= to= proto=ESMTP helo= Gパターン Jun 4 10:50:01 mz policyd-spf[12358]: prepend Received-SPF: TempError (mailfrom) identity=mailfrom; client-ip=203.0.113.50; helo=transient-issue.com; envelope-from=support@example.com; receiver= Jun 4 10:50:01 mz postfix/smtpd[12357]: BADC0FFEE00: client=transient-issue.com[203.0.113.50] Jun 4 10:50:02 mz postfix/smtpd[12357]: NOQUEUE: defer: RCPT from transient-issue.com[203.0.113.50]: 450 4.3.2 : Sender address rejected: Temporary SPF error; from= to= proto=ESMTP helo= ここの「Received-SPF:」に注目してください。 Aパターンは「Pass」。メールを受信します。 Bパターンは「None」。メールを受信します。 Cパターンは「Fail」。メールを受信しません。 Dパターンは「Softfail」。メールを受信します。ただし、許可しないが、厳密な拒否はしない(様子見) Eパターンは「Neutral」。メールを受信します。許可も拒否もしません。(SPFレコードに ?all となっている事) Fパターンは「PremError」。メールを受信しません。SPFレコードの文法エラーです。policy-spf.confの「PermError_reject=True」になっていれば受信拒否です。 Gパターンは「TempError」。メールを受信しません。一時的障害と判断します。policy-spf.confの「TempError_Defer=True」になっていれば再送を促します。 SPFの判定結果は以下のようになります。 Pass: SPFレコードが存在し、送信元IPアドレスが許可されている。 None: SPFレコードが存在しない。 Fail: SPFレコードが存在し、送信元IPアドレスが許可されていない。 Softfail: SPFレコードが存在し、送信元IPアドレスが許可されていないが、厳密な拒否は推奨されない。 Neutral: SPFレコードが存在するが、明確な許可も拒否も示されていない。 PermError: SPFレコードの構文に永続的なエラーがある。 TempError: SPFレコードの検索中に一時的なDNSエラーが発生した。 判定結果から、 Aパターンは「問題なし」 Bパターンは「SPFレコードがDNSに存在しない」という事になります。 Cパターンは「メールを受信しない」 Dパターンは「疑わしいが受信はする」 Eパターンは「何もせず受信します」 Fパターンは「送信元のSPFレコードの書き間違いなので、判定できず受信しません」 Gパターンは「一時的通信エラーなので、今はメールを受信せず、一旦時間をおいて改めて再送してください」 SPFでは「送信元IPアドレスを認証」するだけなので、「怪しい」や「疑わしい」は設定によりスルーする事ができます。 ですので、SPFだけで迷惑メールを完全にブロックする事は不可能となります。 DKIMやDMARCと組み合わせて迷惑メール排除の精度を上げていく事が大切と考えます。 ちなみに DKIM ・・・ メールの改ざんがされていないことを保証するため、電子署名を付与します。 DMARC・・・ SPFやDKIM認証結果を基に不正メールの判定後、拒否や隔離の処理指定ができます。