2023/01/04(水)セカンダリメールサーバの再構築
2023/01/04 6:22
プライマリメールサーバの負荷が高く、応答が遅い時などもセカンダリメールサーバが活用される場面があります。
最近はセカンダリメールサーバを用意していない組織もあるようですが、弊社ではセカンダリメールサーバを備えています。
セカンダリメールサーバは、実は色々な構成があり、プライマリメールサーバのように、電子メールの発信のみを出来るようにしているものもあります。
弊社では、セカンダリメールサーバから電子メールの発信を出来るようにしていませんが、今回はプライマリメールサーバの負荷軽減目的で、明らかなコンピュータウィルスや、確実な spam メールを捨てる仕組みを設けました。
※ この図は、Postfix やメールサーバの構成をそのまま示した図ではありません。
受信メッセージの流れを中心とすると、上記のように感じかなと考えています。
milter-manager で受信メッセージのコンピュータウィルス検査と spam チェックを行います。
実はこれ、Postfix のオンラインマニュアル等を読んでもどうもよく判らないんです。たぶん、こんな感じかなという想像図。。
「outbound」というのは、プライマリメールサーバなどへ送信する場面を想定しています。
上記セカンダリメールサーバ固有の設定
先ず、spamassassin を milter インタフェースで動作させるために、spamass-milter を導入します。一応、http://savannah.nongnu.org/projects/spamass-milt/ が公式サイトのようで、ダウンロードも出来ますが、永らく更新されておりません。
Ver 0.4.0 をダウンロードしてインストールしましたが、Ver 4.0.0 の spamassassin との組み合わせでも使えるようです。
# tar xvzf spamass-milter-0.4.0.tar.gz # cd spamass-milter-0.4.0 # setenv CPPFLAGS '-I/usr/local/include -I/usr/include' # setenv LDFLAGS '-L/usr/local/lib -L/usr/lib' # ./configure --localstatedir=/var # gmake # gmake installとすると、インストール完了です。
milter 形式だと、サーバ単位での spam 判定になってしまうため、少し緩め閾値で spamassassin の挙動を設定しておきます。
サーバ単位での spamassassin の設定は、/etc/mail/spamassassin/local.cf で設定します:
※ /etc/mail/spamassassin/local.cf の内容(変更部分のみ抜粋): rewrite_header Subject report_safe 0 required_score 17.0経験上、閾値 17.0 では、殆どの spam は通過してしまいます。15.0 未満が妥当ですが、運用しながら、様子見で少しずつ下げていくようにします。
以下、FreeBSD 固有の環境になりますが、下記のスクリプトを /usr/local/etc/rc.d 配下に spamass-milter と言う名前で作成しておきます:
#!/bin/sh # PROVIDE: spamass-milter # REQUIRE: LOGIN # BEFORE: mail # KEYWORD: shutdown # # Add the following lines to /etc/rc.conf to enable spamass-milter: # #spamass_milter_enable="YES" # # See spamass-milter(8) for flags. # . /etc/rc.subr name=spamass_milter rcvar=spamass_milter_enable command=/usr/local/sbin/spamass-milter required_dirs=/usr/local/share/spamassassin start_postcmd=start_postcmd stop_postcmd=stop_postcmd start_postcmd() { sleep 1 /usr/sbin/chown ${spamass_milter_socket_owner}:${spamass_milter_socket_group} ${spamass_milter_socket} /bin/chmod ${spamass_milter_socket_mode} ${spamass_milter_socket} } stop_postcmd() { rm -f ${spamass_milter_socket} } load_rc_config $name : ${spamass_milter_enable="NO"} : ${spamass_milter_socket="/var/run/spamd/spamass.sock"} : ${spamass_milter_flags="-f -p ${spamass_milter_socket} ${spamass_milter_localflags}"} : ${spamass_milter_socket_owner="spamd"} : ${spamass_milter_socket_group="mailuser"} : ${spamass_milter_socket_mode="660"} run_rc_command "$1"※注:このスクリプトは Postfix のみの対応です。sendmail が MTA だと、不具合起こすと思います。
上記スプリプトに実行権を与え、更に /etc/rc.conf へ
spamass_milter_enable="YES"の1行を追加しておきます。
ClamAV と、milter-managerも、インストールしておきます。過去記事を参考にしてください。
milter-manager をインストール後、
# /usr/local/sbin/milter-manager -u milter-manager --show-configとやってみて、
define_milter("clamav-milter") do |milter| # /usr/local/lib/milter-manager/binding/lib/milter/manager/detector.rb:44 milter.connection_spec = "unix:/var/run/clamav/clmilter.sock" # default milter.description = nil # /usr/local/lib/milter-manager/binding/lib/milter/manager/detector.rb:37 milter.enabled = true # default milter.fallback_status = "accept" ・ ・ ・ define_milter("spamass-milter") do |milter| # /usr/local/lib/milter-manager/binding/lib/milter/manager/detector.rb:44 milter.connection_spec = "unix:/var/run/spamd/spamass.sock" # default milter.description = nil # /usr/local/lib/milter-manager/binding/lib/milter/manager/detector.rb:37 milter.enabled = true # default milter.fallback_status = "accept"といった表示がされるのを必ず確認しておきます。
最後に、Postfix 側の設定で、milter と関連するもののみ抜粋すると、
milter_protocol = 6 milter_default_action = accept milter_mail_macros = {auth_author} {auth_type} {auth_authen} smtpd_milters = unix:/var/run/milter-manager/milter-manager.sock non_smtpd_milters = unix:/var/run/milter-manager/milter-manager.sock transport_maps = hash:/usr/local/etc/postfix/virtualtbl/transport.map header_checks = pcre:/usr/local/etc/postfix/header_checks
※ /usr/local/etc/postfix/virtualtbl/transport.map の内容: example.jp smtp:[primary1.example.net] example.net smtp:[primary2.example.net] ※ /usr/local/etc/postfix/header_checks の内容: /^From:\s*<>/m DISCARD /^X\-Spam\-Flag:\s+YES/m DISCARD /^X\-Virus\-Status:\s+Yes/m DISCARD /^X\-Spam\-Level:/m IGNORE /^X\-Spam\-Checker\-Version:/m IGNORE /^X\-Spam\-Status:\s+No/m IGNORE /^X\-Virus\-Scanned:/m IGNORE /^X\-Virus\-Status:\s+Clean/m IGNOREのような感じ。
# postmap hash:/usr/local/etc/postfix/virtualtbl/transport.mapを忘れずに実施しておきます。
上記の、/usr/local/etc/postfix/header_checks の簡単な説明ですが、
「DISCARD」で終わる行は、電子メールヘッダ部分にて、左辺のパターンが出現したら「配信しました」と送信元に返答しつつ「メッセージを捨てる」という処理を行い、
「IGNORE」で終わる行は、電子メールヘッダ部分にて、左辺のパターンが出現したら「そのヘッダ行は削除して最終配信先へ送る」という処理を行います。
このファイルに記述された内容は、上から下へ順番に処理しますが、「DISCARD」で記述した行は、「そこで打ち切る」という挙動になるらしいです。
この構成で稼働させているが・・・
どうやら、header_checks の設定が上手く反映できていないみたいなのです。IGNORE で「ヘッダ行削除」の挙動がどうも上手く行っていない模様。
X-Virus.... は上手く行っているが、 X-Spam.... が上手く行かない。。
取り敢えず実害はないのですが、セカンダリメールサーバ経由で受信したメッセージは、
X-Spam... は、受信者から見ると2回出てくることになり、不自然なのでどうにかしたいのです。
バグなのか、設定の問題なのか、、、 困っているところです。