FreeBSD/新vpopmail

新vpopmail

構成

vpopmail 5.4.26
qmail 1.03
mysql 5.1.24
qmail-scanner 2.01
ClamAV 0.94
spamassassin 3.2.5

qmailインストール

qmailには様々なパッチが存在しますが、とりあえずこの4つのパッチを当ててインストールします。

パッチ説明
qmail-date-localtime.patchRecieved フィールドの日時は、標準では GMT が入る。 これをローカルタイム(JST) にするには、qmail-date-localtime patch 当てる必要がある。
qmailqueue-patch環境変数QMAILQUEUEによりqueue登録プログラムを変更する。qmail-scanner導入のため必要。portにてmake時に WITH_QMAILQUEUE_PATCH=yes を指定することにより導入。
qmail-smtpd-relay-reject'%'等を含むアカウントへのメール受信を禁止し、relayを抑止する。このパッチを当てることにより、受信後エラーメール返信の手順を行わず、最初の受信時にエラーとするようになる。
qmail-large-dns.patchDNS の MX レコードが 512byte 以上の応答(RFC違反らしい)を返してくる AOL などに対応するためのパッチ。portにてデフォルトで導入される。

qmailの本体をportsを使って利用する準備に入る。portsを使うことで、qmailが必要とするシステムユーザの追加やMTAの切り替えが簡単に行える。ひとまずコンパイル前の状態で処理を止め、さきほど入手したパッチを適用する。

# cd /usr/ports/mail/qmail
# make patch WITH_QMAILQUEUE_PATCH=yes MAIN_QMAIL_DATE_LOCALTIME=yes
# cd work/qmail-1.03/
# fetch http://www.qmail.org/qmail-smtpd-relay-reject
# patch -p1 < qmail-smtpd-relay-reject
Hmm...  Looks like a unified diff to me...
The text leading up to this was:
--------------------------
|--- orig/qmail-smtpd.c  Mon Jun 15 06:53:16 1998
|+++ qmail-smtpd.c       Sat Feb  9 12:07:19 2002
--------------------------
Patching file qmail-smtpd.c using Plan A...
Hunk #1 succeeded at 53.
Hunk #2 succeeded at 217.
Hunk #3 succeeded at 266.
Hmm...  Ignoring the trailing garbage.
done

portsに展開されたファイルへのパッチの適用が終わったら、コンパイルとインストールを続けて行う。

# cd ../..
# make
# make install

sendmailの停止

# vi /etc/rc.conf
------------------------------
sendmail_enable="YES"
        ↓
sendmail_enable="NONE"
------------------------------

sendmailの代わりにqmailが呼び出されるようにリンクを張ります。

# mv /usr/sbin/sendmail /usr/sbin/sendmail.old 
# ln -s /var/qmail/bin/sendmail /usr/sbin/sendmail

vpopmailインストール

# cd /usr/ports/mail/vpopmail
# make WITH_MYSQL=yes WITH_CLEAR_PASSWD=yes \
WITH_DOMAIN_QUOTAS=yes clean install

▼インストールされると、/usr/local/vpopmail/etc/vpopmail.mysql に以下のように書かれているはず。
これをいじれば設定変更できる。
ここでは例として、DB:vpopmaildb USER:vpopmailuser PASS:vpoppmailpassとします。
MySQLはインストールされている事を前提としております。
インストールは ⇒ ここ参照

# vi /usr/local/vpopmail/etc/vpopmail.mysql
-------------------------------------------------
localhost|0|vpopmailuser|vpopmailpass|vpopmaildb
localhost|0|vpopmailuser|vpopmailpass|vpopmaildb
-------------------------------------------------

▼データベース関連は自動的には作ってくれないので、作る必要がある。

$ mysql -u root -p
> CREATE DATABASE vpopmaildb;
> GRANT ALL ON vpopmaildb.* TO vpopmailuser@localhost IDENTIFIED BY 'vpopmailpass';

▼localsがないとエラーが出力されるので、localsを作成。

# touch /var/qmail/control/locals

ClamAVのインストール

# cd /usr/ports/security/clamav
# make install

qmail-scannerで動作させるように修正

# vi /usr/local/etc/clamd.conf
----------------------------------------
User clamav
    ↓変更
User qscand

rc.conf

# ClamAV
clamav_clamd_enable="YES"
clamav_freshclam_enable="YES"

qmailadminのインストール

# cd /usr/ports/mail/qmailadmin
# make install CGIBINDIR=www/cgi-bin WEBDATADIR=www/data

Apacheの設定

Alias /cgi-bin/ /usr/local/www/cgi-bin/
Alias /data/ /usr/local/www/data/
<Directory "/usr/local/www/cgi-bin/">
    AllowOverride None
    Options ExecCGI
    Order allow,deny
    Allow from all
</Directory>
<Directory "/usr/local/www/data/">
    AllowOverride None
    Options None
    Order allow,deny
    Allow from all
</Directory>

Spamassassinのインストール(日本語対応)

MeCabのインストール

# cd /usr/ports/japanese/mecab
# make WITH_CHARSET=utf-8 install

mecab-ipadicのインストール

# cd /usr/ports/japanese/mecab-ipadic
# make WITH_CHARSET=utf-8 install

Text-MeCabのインストール

# cd /usr/ports/japanese/p5-Text-MeCab
# make ENCODING=utf-8 install

Encode-Detectのインストール

# cd /usr/ports/converters/p5-Encode-Detect
# make install

SpamAssassinのインストール

# cd /usr/ports/japanese/p5-Mail-SpamAssassin
# make install

rc.conf

# SpamAssassin
spamd_enable="YES"
spamd_flags="-s /var/log/spam.log -c -d -q -x -r /var/run/spamd/spamd.pid -v -u vpopmail"

local.cfの作成

うちで使っているlocal.cfを置いておきます。 filelocal.cf

# cd /usr/local/etc/mail/spamassassin/local.cf.sample /usr/local/etc/mail/spamassassin/local.cf
# vi /usr/local/etc/mail/spamassassin/local.cf
-----------------------コメントアウト解除------------------------------
normalize_charset 1

SpamAssassinの残り処理

# cp /usr/local/etc/mail/spamassassin/tokenizer.pre.sample /usr/local/etc/mail/spamassassin/tokenizer.pre
# vi /usr/local/etc/mail/spamassassin/tokenizer.pre
-----------------------コメントアウト解除------------------------------
loadplugin Mail::SpamAssassin::Plugin::Tokenizer::MeCab

qmail-scannerのインストール

# cd /usr/ports/mail/qmail-scanner
# make QMAILSCAN_SCANNERS="clamdscan,verbose_spamassassin" install
# chmod +s /usr/local/bin/qmail-scanner-queue.pl

文字化け対策

qmail-scanner のインストール時に、--lang ja_JP.EUC で、管理者宛のメッセージは日本語化されるのですが、ウィルス検出した、メールの Subject が日本語だと、その部分が文字化けしてしまいます。

この対策として、/usr/local/bin/qmail-scanner-queue.pl を2箇所ほど修正します。

まず、1箇所目は、sub email_sender { という個所を探してその関数の

open(SM,"|$qmailinject -h -f ''")||&tempfail("cannot open $qmailinject for sending quarantine report - $!");
                               ↓
open(SM,"|/usr/local/bin/nkf -j|$qmailinject -h -f ''")||&tempfail("cannot open $qmailinject for sending quarantine report - $!");

もう一箇所は、sub email_recips { という関数の

open(SM,"|$qmailinject -h -f ''")||&tempfail("cannot open $qmailinject for sending quarantine report - $!");
                               ↓
open(SM,"|/usr/local/bin/nkf -j|$qmailinject -h -f ''")||&tempfail("cannot open $qmailinject for sending quarantine report - $!");

と変更してください。

これで、nkf によって Subject も日本語化されるます。

qmail-scannerのバージョンの更新

crontabに下記を追加

# qmail-scanner-version
00 4 * * * root /usr/local/bin/qmail-scanner-queue.pl -z

ウィルスを発見した場合の通知先をadminに変更

# vi /usr/local/bin/qmail-scanner-queue.pl
--------------------------------------------
my $NOTIFY_ADDRS='admin';

tcp.smtpの作成

# cat /usr/local/vpopmail/etc/tcp.smtp

# 127.0.0.1からはすべてパス
127.:allow,RELAYCLIENT="",RBLSMTPD="",QMAILQUEUE="/var/qmail/bin/qmail-queue"
#:allow,RELAYCLIENT="",RBLSMTPD="",QMAILQUEUE="/var/qmail/bin/qmail-queue"
#
# 内部ローカルからはSpamAssassinを通さずQmail-Scannerのチェックのみ行う。
# (SpamAssassinはRELAYCLIENT変数がコントロール)
192.168.1.:allow,RELAYCLIENT="",RBLSMTPD="",QMAILQUEUE="/usr/local/bin/qmail-scanner-queue.pl"
#:allow,RELAYCLIENT="",RBLSMTPD="",QMAILQUEUE="/usr/local/bin/qmail-scanner-queue.pl"
#
# その他はすべてQmail-Scanner、SpamAssassinでチェックする
:allow,QMAILQUEUE="/usr/local/bin/qmail-scanner-queue.pl"

起動スクリプト

#!/bin/sh

# Using splogger to send the log through syslog.
# Using qmail-local to deliver messages to Maildir format by default

case "$1" in
start)
        echo -n " STEP 1 : CDB   "
        /usr/local/bin/tcprules /usr/local/vpopmail/etc/tcp.smtp.cdb \
                /usr/local/vpopmail/etc/tcp.smtp.tmp < /usr/local/vpopmail/etc/tcp.smtp

        echo -n " STEP 2 : qmail   "
        exec env - PATH="/var/qmail/bin:$PATH" \
                /var/qmail/bin/qmail-start ./Maildir/ \
                splogger qmail&

        exec env - PATH="/var/qmail/bin:$PATH" \
                /usr/local/bin/tcpserver -v -x /usr/local/vpopmail/etc/tcp.smtp.cdb -R -H \
                -u 82 -g 81 0 smtp /var/qmail/bin/qmail-smtpd 2>&1 | /var/qmail/bin/splogger smtp 3 &

        echo " STEP 3 : POP3"
        /usr/local/bin/tcpserver -R -H 0 pop3 \
                /var/qmail/bin/qmail-popup ma21.ath.cx \
                /usr/local/vpopmail/bin/vchkpw \
                /var/qmail/bin/qmail-pop3d Maildir 2>&1  | /var/qmail/bin/splogger pop3 3 &

        exit 0
        ;;
stop)
        exec killall qmail-send tcpserver
        ;;
*)
        echo "Usage: `basename $0` {start|stop}" >&2
        exit 64
        ;;
esac

vpopmailの仕組み

http://www.bugbearr.jp/?cmd=read&page=FreeBSD%2Fvpopmail