受信メールに対して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をチェックしても受信拒否していなかったので、ある意味不毛な作業でしたが、今後更に迷惑メールが増えるようであれば受信拒否も考えていきたいと思います。
コメント