milterを使った効果的な迷惑メール対策 - milter manager

FreeBSDへインストール

FreeBSDへインストール — FreeBSDへのmilter managerのインストール方法

このドキュメントについて

FreeBSDに特化したmilter managerのインストール方法について説明 します。FreeBSDに依存しない一般的なインストール情報は イン ストール を見てください。

FreeBSD 10.0-RELEASEを想定しています。

パッケージのインストール

以下のパッケージをインストールすることにより、関連するパッケー ジもインストールされます。

MTAはPostfixを利用することとします。

% sudo pkg install --yes postfix

milterはspamass-milter、clamav-milter、milter-greylistを使用 することとします。

% sudo pkg install --yes spamass-milter milter-greylist clamav-milter

milter-manager をインストールします。

% sudo pkg install --yes milter-manager

設定

milterの基本的な設定方針は以下の通りです。

UNIXドメインソケットで接続を受け付けるようにします。これは、 セキュリティ面と速度面の理由からです。

milterの実効ユーザも一般ユーザにします。これもセキュリティ面 の理由からです。UNIXドメインソケットはグループでの読み書き権 限を設定します。読み書き権限のあるグループとしてmailグループ を使用し、postfixユーザはmailグループに所属させます。

必要のない配送遅延をできるだけ抑えるため、milter-greylistは S25R にマッチする ときのみ適用します。しかし、これはmilter-managerが自動で行う ため、特に設定する必要はありません。

spamass-milterの設定

まず、spamdの設定をします。

以下のような内容の/usr/local/etc/mail/spamassassin/local.cf を作成します。これで、スパム判定された場合のみ、その詳細をヘッ ダに追加するようになります。

remove_header ham Status
remove_header ham Level

spamdを有効にするため、/etc/rc.confに以下を追加します。

spamd_enable=YES

SMTPクライアントの同時接続数が多い場合は、最大同時接続数を増 やします。デフォルトでは5接続になっています。迷惑メールを送る 多くのSMTPクライアントはmilter-greylistでブロックされて、 SpamAssassinまでは処理がまわってきません。まずは、SMTPクライ アントの同時接続数の1/3程度にしておき、運用後に調整するとよい でしょう。例えば、同時に最大で約100接続ほどのSMTP接続がある 場合は以下のように同時に30接続受け付けるようにするとよいでしょ う。

spamd_flags="-c --max-children=30 "

運用後はmilter managerの統計情報をグラフ化し、調整してくださ い。

Spamassassinのルールファイルを更新してからspamdを起動します。

% sudo sa-update
% sudo /usr/sbin/service sa-spamd start

次にspamass-milterの設定をします。spamass-milterはspamdユー ザ・spamdグループで動かすことにします。

デフォルトではspamass-milterは/var/run/spamass-milter.sockに ソケットファイルを作成します。しかし、/var/run/以下にはroot権 限がないと新しくファイルを作成することができません。そのため、 /var/run/spamass-milter/ディレクトリを作成し、そのディレクト リの所有者をspamdユーザにします。ソケットファイルはそのディレ クトリ以下に作成することにします。

% sudo mkdir /var/run/spamass-milter/
% sudo /usr/sbin/chown spamd:spamd /var/run/spamass-milter

/etc/rc.confに以下を追加します。

spamass_milter_enable="YES"
spamass_milter_user="spamd"
spamass_milter_group="spamd"
spamass_milter_socket="/var/run/spamass-milter/spamass-milter.sock"
spamass_milter_socket_owner="spamd"
spamass_milter_socket_group="mail"
spamass_milter_socket_mode="660"
spamass_milter_localflags="-u spamd -- -u spamd"

spamass-milterを起動します。

% sudo /usr/sbin/service spamass-milter start

clamav-milterの設定

まず、ClamAV本体の設定をします。

/etc/rc.confに以下を追加してclamdとfreshclamを有効にします。

clamav_clamd_enable="YES"
clamav_freshclam_enable="YES"

clamdを起動する前に最新の定義ファイルを取得します。

% sudo /usr/local/bin/freshclam

clamdとfreshclamを起動します。

% sudo /usr/sbin/service clamav-clamd start
% sudo /usr/sbin/service clamav-freshclam start

clamav-milterはデフォルトではclamavユーザ・clamavグループで 起動します。一般ユーザなのでその設定を利用することにし、ソケッ トの書き込み権限のみを変更します。

/etc/rc.confに以下を追加します。

clamav_milter_enable="YES"
clamav_milter_socket_mode="660"
clamav_milter_socket_group="mail"

必要であれば/usr/local/etc/clamav-milter.confを変更します。 例えば、以下のように変更します。

/usr/local/etc/clamav-milter.conf

変更前:

#OnInfected Quarantine
#AddHeader Replace
#LogSyslog yes
#LogFacility LOG_MAIL
#LogInfected Basic

変更後:

OnInfected Reject
AddHeader Replace
LogSyslog yes
LogFacility LOG_MAIL
LogInfected Full

それぞれ以下のような設定です。

OnInfected Reject

ウィルスに感染したメールを受信拒否します。 デフォルトではQuarantineでPostfixのholdキューに溜まりま すが、定期的にholdキューを確認するのでなければ受信拒否し た方がメンテナンスが楽になります。

AddHeader Replace

既存のX-Virus-Scannedヘッダがあっても上書きするようになり ます。この設定を有効にすることにより受信側でのウィルスチェッ クの結果がヘッダに入ることになります。通常、送信側より受信 側の方のチェックの方が信頼できるはずなので(送信側が正しく 報告しているかどうかは確かめられない)、この設定を有効にし ておくとよいでしょう。

LogSyslog yes

syslogにログを出力します。 負荷が大きい場合は無効にするとよいでしょう。

LogFacility LOG_MAIL

syslogのfacilityをLOG_MAILにして、/var/log/maillogにログ を出力します。

LogInfected Full

ウィルスメールを見つけたときに詳細なログを出力します。

clamav-milterを起動します。

% sudo /usr/sbin/service clamav-milter start

milter-greylistの設定

milter-greylistはmailnullユーザ・mailグループで実行します。 mailnullユーザはデフォルト設定ユーザであり、Postfixを使ってい る環境では使用されていないユーザなので、そのまま使うことにし ます。

/usr/local/etc/mail/greylist.conf.sampleを /usr/local/etc/mail/greylist.confにコピーし、以下のような設 定にします。

  • 実行グループをmailnullグループからmailグループにする

  • ソケットファイルにはmailグループでも書き込めるようにする

  • IPアドレスのマッチには前半24ビットのみを使う(送信元が複 数のMTAを利用している場合のGreylistの悪影響を抑えるため)

  • 再送チェック時間を30分後(デフォルト)から10分後に短くす る(Greylistの悪影響を抑えるため)

  • オートホワイトリストの期間を1日(デフォルト)から1週間に 伸ばす(Greylistの悪影響を抑えるため)

  • デフォルトでGreylistを使う

Greylistの悪影響を抑えるために制限を緩めているため、迷惑 メールが通過する確率がやや高くなりますが、誤判定時の悪影響を 抑える方を重視するべきです。Greylistですべての迷惑メールをブ ロックしようとするのではなく、Greylistで検出できない迷惑メー ルはSpamAssassinなど他の手法で対応します。milter managerはそ のように複数のmilterを組み合わせた迷惑メール対策システムの構 築を支援します。

変更前:

socket "/var/milter-greylist/milter-greylist.sock"
user "mailnull:mailnull"
racl whitelist default

変更後:

socket "/var/milter-greylist/milter-greylist.sock" 660
user "mailnull:mail"
subnetmatch /24
greylist 10m
autowhite 1w
racl greylist default

/etc/rc.confに以下を追加します。

miltergreylist_enable="YES"
miltergreylist_runas="mailnull:mail"

milter-greylistを起動します。

% sudo /usr/sbin/service milter-greylist start

milter-managerの設定

milter-managerはmilter-managerユーザで動作させるので、 milter-managerユーザを作成します。

% sudo /usr/sbin/pw groupadd milter-manager
% sudo /usr/sbin/pw useradd milter-manager -g milter-manager -G mail -m

milter-managerはシステムにインストールされているmilterを検出 します。以下のコマンドでspamass-milter、clamav-milter、 milter-greylistを検出していることを確認してください。

% sudo /usr/local/sbin/milter-manager -u milter-manager --show-config

以下のように表示されていれば検出は成功しています。

...
define_milter("milter-greylist") do |milter|
  milter.connection_spec = "unix:/var/milter-greylist/milter-greylist.sock"
  ...
  milter.enabled = true
  ...
end
..
define_milter("clamav-milter") do |milter|
  milter.connection_spec = "unix:/var/run/clamav/clmilter.sock"
  ...
  milter.enabled = true
  ...
end
..
define_milter("spamass-milter") do |milter|
  milter.connection_spec = "unix:/var/run/spamass-milter/spamass-milter.sock"
  ...
  milter.enabled = true
  ...
end
..

milterの名前、ソケットのパス、enabledがtrueになっていることを 確認してください。異なっていた場合は、 設定 を参考に /usr/local/etc/milter-manager/milter-manager.confを編集してく ださい。ただ、できれば、設定を変更せずに使用できるようにした いと考えています。もし、検出できなかった環境のことを教えても らえれば、milter-manager.confを編集しなくとも使用できるように 検出方法を改良することができるかもしれません。

FreeBSD上ではデフォルトでは /var/run/milter-manager/milter-manager.sockというソケットファ イルを作成します。そのため、事前に/var/run/milter-manager/ディ レクトリを作成しておく必要があります。

% sudo mkdir -p /var/run/milter-manager
% sudo /usr/sbin/chown -R milter-manager:milter-manager /var/run/milter-manager

milter-managerの設定が完了したので、起動の設定をします。

/etc/rc.confに以下を追加してmilter-managerを有効にします。

miltermanager_enable="YES"

milter-managerを起動します。

% sudo /usr/sbin/service milter-manager start

/usr/local/bin/milter-test-serverで起動の確認をすることがで きます。

% sudo -u milter-manager milter-test-server -s unix:/var/run/milter-manager/milter-manager.sock

このように表示されれば成功です。

status: pass
elapsed-time: 0.128 seconds

起動に失敗しているときはこのように表示されます。

Failed to connect to unix:/var/run/milter-manager/milter-manager.sock: No such file or directory

失敗している時はログを頼りに問題を解決します。--verboseオプショ ンをつけると詳細なログが表示されます。また、デーモンプロセス にしないことにより、標準出力にもログが表示されます。

/etc/rc.confに以下を追加します。これにより、標準出力に詳細な ログが表示されます。

miltermanager_debug="YES"

milter-managerをもう一度起動します。

% sudo /usr/sbin/service milter-manager restart

問題があればログが表示されます。起動しているmilter-managerは Ctrl+cで終了することができます。

問題が解決した後は、/etc/rc.confに追加した milter_manager_debugをコメントアウトし、デーモンプロセスで起 動するように戻してから、milter-managerを起動しなおしてくださ い。


Postfixの設定

まず、postfixユーザをmailグループに追加します。

% sudo /usr/sbin/pw groupmod mail -m postfix

次に、milterの設定をします。

/usr/local/etc/postfix/main.cfに以下を追加します。

milter_protocol = 6
milter_default_action = accept
milter_mail_macros = {auth_author} {auth_type} {auth_authen}

それぞれ以下のような設定です。

milter_protocol = 6

milterプロトコルのバージョン6を使います。

milter_default_action = accept

milterに接続できないときはメールを受信します。milterとの 通信に問題がある場合でもメールサーバの機能を停止させない ためには、この設定が有効です。ただし、milterを復旧させる までの間に、スパムメールやウィルスメールを受信してしまう 可能性が高くなります。

迅速に復旧できる体制がととのっているのであれば、acceptで はなく、tempfailを指定するのがよいでしょう。デフォルトで はtempfailになっています。

milter_mail_macros = {auth_author} {auth_type} {auth_authen}

SMTP Auth関連の情報をmilterに渡します。milter-greylistな どが使用します。

続いて、Postfixにmilter-managerを登録します。spamass-milter、 clamav-milter、milter-greylistはmilter-manager経由で利用する ので、Postfixにはmilter-managerだけを登録すればよいことに注 意してください。

/usr/local/etc/postfix/main.cfに以下を追加します。

smtpd_milters = unix:/var/run/milter-manager/milter-manager.sock

Postfixの設定を再読み込みします。

% sudo /usr/sbin/service postfix reload

以上で設定は完了です。

milter-managerはいくつかsyslogにログを出力します。mail.info に出力するので、正常に動作していればmilter-managerからのログ が/var/log/maillogにログがでるはずです。テストメールを送信し て確認してください。

まとめ

milter-managerを導入することにより、milterとPostfixを連携さ せる手間が削減されています。

通常であれば、Postfixのsmtpd_miltersにspamass-milter、 clamav-milter、miler-greylistのソケットを指定する必要がありま す。しかし、milter-managerを導入することにより、 milter-managerのソケットのみを指定するだけですむようになりま した。各milterのソケットはmilter-managerが検出するため、typo などの小さいですが気づきにくいミスに惑わされることがなくなり ます。

また、ここでは触れませんでしたが、milter-managerは /etc/rc.conf内のXXX_enabled="NO"の設定も検出します。そのため、 milterを無効にしたい場合は、他のサーバプロセスと同様に以下の ような手順になります。

% sudo /usr/sbin/service XXX stop
% sudo vim /etc/rc.conf # XXX_enabled="YES" => XXX_enabled="NO"

後は、milter-managerの設定を再読み込みすれば、milterが無効に なったことを検出し、無効になったmilterとは接続しなくなります。

% sudo /usr/sbin/service milter-manager reload

Postfixのmain.cfを変更する必要はありません。

FreeBSD上でmilterを複数使っている場合は、milter-managerを導入 して、管理コストを削減することができます。

milter managerは運用を支援するツールも提供しています。インス トールは必須ではありませんが、それらを導入することで運用コス トを削減することができます。それらのツールもインストールする 場合は FreeBSDへインストール(任 意) を参照してください。