qmail のインストール

まずは本体プログラムのインストールから。

qmail と netqmail

netqmail-1.06 は qmail-1.03 に公式の Recommended pathcesといくつかのドキュメントを追加したものらしいので、利用させてありがたく利用させていただく。
これまでは netqmail は、 qmailソースコードの改変が認められないライセンスだったため、パッチ適用のためのシェルスクリプトの実行が必要だったようだが、 netqmail-1.06 からはソースコードにパッチが適用された状態で配布されているようだ。

追加で適用するパッチ

netqmail インストール

まずは、必要なユーザの追加から。


mkdir /var/qmail
groupadd nofiles
useradd -g nofiles -d /var/qmail/alias -m -k /dev/null -s /sbin/nologin alias
useradd -g nofiles -d /var/qmail -m -k /dev/null -s /sbin/nologin qmaild
useradd -g nofiles -d /var/qmail -m -k /dev/null -s /sbin/nologin qmaill
useradd -g nofiles -d /var/qmail -m -k /dev/null -s /sbin/nologin qmailp
groupadd qmail
useradd -g qmail -d /var/qmail -m -k /dev/null -s /sbin/nologin qmailq
useradd -g qmail -d /var/qmail -m -k /dev/null -s /sbin/nologin qmailr
useradd -g qmail -d /var/qmail -m -k /dev/null -s /sbin/nologin qmails

  • 私的メモ:そろぞれのユーザの役割を改めて確認しておく。

gid やら uid は指定したければ好きなようにすればいいと思われる。つぎは、パッチ適用と make。

  • netqmail-1.05-tls-smtpauth-20070417.patch を qmail-smtpd-relay-reject よりも先に適用しないと、patch (hunk)処理の一部がコケるかも。

make のときに

qmail-remote.c:673: warning: return type of 'main' is not 'int'

が出たら、openssl-devel をインストールする。(netqmail-1.05-tls-smtpauth-20070417.patch を適用するなら必要になるっぽい?)


cd /usr/local/src
wget http://www.qmail.org/netqmail-1.06.tar.gz
wget http://www.ckdhr.com/ckd/qmail-103.patch
wget http://どこからか/qmail-date-localtime.patch
wget http://www.qmail.org/qmail-smtpd-relay-reject
tar xfzv netqmail-1.06.tar.gz
cd netqmail-1.06
patch < ../netqmail-1.05-tls-smtpauth-20070417.patch
patch < ../qmail-103.patch
patch < ../qmail-date-localtime.patch
patch < ../qmail-smtpd-relay-reject
make setup check
./config-fast `hostname`
次は alias に関する設定。マニュアル( INSTALL, INSTALL.alias )に従ったけど、オーナ,グループを alias:qmail に設定した方がいいのかもしれない?

cd /var/qmail/alias
echo admin > .qmail-postmaster
echo admin > .qmail-mailer-daemon
echo admin > .qmail-root
chmod 644 .qmail*
これらファイルを touch しただけだと、logwatch とかが root 宛てに送り出すメールが迷子になっちゃうかもしれないよ。root など、admin 以外のユーザで扱いたかったらそのように。外部メールアドレスを指定することもできる。
次に起動スクリプトの設定。netqmail-1.06/home として用意されているファイルを /var/qmail/rc としてコピーする。Maildir 形式に変更するため、記述もあわせて変更。

cp /var/qmail/boot/home /var/qmail/rc
sed -i "s#Mailbox#Maildir/#" /var/qmail/rc
その後、起動するかどうかの確認だけをしておく。それっぽいプロセスがあれば良くて、qmail-send プロセスを kill すればまとめて終了される。

csh -cf '/var/qmail/rc &'
ps aux | grep qmail
killall qmail-send

tcpserver インストール

tcpserver(UCSPI-TCP) は tcp_wrapper や xinetd なんかよりも高機能なプログラムらしい。glibc 2.3.1 以降を利用している場合には、errno に関するパッチなんかを適用する必要があるが、それらパッチは netqmail に同梱されている。


cd /usr/local/src
wget http://cr.yp.to/ucspi-tcp/ucspi-tcp-0.88.tar.gz
tar xfzv ucspi-tcp-0.88.tar.gz
cd ucspi-tcp-0.88
patch ../netqmail-1.06/otherpatches/ucspi-tcp-0.88.errno.patch
make setup check
とりあえずインストールだけして、細かい事は後回し。

vpopmail インストール

UNIX ユーザ (/etc/passwd) を利用しないメールアカウントや、バーチャルドメインを実現するためのソフトウェア。


groupadd vchkpw
useradd -g vchkpw -d /home/vpopmail -m -k /dev/null -s /sbin/nologin vpopmail
mkdir /home/vpopmail/etc/
cd /home/vpopmail/etc
echo '127.:allow,RELAYCLIENT=""' > tcp.smtp
tcprules tcp.smtp.cdb tcp.smtp.tmp < tcp.smtp
chown -R vpopmail:vchkpw /home/vpopmail/etc
cd /usr/local/src
wget http://nchc.dl.sourceforge.net/sourceforge/vpopmail/vpopmail-5.4.25.tar.gz
cd vpopmail-5.4.25
./configure \
--prefix=/home/vpopmail \ (デフォルトだと /var/vpopmail になる。趣味の問題。)
--enable-vpopuser=vpopmail \ (明示しなくてもこうなる筈。)
--enable-vpopgroup=vchkpw \ (明示しなくてもこうなる筈。)
--enable-roaming-users=y \ ( POP before SMTP 使いますよ。)
--enable-relay-clear-minutes=15 \
--enable-tcpserver-file=/home/vpopmail/etc/tcp.smtp \
--enable-clear-passwd=n \
--enable-ip-alias-domains=n \
--enable-logging=y \
--enable-log-name=vpopmail
make
make install-strip

  • 追記20070727:vpopmail-5.5.0 からバックエンドのブログラムを選択して手動インストールする必要がある。


cd /usr/local/src/vpopmail-5.5.0/backend
cd cdb
make install-strip

余談ながら、vchkpw.c の authcram() の引数の順番に問題があり、SMTP AUTH 利用の際に CRAM-MD5 が正常に動作しないとの話もある。必須ではないが、以下の修正を行うと幸せになれるのかもしれない。
今回は、CRAM-MD5 の利用を想定しなかったため、検証は行っていない。


--- vchkpw.c.orig 2004-12-17 00:57:34.000000000 +0900
+++ vchkpw.c 2006-08-07 13:43:43.000000000 +0900
@@ -708,7 +708,7 @@
unsigned char h;
int j;

- hmac_md5( challenge, strlen(challenge), password, strlen(password), digest);
+ hmac_md5( response, strlen(response), password, strlen(password), digest);

digascii[32]=0;

@@ -720,7 +720,7 @@
digascii[(2*j)+1]=hextab[h];
}
/* printf("digascii: %s, response: %s", digascii, response); */
- return(strcmp(digascii,response));
+ return(strcmp(digascii,challenge));
}

int authapop(unsigned char *password, unsigned char *timestamp, unsigned char *clearpass)


SMTP AUTH を利用する場合には、vchkpw の所有者を root に変更する必要があるとかなんとか。検証する時間が無かったので盲目的に従ったけど、これって最小権限という qmail のセキュリティ理念的にどうなのよ。



chown root:root ~vpopmail/bin/vchkpw
chmod 4755 ~vpopmail/bin/vchkpw

  • 追記20090727:その後に機会と時間があったので確認しなおしたが、所有者は vpopmail:vchkpw のままで、setgid, setuid だけで問題無さそうだった。vchkpw ごときに root 権限の setuid なんて、きがくるっとる!

POP before SMTP での POP3 認証後の有効時間は設定されているけど、データファイル自体はクリアされずに使い続けられるみたいなので、クリアするための処理を cron でまわす事にしたけど……一日一回とかでよかったかも。


echo '*/15 * * * * root /home/vpopmail/bin/clearopensmtp 2>&1 1>/dev/null' > /etc/cron.d/clearopensmtp
これで qmail 部分はおおむね完了。あとは起動スクリプトを設置しよう。ググってみかけた設定ファイルを適当に流用させてもらいましたけど、機会をみて自分なりに書き直したいところ。
特に pop3d の動作権限がちょっと気になるところです。(ドキュメントろくに読んでないけど、qmailp ってそのためのユーザだったりしないのか?)

#!/bin/sh
#
# chkconfig: 345 88 11
# description: qmaild(Mail Server)
# processname: qmaild
# pidfile: /var/run/qmaild.pid
# filename /etc/rc.d/init.d/qmaild
#
#
# Source function library.
. /etc/rc.d/init.d/functions

case "$1" in
start)
if [ -z $(/sbin/pidof qmail-send) ]; then
echo -n "Starting qmail"


# starting qmail daemon
csh -cf '/var/qmail/rc &'

# starting tcpserver with pop3d
/usr/local/bin/tcpserver -q -v -H -R 0 110 /var/qmail/bin/qmail-popup `hostname` \
/home/vpopmail/bin/vchkpw /var/qmail/bin/qmail-pop3d Maildir 2>&1 \
| /var/qmail/bin/splogger pop3d &

# starting tcpserver with smptd
/usr/local/bin/tcpserver -q -v -H -R -x /home/vpopmail/etc/tcp.smtp.cdb -c 100 -u `id -u qmaild` -g `id -g vpopmail` \
0 smtp /var/qmail/bin/qmail-smtpd `hostname` 2>&1 \
| /var/qmail/bin/splogger smtpd &

# starting tcpserver with smptd
/usr/local/bin/tcpserver -q -v -H -R -u `id -u qmaild` -g `id -g vpopmail` \
0 submission /var/qmail/bin/qmail-smtpd /home/vpopmail/bin/vchkpw /bin/true 2>&1 \
| /var/qmail/bin/splogger MSA &

RETVAL=$?
echo
[ $RETVAL = 0 ] && touch /var/lock/subsys/qmail
return $RETVAL
else
echo "qmail is already started"
fi
;;
stop)
echo -n " Shutting down qmail-send."
kill $(/sbin/pidof tcpserver)
kill $(/sbin/pidof qmail-send)

echo
rm -f /var/lock/subsys/qmaild
;;

restart)

$0 stop
$0 start
;;

*)
echo "Usage: `basename $0` {start|stop|restart}" >&2
exit 64
;;
esac
exit 0

tcpserver の引数が多くてイライラしちゃう!><