~ To be, or not to be, or to forget all. ~ 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 が動いて、 |
|