FreeBSD/vpopmail の変更点


*''&size(15){vpopmail + qmail + MySQL + Spamassassin};'' [#n8f031d6]

#contents

**''環境'' [#ec7723de]
 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インストール''&aname(A); [#d0f5327f]
qmailには様々なパッチが存在しますが、とりあえずこの4つのパッチを当ててインストールします。
|BGCOLOR(#C0C0C0):CENTER:パッチ|BGCOLOR(#C0C0C0):CENTER:説明|
|qmail-date-localtime.patch|Recieved フィールドの日時は、標準では 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.patch|DNS の 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の停止 [#bdd0fc19]
 # 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インストール''&aname(B); [#e9b556df]
MySQLとの連携するので、WITH_MYSQLをつけます~
WITH_CLEAR_PASSWD=yesはAPOPを有効にする。~
SpamassassinとQuotaを付けてインストールします。~
&color(red){※[[SpamAssasin日本語対応>FreeBSD/SpamAssassin]]で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はインストールされている事を前提としております。~
インストールは ⇒ [[ここ参照>/FreeBSD/Apache2.0]]
 # 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インストール''&aname(C);&br; [#qda6c900]
QuotaとHelpを付けてインストール
 # make WITH_MODIFY_QUOTA=yes WITH_HELP=yes clean install

**POP befor SMTPの確認 [#ua713ba8]
簡単にいえば 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

-''スクリプトを修正(起動シェル)''&aname(D);&br;
▼起動シェル~
シンボリックリンクを付けておく
 # 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を付けないと送信にとても時間が掛かります。 [#t5711904]
 -R IDENTを行わない。 
 -H リモートホスト名を調べない。 
**''tcp.pop3とtcp.smtpの作成'' [#t5144874]
 # 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のクリア処理''&aname(F);~ [#f1531758]
5分おきにクリア処理を走らせるようにする。一応vpopmailユーザで設定
 # crontab -u vpopmail -e
 ---------------------------------------------------------------------
 */5 * * * * /usr/local/vpopmail/bin/clearopensmtp 2>&1 >/dev/null
 ---------------------------------------------------------------------
 
**''SpamAssassinの設定''&aname(E); [#qe7ee695]
&color(red){※[[SpamAssasin日本語対応>FreeBSD/SpamAssassin]]でSpamAssassinをインストールする場合は起動シェルは自分で作成します。};
***rc.confにも追加 [#zf9a9da1]
ユーザごとの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 [#f16c2fca]
 # 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動作 [#b53c9f91]
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インストール [#r769eb60]
 # cd /usr/ports/security/clamav
 # make install
***/etc/rc.confの編集 [#xd64ec6f]
 clamav_clamd_enable="YES"
 clamav_freshclam_enable="YES"

**qmail-scanner [#e0a9727b]
インストール
 # cd /usr/ports/mail/qmail-scanner
 # make QMAILSCAN_SCANNERS="clamdscan,verbose_spamassassin" install

***qmail-scannerの動作 [#t3513f8a]
/usr/local/bin/qmail-scanner.plが実行ファイルですが、sビットがたっておりsuidperlが入っていれば、qscanユーザで実行することになります。~
&color(red){※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';
***文字化け対策 [#he78bf14]
qmail-scanner のインストール時に、--lang ja_JP.EUC で、管理者宛のメッセージは日本語化されるのですが、ウィルス検出した、メールの Subject が日本語だと、その部分が文字化けしてしまいます。

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

まず、1箇所目は、&color(blue){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 - $!");

と変更してください。 
もう一箇所は、&color(blue){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 も日本語化されるます。

***バージョンの更新 [#a1b5647d]
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編集 [#rb8168b5]
最後にprocmailでヘッダーに「X-Spam-Status: Yes」があった場合.Spamフォルダに入れるように設定しました。~
&color(red){※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
 
**''起動''&aname(G); [#pc065bcd]
 # /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(ドメイン・ユーザの追加削除)''&aname(H); [#r25f1457]
''[ドメイン追加]''
 # /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'' [#t90abbd7]
▼qmailadminのスクリーンショット~
SquirreMailにqmailadmin_loginのプラグインを入れて表示させたところ。
#ref(http://flateight.com/uploads/bwiki/vpopmail/qmailadmin.jpg)
#ref(http://www.flateight.com/uploads/bwiki/vpopmail/qmailadmin.jpg)
~
~
**不正中継テスト [#o12fd6c8]
http://www.abuse.net/relay.html
+Address to test:にテストしたいホスト名を入力
+[Test for relay]ボタンをクリック

参考にしたページ~
[[fkimura.com>http://www.fkimura.com/vpopmail0.html]]~
[[bugbearr.jp>http://www.bugbearr.jp/index.php?FreeBSD%2Fvpopmail]]~