# -*- rd -*-

= CentOS 6へインストール --- CentOS 6へのmilter managerのインストール方法

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

CentOS 6に特化したmilter managerのインストール方法について説明します。
CentOS 7に特化したmilter managerのインストール方法は((<CentOS 7へインス
トール|install-to-centos.rd.ja>))を見てください。
CentOS 5に特化したmilter managerのインストール方法は((<CentOS 5へインス
トール|install-to-centos5.rd.ja>))を見てください。CentOSに依存しない一
般的なインストール情報は((<インストール|install.rd.ja>))を見てください。

CentOSのバージョンは6.4を想定しています。また、root権限での
実行はsudoを使用することを想定しています。sudoを利用していな
い場合はsuなどroot権限で実行してください。

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

MTAは標準でインストールされているPostfixを利用することとします。

milterはspamass-milter、clamav-milter、milter-greylistを使用
することとします。各milterはEPELにあるものを利用します。

32bit環境の場合は以下のようにEPELを登録します。

  % sudo yum install -y http://ftp.jaist.ac.jp/pub/Linux/Fedora/epel/6/i386/epel-release-6-8.noarch.rpm

64bit環境の場合は以下のようにEPELを登録します。

  % sudo yum install -y http://ftp.jaist.ac.jp/pub/Linux/Fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm

リポジトリを登録したらmilterをインストールします。

  % sudo yum install -y spamass-milter clamav-milter milter-greylist

また、グラフ作成用にRRDtoolもインストールします。

  % sudo yum install -y rrdtool

== milter managerパッケージのインストール

milter managerはyumでインストールできます。

まず、yumリポジトリを登録します。

  % curl -s https://packagecloud.io/install/repositories/milter-manager/repos/script.rpm.sh | sudo bash

参考: ((<URL:https://packagecloud.io/milter-manager/repos/install>))

登録が完了したらmilter managerをインストールできます。

  % sudo yum install -y milter-manager

== 設定

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

接続はIPv4ソケットでローカルホストからのみ接続を受け付けるよ
うにします。

必要のない配送遅延をできるだけ抑えるため、milter-greylistは
((<S25R|URL:http://gabacho.reto.jp/anti-spam/>))にマッチする
ときのみ適用します。しかし、これはmilter-managerが自動で行う
ため、特に設定する必要はありません。

SELinux を有効にしたまま milter-manager を使用するためには多くの設定を
変更する必要があるため、ここでは SELinux のポリシーモジュールのうち
postfix と milter を無効にして設定を進めることにします。

  % sudo semodule -d postfix
  % sudo semodule -d milter

# TODO: milter のポリシーが 1.3.1 以降になったら semanage による
# milter_port_t の設定について調査してこのセクションを更新する
# semanage port -a -t milter_port_t -p tcp <port>

=== spamass-milterの設定

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

デフォルトの設定ではスパム判定されたメールは件名に「[SPAM]」
が追加されます。もし、これが嫌な場合は
/etc/mail/spamassassin/local.cfを以下のように変更します。

変更前:
  rewrite_header Subject [SPAM]

変更後:
  # rewrite_header Subject [SPAM]

また、スパム判定された場合のみ、その詳細をヘッダに追加するよ
うにする場合は以下を追加します。

  remove_header ham Status
  remove_header ham Level

システム起動時にspamdを起動するようにします。

  % sudo /sbin/chkconfig spamassassin on

spamdを起動します。

  % sudo run_init /sbin/service spamassassin start

spamass-milterは以下のように設定します。

  * ソケットを変更する。
  * 本文変更機能を無効にする。
  * スコア15以上で拒否する。

/etc/sysconfig/spamass-milterを以下のように変更します。

変更前:
  #SOCKET=/var/run/spamass.sock
  #EXTRA_FLAGS="-m -r 15"

変更後:
  SOCKET="inet:11120@[127.0.0.1]"
  EXTRA_FLAGS="-m -r 15"

システム起動時にspamass-milterを起動するようにします。

  % sudo /sbin/chkconfig spamass-milter on

spamass-milterを起動します。

  % sudo run_init /sbin/service spamass-milter start

=== clamav-milterの設定

ClamAVで使用するウィルス定義を更新してからclamdを起動します。

  % sudo freshclam
  % sudo run_init /sbin/service clamd start

clamav-milterのソケットを変更します。

/etc/clamav-milter.confを以下のように変更します。

変更前:
  #MilterSocketMode 0660

変更後:
  MilterSocketMode 0660

clamav-milterを起動します。

  % sudo run_init /sbin/service clamav-milter start

=== milter-greylistの設定

/etc/mail/greylist.confを編集し、以下のような設定にします。

  * IPアドレスのマッチには前半24ビットのみを使う（送信元が複
    数のMTAを利用している場合のGreylistの悪影響を抑えるため）
  * 再送チェック時間を30分後（デフォルト）から10分後に短くす
    る（Greylistの悪影響を抑えるため）
  * オートホワイトリストの期間を1日（デフォルト）から1週間に
    伸ばす（Greylistの悪影響を抑えるため）
  * デフォルトでGreylistを使う

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

変更前:
  socket "/var/run/milter-greylist/milter-greylist.sock"
  # ...
  racl whitelist default

変更後:
  socket "/var/run/milter-greylist/milter-greylist.sock" 660
  # ...
  subnetmatch /24
  greylist 10m
  autowhite 1w
  racl greylist default

# TODO: libspf2サポートつきのmilter-greylistがEPELで使えるようになっ
# たらこの設定を追加する。milter-greylist-4.5.1 時点ではまだ使えない。
# sm_macro "trusted_domain" "{trusted_domain}" "yes"
# racl whitelist sm_macro "trusted_domain" spf pass
# racl greylist sm_macro "trusted_domain" not spf pass

/var/run/milter-greylist/ディレクトリはmilter-greylistの実行ユーザーで
あるgrmilterユーザーのみがアクセスできるようになっています。
milter-managerも/var/run/milter-greylist/以下にあるソケットファイルにア
クセスできるようにします。

  % sudo chmod +rx /var/run/milter-greylist/

システム起動時にmilter-greylistを起動するようにします。

  % sudo /sbin/chkconfig milter-greylist on

milter-greylistを起動します。

  % sudo run_init /sbin/service milter-greylist start

=== milter-managerの設定

まず、clamav-milterのソケットにアクセスできるように
milter-managerをclamグループに加えます。

  % sudo usermod -G clam -a milter-manager

同様に、milter-greylistのソケットにアクセスできるように
milter-managerをgrmilterグループに加えます。

  % sudo usermod -G grmilter -a milter-manager

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

  % sudo /usr/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/clamav/clmilter.socket"
    ...
    milter.enabled = true
    ...
  end
  ...
  define_milter("spamass-milter") do |milter|
    milter.connection_spec = "inet:11120@[127.0.0.1]"
    ...
    milter.enabled = true
    ...
  end
  ...

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

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

  % sudo run_init /sbin/service milter-manager restart

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

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

/etc/sysconfig/milter-managerに以下の内容を追加します。これによ
り、標準出力に詳細なログが表示されます。

  OPTION_ARGS="--verbose --no-daemon"

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

  % sudo run_init /sbin/service milter-manager restart

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

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

=== Postfixの設定

まず、milter managerのソケットにアクセスできるように、
postfixユーザーをmilter-managerグループに加えます。

  % sudo usermod -G milter-manager -a postfix

次に、Postfixを有効にします。

  % sudo /sbin/chkconfig --add postfix
  % sudo run_init /sbin/service postfix start

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

/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だけを登録すればよいことに注
意してください。

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

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

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

  % sudo /etc/init.d/postfix reload

以上で設定は完了です。

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

== まとめ

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

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

また、ここでは触れませんでしたが、milter-managerは
/sbin/chkconfig --addされているかどうかも検出します。そのため、
milterを無効にしたい場合は、他のサービスと同様に以下のような
手順になります。

  % sudo /sbin/service milter-greylist stop
  % sudo /sbin/chkconfig --del milter-greylist

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

  % sudo /sbin/service milter-manager reload

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

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

milter managerは運用を支援するツールも提供しています。インス
トールは必須ではありませんが、それらを導入することで運用コス
トを削減することができます。それらのツールもインストールする
場合は((<CentOSへインストール（任
意）|install-options-to-centos.rd.ja>))を参照してください。
