Postfixに届いたメールをSPF検証する

受信メールに対してSPF検証を行うための設定

届いたメールに対してSPF検証を行うようにするには以下の手順を実施します。

①必要なパッケージのインストール

# dnf install epel-release
# dnf install pypolicyd-spf

 

②pypolicyd-spfの設定ファイルを書き換える

# nano /etc/python-policyd-spf/policyd-spf.conf
HELO_reject = False       ← 私の場合は "False" で様子見
Mail_From_reject = False  ← 私の場合は "False" で様子見

 

③Postfix側の設定

# nano /etc/postfix/master.cf
policy-spf  unix  -  n  n  -  0  spawn   ← "policy-spf" は任意の名前で良いが「main.cf」内の記述と合わせる
  user=nobody argv=/usr/libexec/postfix/policyd-spf  ← 改行時はスペースかタブで始める

# nano /etc/postfix/main.cf
smtpd_recipient_restrictions =
    permit_mynetworks,
    permit_sasl_authenticated,
    reject_unauth_destination,
    check_policy_service unix:private/policy-spf
policy-spf_time_limit = 3600             ← 追加

# systemctl reload postfix

 

dnf update (dnf upgrade) をやったらメールが受信できなくなった

ところが先日パッケージを不用意にアップデートしたところ、LAN外からのメールが受信できなくなってしまいました。
ログを確認すると・・・

# tail -f -n 50 /var/log/maillog | grep postfix
Nov 14 11:06:12 *** postfix/smtpd[59334]: connect from example.com[xxx.xxx.xxx.xxx]
Nov 14 11:06:13 *** postfix/smtpd[59334]: discarding EHLO keywords: CHUNKING
Nov 14 11:06:13 *** postfix/spawn[59341]: warning: command /usr/libexec/postfix/policyd-spf exit status 1
Nov 14 11:06:13 *** postfix/smtpd[59334]: warning: premature end-of-input on private/policy-spf while reading input attribute name
Nov 14 11:06:15 *** postfix/spawn[59341]: warning: command /usr/libexec/postfix/policyd-spf exit status 1
Nov 14 11:06:15 *** postfix/smtpd[59334]: warning: premature end-of-input on private/policy-spf while reading input attribute name
Nov 14 11:06:15 *** postfix/smtpd[59334]: warning: problem talking to server private/policy-spf: Connection reset by peer
Nov 14 11:06:15 *** postfix/smtpd[59334]: NOQUEUE: reject: RCPT from example.com[xxx.xxx.xxx.xxx]: 451 4.3.5 <xxx@lsmodena.com>: Recipient address rejected: Server configuration problem; from=<***@example.com> to=<***@lsmodena.com> proto=ESMTP helo=<example.com>

SPF検証周りで異常が発生しています。
そこで最近のAlmaLinuxのupdate履歴を調べてみます。

# dnf history
ID | コマンドライン | 日時 | 動作 | 変更
----------------------------------------------
 ・・・・・・
 303 | update | 2022-11-14 01:27 | Upgrade | 8
 ・・・・・・
# dnf history info 303
トランザクション ID : 303
開始時間 : 2022年11月14日 01時27分28秒
開始 rpmdb : 971:7d27a159c9dad706529c67759bd32e91abce8123
終了時間 : 2022年11月14日 01時27分32秒 (4 秒)
終了 rpmdb : 971:270f17c5783c32e6e643d05213efbb282e730df5
ユーザー : root <root>
終了コード : 成功
Releasever : 8
upgrade
Upgrade bind-32:9.11.36-5.el8_7.2.x86_64 @appstream
Upgraded bind-32:9.11.36-5.el8.x86_64 @@System
Upgrade bind-chroot-32:9.11.36-5.el8_7.2.x86_64 @appstream
Upgraded bind-chroot-32:9.11.36-5.el8.x86_64 @@System
Upgrade bind-libs-32:9.11.36-5.el8_7.2.x86_64 @appstream
Upgraded bind-libs-32:9.11.36-5.el8.x86_64 @@System
Upgrade bind-libs-lite-32:9.11.36-5.el8_7.2.x86_64 @appstream
Upgraded bind-libs-lite-32:9.11.36-5.el8.x86_64 @@System
Upgrade bind-license-32:9.11.36-5.el8_7.2.noarch @appstream
Upgraded bind-license-32:9.11.36-5.el8.noarch @@System
Upgrade bind-utils-32:9.11.36-5.el8_7.2.x86_64 @appstream
Upgraded bind-utils-32:9.11.36-5.el8.x86_64 @@System
Upgrade python3-bind-32:9.11.36-5.el8_7.2.noarch @appstream
Upgraded python3-bind-32:9.11.36-5.el8.noarch @@System
Upgrade pypolicyd-spf-2.9.3-1.el8.noarch @epel
Upgraded pypolicyd-spf-2.0.2-7.el8.noarch @@System

どうやらpypolicyd-spfのバージョンが「2.0.2-7.el8.noarch → 2.9.3-1.el8.noarch」とUpgradeされたことが原因のようです。

私の場合はSPF検証をしているものの、実際にはヘッダーに検証結果を付加するだけで受信拒否をしていないので、この際SPF検証の設定をすべて外してしまうのも手です。
ただ世の中のSPF対応の動向は知っておきたいので、今回はSPF検証を維持したまま不具合に対応します。

 

pypolicyd-spf が正常に動作しない原因の追及

pypolicyd-spf を実行してみます。

# /usr/libexec/postfix/policyd-spf
Traceback (most recent call last):
  File "/usr/libexec/postfix/policyd-spf", line 11, in <module>
    load_entry_point('spf-engine==2.9.3', 'console_scripts', 'policyd-spf')()
  File "/usr/lib/python3.6/site-packages/pkg_resources/__init__.py", line 476, in load_entry_point
    return get_distribution(dist).load_entry_point(group, name)
  File "/usr/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2700, in load_entry_point
    return ep.load()
  File "/usr/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2318, in load
    return self.resolve()
  File "/usr/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2324, in resolve
    module = __import__(self.module_name, fromlist=['__name__'], level=0)
  File "/usr/lib/python3.6/site-packages/spf_engine/__init__.py", line 54, in <module>
    import authres
ModuleNotFoundError: No module named 'authres'

最終行を見ると、authresモジュールが見付からないことが原因のようです。
それをインストールすれば今回の問題は解決です。

# dnf install python3-authres

※追記(2022.11.27):今日アップデートを確認したところ、pypolicyd-spfのバージョンが「2.9.3-4.el8.noarch」になり、依存関係にpython3-authresも追加されたようです

 

動作確認

自サーバー宛てに自宅外からメールを送信してみると、ちゃんと受信出来ました。
SPF検証も行われています。

# tail -f -n 50 /var/log/maillog | grep policyd-spf
Nov 15 11:22:58 *** policyd-spf[234413]: prepend Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=xxx.xxx.xxx.xxx; helo=example.com; envelope-from=***@example.com; receiver=<UNKNOWN>

 

あとがき

どうせSPFをチェックしても受信拒否していなかったので、ある意味不毛な作業でしたが、今後更に迷惑メールが増えるようであれば受信拒否も考えていきたいと思います。

コメント

タイトルとURLをコピーしました