![]() ![]() |
![]() |
|
![]() |
||
![]() |
qmail 環境をふたたびインストールする機会があった。
前にも一度エントリを書いたけどそれっきり完成させてなかったので、私的メモとしてこの機会に完成させておく。
今回のお題は、CentOS4 に qmail + vpopmail + qmailadmin という環境で、 POP before SMTP (25番ポート) と SMTP-AUTH (587番ポート) の利用。
ちなみに、私が qmail をインストールしたのは仕事の都合仕方なくやっただけであって、qmailの利用を推奨しているワケではございません。というよりもむしろ非推奨で、「え、マジqmail?!」「qmailが許されるのは小学生までだよねー!キモーイキャハハ」とか「qmailを使いたがる男のひとって・・・」みたいな気持ちです。OS 同梱の sendmail とかで良いじゃん。あえてそれを入れ替えるにしても、せめて postfix だよねー。
まずは本体プログラムのインストールから。
netqmail-1.06 は qmail-1.03 に公式の Recommended pathcesといくつかのドキュメントを追加したものらしいので、利用させてありがたく利用させていただく。
これまでは netqmail は、 qmail のソースコードの改変が認められないライセンスだったため、パッチ適用のためのシェルスクリプトの実行が必要だったようだが、 netqmail-1.06 からはソースコードにパッチが適用された状態で配布されているようだ。
まずは、必要なユーザの追加から。
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。
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(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
とりあえずインストールだけして、細かい事は後回し。
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
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
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 の引数が多くてイライラしちゃう!><
前提条件として、qmail と vpopmail の導入は完了しているものとします。その他に require なものとしては、autorespond 2.0 (or greater), ezmlm or ezmlm-idx となっております。
自動応答なんかに使われるソフトのようです。
wget http://www.inter7.com/devel/autorespond-2.0.2.tar.gz tar xfzv autorespond-2.0.2.tar.gz cd autorespond-2.0.2 make install
メーリングリストマネージャだそうです。このプログラムにも qmail と同様に、glibc 2.3.1 移行の errorno 云々の問題があるみたいですね。
cd /usr/local/src wget http://cr.yp.to/software/ezmlm-0.53.tar.gz cd ezmlm-0.53 vi error.h make make man make setup
ちなみに、修正はこんな感じらしいよ。
diff -Naru ezmlm-0.53/error.h ezmlm-0.53-mod/error.h --- ezmlm-0.53/error.h 1997-06-30 12:11:54.000000000 +0900 +++ ezmlm-0.53-mod/error.h 2006-08-07 17:09:45.000000000 +0900 @@ -1,7 +1,6 @@ #ifndef ERROR_H #define ERROR_H - -extern int errno; +#include <errno.h> extern int error_intr; extern int error_nomem; diff -Naru ezmlm-0.53/ezmlm-manage.c ezmlm-0.53-mod/ezmlm-manage.c --- ezmlm-0.53/ezmlm-manage.c 1997-06-30 12:11:54.000000000 +0900 +++ ezmlm-0.53-mod/ezmlm-manage.c 2006-08-07 17:15:10.000000000 +0900 @@ -30,6 +30,7 @@ { strerr_die2x(100,FATAL,"I do not accept messages at this address (#5.1.1)"); } +void log(char *,char *); stralloc inhost = {0}; stralloc outhost = {0}; diff -Naru ezmlm-0.53/ezmlm-return.c ezmlm-0.53-mod/ezmlm-return.c --- ezmlm-0.53/ezmlm-return.c 1997-06-30 12:11:54.000000000 +0900 +++ ezmlm-0.53-mod/ezmlm-return.c 2006-08-07 17:15:43.000000000 +0900 @@ -29,6 +29,7 @@ { strerr_die1x(0,"ezmlm-return: info: trash address"); } +void log(char *,char *); char outbuf[1024]; substdio ssout;
ようやっと本命の qmailadmin ですよ。レイアウトが若干気に入らなかったので、俺俺に変更。
cd /usr/local/src wget http://nchc.dl.sourceforge.net/sourceforge/qmailadmin/qmailadmin-1.2.11.tar.gz tar xfzv qmailadmin-1.2.11.tar.gz cd qmailadmin-1.2.11 ./configure \ --enable-htmldir=/var/www/html/qmailadmin \ --enable-cgibindir=/var/www/cgi-bin \ --enable-imagedir=/var/www/qmailadmin/images \ --enable-imageurl=/qmailadmin/images \ make install-strip
インストールが済んだら、Apache の設定もしておきます。
echo 'Alias /qmailadmin/ "/var/www/html/qmailadmin/"' > /etc/httpd/conf.d/qmailadmin echo 'ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"' >> /etc/httpd/conf.d/qmailadmin
ScriptAlias を使うのはイマイチ好きになれないので、cgi-bin dir を /var/www/html/qmailadmin にして、そのままバイナリ cgi を置いてもいいような気もする。
qmail には、sendmail の互換プログラムが同梱されている。システムから sendmail パッケージをアンインストールする場合や、sendmail から差し替えたい場合には、この作業が必要になる。
rm /etc/alternatives/mta ln -s /var/qmail/bin/sendmail /etc/alternatives/mta
/usr/sbin/sendmail ( /usr/sbin/sendmail.sendmail へのシンボリックリンク) を /var/qmail/bin/sendmail へのシンボリックにするような手順がウェブ上で見受けられるが、こちらの方が作法的に正しいように思われる。