九尾の猫の隠れ家。

 | 

2008-02-29 (Fri)

qmail 環境をふたたびインストールする機会があった。

前にも一度エントリを書いたけどそれっきり完成させてなかったので、私的メモとしてこの機会に完成させておく。

今回のお題は、CentOS4 に qmail + vpopmail + qmailadmin という環境で、 POP before SMTP (25番ポート) と SMTP-AUTH (587番ポート) の利用。

ちなみに、私が qmail をインストールしたのは仕事の都合仕方なくやっただけであって、qmailの利用を推奨しているワケではございません。というよりもむしろ非推奨で、「え、マジqmail?!」「qmailが許されるのは小学生までだよねー!キモーイキャハハ」とか「qmailを使いたがる男のひとって・・・」みたいな気持ちです。OS 同梱の sendmail とかで良いじゃん。あえてそれを入れ替えるにしても、せめて postfix だよねー。

qmail のインストール 13:43

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

qmail と netqmail

netqmail-1.06 は qmail-1.03 に公式の Recommended pathcesといくつかのドキュメントを追加したものらしいので、利用させてありがたく利用させていただく。

これまでは netqmail は、 qmail のソースコードの改変が認められないライセンスだったため、パッチ適用のためのシェルスクリプトの実行が必要だったようだが、 netqmail-1.06 からはソースコードにパッチが適用された状態で配布されているようだ。

追加で適用するパッチ

  • qmail-103.patch
  • qmail-date-localtime.patch
  • qmail-smtpd-relay-reject
    • http://www.qmail.org/qmail-smtpd-relay-reject
    • メールアドレスの "@" 以前のユーザアカウント部分に "@", "!", "%" が含まれているメールを拒否するためのパッチ。そんなの必要かなーとか思ったけど、これを適用しとかないと relay-test.mail-abuse.org なんかの不正中継チェックでひっかかったりもするみたい。そりゃいかん。
  • netqmail-1.05-tls-smtpauth-20070417.patch
    • http://shupp.org/smtp-auth-tls/
    • その名の通り、 TLS や SMTP-AUTH に対応するためのパッチ。パッチ本体に記載されている通り、色んな人が公開してた個々のパッチを一つにまとめたもの。

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 の引数が多くてイライラしちゃう!><

qmailadmin のインストール 17:19

前提条件として、qmail と vpopmail の導入は完了しているものとします。その他に require なものとしては、autorespond 2.0 (or greater), ezmlm or ezmlm-idx となっております。

autorespond のインストール

自動応答なんかに使われるソフトのようです。

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

ezmlm のインストール

メーリングリストマネージャだそうです。このプログラムにも 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 のインストール

ようやっと本命の 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 を置いてもいいような気もする。

[]同梱の sendmail ラッパー 17:29

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 へのシンボリックにするような手順がウェブ上で見受けられるが、こちらの方が作法的に正しいように思われる。

参考ページ 17:25

 |