Mac OS X Server での迷惑メール対策
(abmilter と Sieve による方法)

2013/10/10, 2013/10/11, 2013/11/25


Contents

概要

Mac OS X Server (10.8.4 Mountain Lion) で、abmilter と Sieve を用いた迷惑メール対策の方法を説明します。

abmilterの導入

abmilter とは、迷惑メール対策ツール「abmail」を milter アプリケーションとして利用できるようにするプログラムです。

以下の説明においては、/opt/local/sbin に abmilter がインストールされているものとします。他のディレクトリにインストールされている場合は、/opt/local/sbin を abmilter がインストールされているディレクトリに適宜読み替えてください。abmilter のインストールに関しては以下を参考にしてください。

自動起動の設定

まず、abmilterを自動起動させるため、以下のパスに plist ファイルを作成します。

/Library/LaunchDaemons/jp.co.aihara.abmilter.plist

plist ファイル jp.co.aihara.abmilter.plist の内容は次のようにします。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>Label</key>
	<string>jp.co.aihara.abmilter</string>
	<key>Disabled</key>
	<false/>
	<key>UserName</key>
	<string>postfix</string>
	<key>GroupName</key>
	<string>mail</string>
	<key>ProgramArguments</key>
	<array>
		<string>/opt/local/sbin/abmilter</string>
		<string>-socket=unix:/Library/Server/Mail/Data/spool/private/abmilter</string>
		<string>-action=addheader</string>
		<string>-b</string>
		<string>-g</string>
		<string>-d</string>
		<string>-v</string>
		<string>-vv</string>
		<string>-vvv</string>
	</array>
	<key>OnDemand</key>
	<false/>
</dict>
</plist>

ここで、UserName と GroupName は、ProgramArguments の -socket= で指定されている postfix との通信のためのソケット

/Library/Server/Mail/Data/spool/private/abmilter
を作成できる権利を持つユーザ、グループである必要があるため、それぞれ postfix と mail にしています。

また、ProgramArguments で指定されている -action=addheader によって、abmilter の動作は、迷惑メールと判定されたメールに "X-Abmail-Flag: Yes" というヘッダ情報を付加する設定になります。

手動での起動と停止

上記で Mac の起動時に自動的に abmilter が起動されるようになりますが、Mac を再起動せずとも、以下のコマンドで手動で abmilter を起動することができます。

$ sudo launchctl load /Library/LaunchDaemons/jp.co.aihara.abmilter.plist

なお、abmilter を停止するには、以下のコマンドを実行します。

$ sudo launchctl unload /Library/LaunchDaemons/jp.co.aihara.abmilter.plist

abmail 設定ファイルの反映

また、これは運用中の話になりますが、/opt/local/etc/abmail/*.lst を更新したときは、それを反映されるため、上記のコマンドで一度 abmilter を停止して、再度起動してください。

postfix の設定

次に、postfix の設定ファイル

/Library/Server/Mail/Config/postfix/main.cf
に、以下の設定パラメータを追加します。

milter_default_action = accept
smtpd_milters = unix:/Library/Server/Mail/Data/spool/private/abmilter

milter_default_action は、なんらかのトラブルで milter が使えないときの動作を指定するパラメータで、accept は milter が存在しないかのように進める設定です。

smtpd_milters は、milter との通信のためのソケットを指定するパラメータです。plist ファイル jp.co.aihara.abmilter.plist の ProgramArguments において、-socket= で指定されているソケットと合わせてください。

main.cf の設定を変更したら、Server.app からメールを一度停止して、再度起動します。これで、postfix から abmilter が使えるようになり、再起動後に届くメールが迷惑メールと判定されると "X-Abmail-Flag: Yes" というヘッダ情報が付加されるようになります。

異常終了時の再起動

なんらかの理由で abmilter が異常終了した場合、プロセスが存在しないにもかかわらず、ソケットが残っていることがあります。その場合、以下の手順でソケットを削除して、abmilter を再起動させてください。

まず、以下のコマンドで abmilter プロセスが存在しているか確認します。

$ sudo ps -ef | grep abmilter

次に、以下のコマンドで abmilter ソケットが存在しているか確認します。

$ sudo ls /Library/Server/Mail/Data/spool/private/abmilter

abmilter プロセスが存在せず、ソケットが存在している場合は異常な状態ですので、以下のようにソケットを削除してから、abmilter を再起動させてください。

$ sudo launchctl unload /Library/LaunchDaemons/jp.co.aihara.abmilter.plist
$ sudo rm /Library/Server/Mail/Data/spool/private/abmilter
$ sudo launchctl load /Library/LaunchDaemons/jp.co.aihara.abmilter.plist

迷惑メールの spam フォルダへの自動振り分け

Mac OS X Server では、メールフィルタリング言語の一つである Sieve が利用可能で、特定のパスに Sieve スクリプトファイルを置いておくことで、サーバサイドで、メールを指定したimapフォルダへ振り分けたり、転送することなどができます。
Sieve スクリプトを置いておくパスなど、Mac OS X Server 10.8.4 での Sieve の利用方法は以下を参照してください。

迷惑メール自動振り分け Sieve スクリプト

では、abmilter と連係して、迷惑メールを spam.受信年月日 フォルダへ自動的に振り分ける Sieve スクリプトの例を以下に記します。

require "fileinto";
require "mailbox";
require "variables";
require "date";

if header :is "X-Abmail-Flag" "Yes" {
   if currentdate :matches "year"  "*" { set "year"  "${1}"; }
   if currentdate :matches "month" "*" { set "month" "${1}"; }
   if currentdate :matches "day"   "*" { set "day"   "${1}"; }
   fileinto :create "spam.${year}.${month}.${day}";
}

この例では、メールヘッダに "X-Abmail-Flag: Yes" があった場合に、spam.受信年月日 という名前のフォルダにそのメールを振り分けます。ただし、受信年月日は YYYY.MM.DD という形式です。例えば、2013年10月1日であれば spam.2013.10.01 となります。また、そのフォルダが存在しない場合は自動的に作られます。このフォルダはユーザのメールソフトからは spam/年/月/日/ のように階層構造となって見えます。

Sieve スクリプトの作成

さて、Sieve スクリプトを置くパスにはユーザの GeneratedUID が含まれており、それを調べて手動で作成するのは手間です。そこで、それを解消する一例を以下に示します。これは、ログイン名を指定するだけで、必要なディレクトリとスクリプトファイルを作成してくれるシェルスクリプトとスケルトンファイルです。さらに、メールの転送を行うようにするスクリプトを作成することもできます。
これらを /opt/local にインストールした場合には特に修正の必要はありませんが、それ以外にした場合、インストールしたディレクトリに合わせて、gen-dovecot.sieve.sh 内の変数 skel_dir を変更してください。

上記 tarball に含まれるファイルのリストを以下に記します。

bin/gen-dovecot.sieve.sh
etc/skel/dovecot.sieve

このスクリプトは以下のように使用します。
まず、--dry-run オプションを付けて、

$ /opt/local/bin/gen-dovecot.sieve.sh --dry-run -sw_antispam on -u $LOGANME
とします。特に問題がなければ、作成されるファイルやディレクトリの名前などが表示されますので、確認しておきましょう。
その後、実際に Sieve スクリプトを作成するには、
$ sudo /opt/local/bin/gen-dovecot.sieve.sh -sw_antispam on -u $LOGNAME
とします。
既存の Sieve スクリプトを上書きしないように、この段階では dovevot.sieve-YYYYMMDD のように作成日が付加されたファイ名で作られます。そして、スクリプトファイルにエラーがないかチェックするためコンパイルが行われ、正常にコンパイルができていれば dovecot.sieve-YYYYMMDD.svbin というファイルが作られている筈です。それを確認したら、dovecot.sieve-YYYYMMDD を dovecot.sieve という名前に変更するかコピーしてください。

Mac OS X Server 10.6.8 Snow Leopard の場合

ここまで Mac OS X Server 10.8.4 での方法を説明してきましたが、それ以外でも、abmilter と Sieve が利用可能であれば同様の対策が可能です。
ただし、Mac OS X Server はバージョンによって設定ファイルなどのパスに違いがあるので、それに合わせる必要があります。

具体的に、Mac OS X Server 10.6.8 Snow Leopard の場合は以下のようになりますので、これに合わせて前述の説明を適宜読み替えてください。

そして、Mac OS X Server 10.6.8 で Sieve を利用するには、Server.app のメールの設定で、フィルタタブにある Server-side mail rules を有効にしておく必要があります。
また、Mac OS X Server 10.6.8 では Sieve の拡張がほとんど使えません。そのため、前述のように日付毎の spam フォルダに迷惑メールを振り分けることができません。また、フォルダが存在しなかった場合に自動的に作成してくれる拡張もないため、予め振り分け先のフォルダを作成しておく必要があります。

以上を踏まえると、Mac OS X Server 10.6.8 では、予め作成してある spam フォルダに迷惑メールを振り分けるという方法を採用するのがよいと考えられ、それに対応した Sieve スクリプトは以下の例のようになります。

require "fileinto";

if header :is "X-Abmail-Flag" "Yes" {
   fileinto "spam";
}

Copyright (C) 2013 by Jun Takahashi