FreeBSD/vpopmail

vpopmail + qmail + MySQL + Spamassassin

環境

FreeBSD 6.0-Release
vpopmail-5.4.10_5
qmail-1.03_4
qmailadmin-1.2.7
mysql-4.0.26
qmail-scanner-1.25_2
clamav-0.88.4

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インストール

MySQLとの連携するので、WITH_MYSQLをつけます
WITH_CLEAR_PASSWD=yesはAPOPを有効にする。
SpamassassinとQuotaを付けてインストールします。
SpamAssasin日本語対応でSpamAssassinをインストールする場合はWITH_SPAMASSASSIN=yesは必要ありません。

# cd /usr/ports/mail/vpopmail
# make WITH_MYSQL=yes WITH_CLEAR_PASSWD=yes \
WITH_DOMAIN_QUOTAS=yes WITH_SPAMASSASSIN=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

qmailadminインストール

QuotaとHelpを付けてインストール

# make WITH_MODIFY_QUOTA=yes WITH_HELP=yes clean install

POP befor SMTPの確認

簡単にいえば smtpを使用させる前に popで認証させ その認証が通ったIPを記録しておき ある一定の時間の間だけそのIPにsmtpの中継を許可すると言う事です。 WITH_MYSQLのオプションを付けてインストールした場合は/usr/local/vpopmail/etc/open-smtpではなくmysqに保存されます。 下記のコマンドで確認し、POP3で認証したIPアドレスが記載されていれば正常です。

$ mysql -u root -p[パスワード]
mysql> select * from vpopmail.relay
  • スクリプトを修正(起動シェル)
    ▼起動シェル
    シンボリックリンクを付けておく
    # ln -s /var/qmail/rc /usr/local/etc/rc.d/qmail.sh
    # vi /usr/local/etc/rc.d/mail.sh
#!/bin/sh

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

        /usr/local/bin/tcprules /usr/local/vpopmail/etc/tcp.pop3.cdb \
                /usr/local/vpopmail/etc/tcp.pop3.tmp < /usr/local/vpopmail/etc/tcp.pop3

        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 -v -x /usr/local/vpopmail/etc/tcp.pop3.cdb -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

tcpserverのオプションで下記の-R -Hを付けないと送信にとても時間が掛かります。

-R IDENTを行わない。 
-H リモートホスト名を調べない。 

tcp.pop3とtcp.smtpの作成

# vi /usr/local/vpopmail/etc/tcp.pop3
-----------------------------------
ALL:allow
-----------------------------------

# vi /usr/local/vpopmail/etc/tcp.smtp
-----------------------------------
# 127.0.0.1からはすべてパス
127.:allow,RELAYCLIENT="",RBLSMTPD="",QMAILQUEUE="/var/qmail/bin/qmail-queue"
# その他はすべてQmail-Scanner、でチェックする
:allow,RELAYCLIENT="",RBLSMTPD="",QMAILQUEUE="/usr/local/bin/qmail-scanner-queue.pl"
-----------------------------------

POP befor SMTPのクリア処理~

5分おきにクリア処理を走らせるようにする。一応vpopmailユーザで設定

# crontab -u vpopmail -e
---------------------------------------------------------------------
*/5 * * * * /usr/local/vpopmail/bin/clearopensmtp 2>&1 >/dev/null
---------------------------------------------------------------------

SpamAssassinの設定

SpamAssasin日本語対応でSpamAssassinをインストールする場合は起動シェルは自分で作成します。

rc.confにも追加

ユーザごとのconfigファイルは使わないようにして起動
いろいろ試しましたがこの方法がエラーもなく正常にログがはかれました。

# vi /etc/rc.conf
----------------------------------
spamd_enable="YES"
spamd_flags=${spamd_flags:-"-s /var/log/spam.log -c -d -x -v -u vpopmail -r ${spamd_pidfile}"}
----------------------------------

local.cf

# cp /usr/local/etc/mail/spamassassin/local.cf.sample /usr/local/etc/mail/spamassassin/local.cf

下記の3行だけ変更しておく。

rewrite_header Subject [SPAM] # 件名を書き換える。[SPAM]を件名の先頭に付ける
report_safe 1 # 0:本文は変更しない 1:本文は添付に変更(デフォルト)
trusted_networks 192.168.1. # 信頼済のネットワークを除外する

spamassassin動作

vpopmailを上記の設定で起動するとユーザにメールが来ると、/usr/local/vpopmail/.spamassassinをvpopmailユーザで参照しようとします。
自分の場合は、/etcに設定ファイルを置いてシンボリックリンクを張ってます。

# mkdir /etc/vpopmail/spamassassin
# chown vpopmail:vchkpw /etc/vpopmail/spamassassin
# ln -s /etc/vpopmail/spamassassin /usr/local/vpopmail/.spamassassin

ClamAVインストール

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

/etc/rc.confの編集

clamav_clamd_enable="YES"
clamav_freshclam_enable="YES"

qmail-scanner

インストール

# cd /usr/ports/mail/qmail-scanner
# make QMAILSCAN_SCANNERS="clamdscan,verbose_spamassassin" install

qmail-scannerの動作

/usr/local/bin/qmail-scanner.plが実行ファイルですが、sビットがたっておりsuidperlが入っていれば、qscanユーザで実行することになります。
※FreeBSD5.4以降はセキュリティ上の問題でsuidperlがデフォルトでは入っておりません。
/usr/local/qmailscanにworkフォルダやtmpフォルダなどが用意されていますが、パーミッションで実行に失敗する。
suidperlが入っていなくても、パーミッションを変更すればちゃんと実行されるようです。

qmail-scannerからClamAVを呼び出す時にclamdscanの場合下記のようなエラーが出る事があります。

clamscan: corrupt or unknown ClamAV scanner error or memory/resource/perms problem - exit status

/usr/local/bin/qmail-scanner-queue.plの$clamdscan_binaryの変数を直接編集しclamscanに変更すれば、正常にスキャンできます。
clamscanはデーモンから起動しない為処理が遅いみたいですが、自分の環境では特に問題ありません。

   223 my $clamdscan_binary='/usr/local/bin/clamscan';

文字化け対策

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

この対策として、/var/qmail/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がヘッダに付加するバージョン情報を更新する。
ファイルは/usr/local/qmailscan/qmail-scanner-queue-version.txt

$ cat /usr/local/qmailscan/qmail-scanner-queue-version.txt 
clamdscan: 0.88.4/1894. spamassassin: 3.1.5.

・更新は以下のコマンドで行う

/usr/local/bin/qmail-scanner-queue.pl -z

cron等に設定し一日一回くらいで更新を行うと良いと思う。

.procmail編集

最後にprocmailでヘッダーに「X-Spam-Status: Yes」があった場合.Spamフォルダに入れるように設定しました。
※DOMAIN,USERは環境に合わせて変更してください。

PATH=/usr/bin:/bin:/usr/local/bin
HOME=/usr/local/vpopmail/domains/DOMAIN/USER
MAILDIR=$HOME/Maildir
DEFAULT=$HOME/Maildir/
LOGFILE=$MAILDIR/procmail.log
LOCKFILE=$MAILDIR/procmail.lock
SPAM=$MAILDIR/.Spam/

:0fw: spamassassin.lock
| spamc

:0
* ^X-Spam-Status: Yes
$SPAM

起動

# /usr/local/etc/rc.d/qmail.sh start
# /usr/local/etc/rc.d/sa-spamd.sh start
# /usr/local/etc/rc.d/clamav-clamd start
# /usr/local/etc/rc.d/clamav-freshclam start

vpopmail(ドメイン・ユーザの追加削除)

[ドメイン追加]

# /usr/local/vpopmail/bin/vadddomain example.co.jp
Please enter password for postmaster:******
enter password again:******
# /usr/local/vpopmail/bin/vdominfo example.co.jp
domain: example.co.jp
uid:    89
gid:    89
dir:    /usr/local/vpopmail/domains/example.co.jp
users:  1

[ドメイン削除]

# /usr/local/vpopmail/bin/vdeldomain example.co.jp

[ユーザ追加]

# /usr/local/vpopmail/bin/vadduser foo@example.co.jp
Please enter password for foo@example.co.jp:*******
enter password again:*******
# /usr/local/vpopmail/bin/vuserinfo foo@example.co.jp
name:   foo
passwd: $3$QfA7KKeX$kiKwlqVIRfP/fTLfi22bl6
clear passwd:
uid:    1
gid:    0
flags:  0
gecos: foo
limits: No user limits set.
dir:       /usr/local/vpopmail/domains/example.co.jp/foo
quota:     NOQUOTA
usage:     NOQUOTA
account created: DDD MMM DD HH:MM:SS YYYY
last auth: Never logged in

[ユーザ削除]

# /usr/local/vpopmail/bin/vdeluser  foo@example.co.jp

[パスワードの変更]

# /usr/local/vpopmail/bin/vpasswd foo@example.co.jp [パスワード]

qmailadmin

▼qmailadminのスクリーンショット
SquirreMailにqmailadmin_loginのプラグインを入れて表示させたところ。

qmailadmin.jpg



不正中継テスト

http://www.abuse.net/relay.html

  1. Address to test:にテストしたいホスト名を入力
  2. [Test for relay]ボタンをクリック

参考にしたページ
fkimura.com
bugbearr.jp