|
~ To be, or not to be, or to take a lunch anyway. ~ null-i.net |
| Linux/postfixのメール受信強化(SpamAssasinなど) | |
|
SpamAssassin ・・・って、名前が怖いよ(2016-12-05、追記:2019-10-12) (※ここにある情報は古いです。CentOS Stream8での手順 を別途メモしています) postfix を使ったメールの送受信について SPF で受信する(policyd-spf)†postfix でメール受信する際に、SPFヘッダを付けてもらうようにします。 今回は policyd-spf というパッケージを入れます。
perl版とpython版があるようです。(pythonの方が多機能?) 後で気が付いたのですが・・・ # yum install pypolicyd-spf (中略) Installing: pypolicyd-spf noarch 1.3.2-1.el7 epel 44 k Installing for dependencies: postfix x86_64 2:2.10.1-6.el7 base 2.4 M おや!? postfix が依存に入っている! pypolicyd-spfのインストール†こちらは yum から入れてみました。 # yum install pypolicyd-spf (依存するパッケージも含めて、入れてくれます) # find / -name "policyd*" (・・・インストール後、どこに入ったのか分からないので探してます) /etc/python-policyd-spf/policyd-spf.conf /usr/libexec/postfix/policyd-spf など 「man policyd-spf.conf」で、設定方法がわかります。 # vi /etc/python-policyd-spf/policyd-spf.conf HELO_reject = False # Fail から False へ変更 Mail_From_reject = False # Fail から False へ変更 postfix との連携†次は postfix の設定です。 まずは master.cf へ追記します。 # vi /etc/postfix/master.cf
(以下の内容を追記)
policy-spf unix - n n - - spawn
user=nobody argv=/bin/python /usr/libexec/postfix/policyd-spf
/etc/python-policyd-spf/policyd-spf.conf
python のPATHは「which python」等で探します。 余談ですが、master.cf に複数行追加するときは、 次に、main.cf への追記です。 # vi /etc/postfix/main.cf
smtpd_recipient_restrictions =
permit_mynetworks
(中略)
check_policy_service unix:private/policy-spf # この行を追記
policy-spf_time_limit = 1800
smtpd_recipient_restrictions の内容は環境によって違うと思いますが、 さぁ、postfix の設定を再読み込みします。 # service postfix reload policyd-spf-perl のインストール†前述の通り、自分は yum から入れられないことに(随分経ってから)気が付いたので
# tar zxvf postfix-policyd-spf-perl-2.010.tar.gz # cd postfix-policyd-spf-perl-2.010/ # cp postfix-policyd-spf-perl /usr/local/lib/policyd-spf-perl # ls -l /usr/local/lib/policyd-spf-perl (パーミッションが、postfixから実行できるものであることを確認しておく) 展開からインストールまでやってしまいましたが、 モジュール追加その1 cpan # cpan NetAddr::IP # cpan Mail::SPF # cpan Sys::Hostname::Long モジュール追加その2 yum # yum install perl-Mail-SPF perl-NetAddr-IP perl-Sys-Hostname-Long cpanの初回起動時は初期設定が必要です。後で変更できるのでデフォルトでも良いかと。 いずれにせよ、インストールユーザ以外で $ /usr/local/lib/policyd-spf-perl # 試しに実行してみる $ perl -e 'use NetAddr::IP' # モジュールを呼んでみる 等やってみて「Can't locate ~.pm in @INC」のような見つかりませんエラーが出なければOKです。 postfix との連携†戻って、あとはINSTALLテキスト通りにpolicyd-spf-perlの設定です。 まずは master.cf へ追記します。 # vi /etc/postfix/master.cf (以下の内容を追記) policy-spf unix - n n - - spawn user=nobody argv=/usr/local/lib/policyd-spf-perl 次に、main.cf への追記です。これは python版と同じ内容です。 # vi /etc/postfix/main.cf
smtpd_recipient_restrictions =
permit_mynetworks
(中略)
check_policy_service unix:private/policy-spf # この行を追記
policy-spf_time_limit = 1800
python版と違って、perl版には configとかはありません。 受信してみよう†これで、他のSPFに対応しているメールから、 Received-SPF: Pass (sender SPF authorized) 等の記載が増えていると思います。 Let's SpamAssasin!†SPF/DKIM のチェック結果次第で「受け取らない」とはっきり決めるなら、 インストール†yum で入れました。 # yum install spamassassin 設定†インストールはできたので。さっそく設定を、 /etc/mail/spamassassin/local.cf の概要 required_hits 5 report_safe 1 rewrite_header Subject [SPAM] add_header ham HAM-Report _REPORT_ postfix との連携方法は、以下に書いてありました。 /usr/bin/spamfilter.sh を作成。少し内容を変えています。 (前半のコメント部分は省略)
SENDMAIL=/sbin/sendmail
#SPAMASSASSIN=/bin/spamc # 負荷が増えたら、spamc & spamd 構成へ移行する予定。
SPAMASSASSIN=/bin/spamassassin
logger <<<"Spam filter piping to SpamAssassin, then to: $SENDMAIL $@"
${SPAMASSASSIN} | ${SENDMAIL} "$@"
exit $?
動作確認用に、メール受信の度に loggerで syslog に書いてますが、後日削除。 あとは実行権限を変えます。 # chmod 755 /usr/bin/spamfilter.sh postfix との連携†そして、これらをSPFの時と同様に postfix へ取り込みます。 # vi master.cf
(まず、smtp に -o オプションを追加)
smtp inet n - n - - smtpd -o content_filter=spamfilter
(そして最終行に以下を追加)
spamfilter unix - n n - - pipe
flags=Rq user=daemon argv=/usr/bin/spamfilter.sh -oi -f ${sender} ${recipient}
そして、postfix を再読み込みして、受信準備は完了です。 # service postfix reload 受信してみよう†このメールサーバへメールを送信してみると、 X-Spam-Checker-Version: SpamAssassin x.x.x (20xx-xx-xx) on xxxx.ne.jp X-Spam-Level: xx X-Spam-Status: No, score=2.3 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,DNS_FROM_AHBL_RHSBL,HTML_MESSAGE,RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2,SPF_PASS autolearn=no autolearn_force=no version=3.4.0 X-Spam-HAM-Report: * 2.4 DNS_FROM_AHBL_RHSBL RBL: Envelope sender listed in dnsbl.ahbl.org * [listed in xxx.ne.jp.rhsbl.ahbl.org. IN] [A] * -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at http://www.dnswl.org/, no * trust * [xx.xx.xx.xx listed in list.dnswl.org] * -0.0 SPF_PASS SPF: sender matches SPF record * -0.0 RCVD_IN_MSPIKE_H2 RBL: Average reputation (+2) * [xx.xx.xx.xx listed in wl.mailspike.net] * 0.0 HTML_MESSAGE BODY: HTML included in message * -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from author's * domain * 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily * valid * -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature やたら詳細なのは、local.cf の HAM-Report _REPORT_ の出力ですかね。後日変えます。 上記の内容から、 そして、万が一 スパムメールを受信すると、 Content preview: スパムメール本文のプレビュー
Content analysis details: (5.6 points, 5.0 required)
pts rule name description
---- ---------------------- --------------------------------------------------
0.4 NO_DNS_FOR_FROM DNS: Envelope sender has no MX or A DNS records
-1.0 ALL_TRUSTED Passed through trusted hosts only via SMTP
0.8 DKIM_ADSP_NXDOMAIN No valid author signature and domain not in DNS
1.2 MISSING_HEADERS Missing To: header
2.4 DNS_FROM_AHBL_RHSBL RBL: Envelope sender listed in dnsbl.ahbl.org
[listed in localhost.xxxxxt.rhsbl.ahbl.org.]
[IN A]
1.8 MISSING_SUBJECT Missing Subject: header
なお、この例は自分宛てに怪しいメール作って送ったものです。 あとは、怪しいメールが来る度に、sa-learn コマンドにメールを食べさせて、 ルールの更新(sa-update)†私のCentOS 7 環境だと、yum install 時に # vi /etc/sysconfig/sa-update SAUPDATE=yes に設定する これで定期的に sa-update が動いて、 |
|