## FreeBSDへインストール

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

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

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

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

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

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

    % sudo /usr/local/sbin/portupgrade -NRr ruby18-glib2
    % sudo /usr/local/sbin/portupgrade -NRr -m 'WITH_RUBY_MODULE=true' rrdtool

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

    % sudo /usr/local/sbin/portupgrade -NRr postfix

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

    % sudo /usr/local/sbin/portupgrade -NRr spamass-milter milter-greylist
    % sudo /usr/local/sbin/portupgrade -NRr -m 'WITH_MILTER=true' clamav

## ビルドとインストール

~/src/以下で作業をすることとします。また、/usr/local/以下にインストールします。

    % mkdir -p ~/src/
    % cd ~/src/
    % fetch http://downloads.sourceforge.net/milter-manager/milter-manager-1.2.0.tar.gz
    % tar xvzf milter-manager-1.2.0.tar.gz
    % cd milter-manager-1.2.0
    % ./configure CFLAGS="-I/usr/local/include"
    % gmake
    % sudo gmake install

## 設定

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

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

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

ここでは、milterはmailnullユーザで動かします。milter毎に異なるユーザを作成した方がよいのですが、以下の理由からmailnullユーザで動かすこととしました。

- デフォルトで作成されているユーザなので追加の設定が必要ない

- SendmailではなくPostfixを使用しているため、mailnullユーザは使用されていない

ただし、milter-managerはmilter-managerユーザで動かします。

必要のない配送遅延をできるだけ抑えるため、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

spamdを起動します。

    % sudo /usr/local/etc/rc.d/sa-spamd start

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

    % sudo mkdir /var/run/milter/
    % sudo /usr/sbin/chown mailnull:mailnull /var/run/milter

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

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

spamass-milterを起動します。

    % sudo /usr/local/etc/rc.d/spamass-milter start

### clamav-milterの設定

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

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

    clamav_clamd_enable="YES"
    clamav_freshclam_enable="YES"

clamdとfreshclamを起動します。

    % sudo /usr/local/etc/rc.d/clamav-clamd start
    % sudo /usr/local/etc/rc.d/clamav-freshclam start

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

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

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

clamav-milterを起動します。

    % sudo /usr/local/etc/rc.d/clamav-milter start

### milter-greylistの設定

/usr/local/etc/mail/greylist.conf.sampleを/usr/local/etc/mail/greylist.confにコピーし、デフォルトでGreylistを使うように変更します。

変更前:

    racl whitelist default

変更後:

    racl greylist default

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

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

また、/etc/rc.conf.d/miltergreylistを作成し、ソケットファイルのパーミッションを設定します。sleep 1はmilter-greylistの起動待ちのためです。もし、1秒では足りない場合は、/usr/local/etc/rc.d/clamav-milterのようにもう少し賢くする方がよいと思います。

/etc/rc.conf.d/miltergreylist

    start_postcmd=start_postcmd

    start_postcmd() {
      sleep 1
      /bin/chmod g+w $miltergreylist_sockfile
      /usr/bin/chgrp mail $miltergreylist_sockfile
    }

milter-greylistを起動します。

    % sudo /usr/local/etc/rc.d/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

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/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:mail /var/run/milter-manager

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

FreeBSD用の起動スクリプトが/usr/local/etc/milter-manager/rc.d/milter-managerにインストールされています。/usr/local/etc/rc.d/以下にシンボリックリンクを作成し、自動起動するようにします。

    % cd /usr/local/etc/rc.d/
    % sudo ln -s /usr/local/etc/milter-manager/rc.d/milter-manager ./

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

    milter_manager_enable="YES"

milter-managerを起動します。

    % sudo /usr/local/etc/rc.d/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に以下を追加します。これにより、標準出力に詳細なログが表示されます。

    milter_manager_debug="YES"

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

    % sudo /usr/local/etc/rc.d/milter-manager start

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

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

### Postfixの設定

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

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

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

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

    milter_protocol = 6 # Postfix 2.5以上の場合
    milter_default_action = accept
    milter_mail_macros = {auth_author} {auth_type} {auth_authen}

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

milter_protocol = 6 | milterプロトコルのバージョン6を使います。このバージョンはSendmail 8.14のデフォルトです。ただし、バージョン6はPostfix 2.5以上でのサポートなので、Postfix 2.4以下を使用している場合はこのオプションは指定しないでください。
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-milterを登録します。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/local/etc/rc.d/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/local/etc/rc.d/XXX stop
    % sudo vim /etc/rc.conf # XXX_enabled="YES" => XXX_enabled="NO"

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

    % sudo /usr/local/etc/rc.d/milter-manager reload

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

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