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.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の停止 †
# 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のプラグインを入れて表示させたところ。
不正中継テスト †
http://www.abuse.net/relay.html
- Address to test:にテストしたいホスト名を入力
- [Test for relay]ボタンをクリック
参考にしたページ
fkimura.com
bugbearr.jp