qmailインストールのバリエーション - qmail-vida

ここでは、qmail インストールのバリエーションとして、TAKIZAWA Takashi 氏の qmail-vida を中心にいくつかのパッチやユーティリティを組み合わせたインストールを行う。vida は VIrtual Domain and Authentication から名付けたパッケージ名だそうで、バーチャルドメインを含めたユーザ管理, cdb によるパスワードデータベース, SMTP-AUTH と CRAM-MD5 によるその暗号化, APOP など、qmail を様々な面で拡張してくれる。

筆者が qmail-vida を使おうと思った理由

qmail の基本はこれまでで網羅したので、ここでは特に必要なことだけ述べる。知らないことが出てきたら qmail 冒頭 に戻って調べていただきたい。

必要なもの

qmail-vida 主として、qmail と checkpassword へのパッチと、メールアカウント管理プログラムから成る
netqmail-1.05 qmail-vida のホームページでは qmail-1.03 でのインストールが充分分かりやすく解説されているので、ここでは敢えて netqmail を元としたインストールを解説する
checkpassword qmail-vida では、同梱のパッチによって checkpassword を CRAM-MD5 と APOP に対応させて利用する
ucspi-tcp qmail-vida がこの中のライブラリをコピーして利用するのでソースを用意しておく必要がある

併用したい筆者おすすめのパッチ

date-localtime 基本編でも紹介した qmail のローカルタイム対応パッチ
glibc errno glibc が 2.3.1 以上の場合に必須のパッチ。2.3.0 以前の環境でも、適用しても問題はない。 netqmail にはインストールの過程で自動的に適用されるが、checkpassword と ucspi-tcp には手動で当てる必要がある。 netqmail ソースの other-patches ディレクトリ含まれるものをそれぞれ利用する
ucspi-rss 基本編でも紹介した、ucspi-tcp パッケージの rblsmtpd をAレコード対応にするパッチ。全く同一のものが netqmail-1.05 ソースの other-patches ディレクトリにも ucspi-tcp-0.88.a_record.patch という名前で付属している
qregex-20040601 ともに基本編で紹介したが、qregex のコードは qmail-vida によるパッチと干渉するするので、調整して diff を取り直した。qregex の活用法は spamフィルタリング を参照のこと。qmail-vida には、SMTP セッションでの受付拒否 RCPT を記述できる badrcptto 機能が付加されていたが、 qregex の badmailto と完全にバッティングするので、このパッチによってそのコードは無効化されるようになっている:
qmail-vida 用 qregex-20040601.patch
さらに validrcptto パッチも当てたい場合には、下記のパッチを使うと良い。validrcptto もやはり同じコード部分をいじろうとするので、qregex と validrcptto を統合したパッチを作成した。ついでに、validrcptto コントロールファイル (SMTP セッションで有効とする RCPT アドレスを指定するファイル) にも qregex のアルゴリズムを活用し、正規表現を使えるようにした:
qmail-vida 用 qregex-20040601 + validrcptto.patch
validrcptto

インストール手順

既に qmail が稼働している場合は、ここですべて停止しておこう。

管理ユーザ/グループの作成

まず qmail 自体の稼働に必要なユーザ/グループは当然作成しなければならない。

その上で、他に、実在ドメインの仮想メールボックスの実オーナーである pop と、そのプライマリグループである vida も必要となる。pop は「システムアカウントを増やさずにメールユーザを作る」の popuser 、vida は同 popusers にあたるもの。さらに、qmail/users/assign の書き換え権限を与える qmailu ユーザと、qmail/authdb/ 下のパスワードデータベースを管理する authdb ユーザも必要だ。なお、pop は、新しい仮想メールユーザを登録する際などに実際にログインして操作を行うユーザなので、ホームディレクトリは仮想ユーザのメールボックスを置くディレクトリ (例では /home/pop) を指定し、シェルはつぶしてはいけない。下記 UID, GID は適宜調整のこと。

root# groupadd -g 900 vida
root# useradd -u 900 -g vida -d /home/pop -s /bin/bash pop
root# useradd -u 901 -g vida -d /var/qmail/users \
     -m -k /dev/null -s /sbin/nologin qmailu
root# useradd -u 902 -g vida -d /var/qmail/authdb \
     -m -k /dev/null -s /sbin/nologin authdb
root# passwd pop (pop にログインパスワードを与える)

ソースの展開

user$ tar xzvf netqmail-1.05.tar.gz
user$ cd netqmail-1.05
user$ ./collate.sh  (netqmail のソース展開と付属パッチの適用)
user$ cd ..
user$ tar xzvf qmail-vida-0.53.tar.gz
user$ tar xzvf checkpassword-0.90.tar.gz
user$ tar xzvf ucspi-tcp-0.88.tar.gz

qmail-vida の Makefile を編集

netqmail をベースにする場合には qmail-vida-0.53/Makefile の調整が不可欠だ。以下の赤字部分を書き換える:

QMAILSRC    = ../netqmail-1.05/netqmail-1.05
 .
 .
 .
patch-qmail:
    here=`pwd` && cd ${QMAILSRC} && \
    ${PATCH} -p1 -F 3 < $${here}/patch/qmail.patch

パッチの適用

user$ cd qmail-vida-0.53
user$ make patch (qmail-vida 付属パッチによる checkpassword, netqmail へのパッチ適用)
user$ cd ../netqmail-1.05/netqmail-1.05
user$ patch -p1 < ../../qmail-date-localtime.patch
user$ patch -p1 < ../../netqmail-vida-qregex-vrt.patch (qregex と validrcptto を当てたい場合)
user$ patch -p1 < ../../netqmail-vida-qregex-20040601.patch (qregex だけでいい場合)
user$ cd ../../checkpassword-0.90
user$ patch -p1 < ../netqmail-1.05/other-patches/checkpassword-0.90.errno.patch
user$ cd ../ucspi-tcp-0.88
user$ patch -p1 < ../netqmail-1.05/other-patches/ucspi-tcp-0.88.errno.patch
user$ patch -p1 < ../ucspi-rss.diff

qmail-vida のソース補完

checkpassword, ucspi-tcp, qmail から qmail-vida への必要ライブラリのコピーと、ucspi-tcp, qmail から checkpassword へのライブラリコピーが行われる。

user$ cd ../qmail-vida-0.53
user$ make copy

各パッケージのコンパイルとインストール

qmail

user$ su
root# cd ../netqmail-1.05/netqmail-1.05
root# make setup check
root# ./config-fast mail.hoge.cxm  (初回インストールの場合のみ!!)

checkpassword

root# cd ../../checkpassword-0.90
root# make
root# make setup check

qmail-vida

root# cd ../qmail-vida-0.53/src/vida
root# make
root# make setup check
root# cd ../..
root# make install-doc (ドキュメントのインストール)

vida ユーティリティは /var/qmail/bin/ に、ドキュメントは /var/qmail/doc/qmail-vida/ にインストールされる。

ucspi-tcp (既に同じパッチ構成でインストールしてあれば不要)

root# cd ../ucspi-tcp-0.88
root# make
root# make setup check 

ディレクトリの整備

実在ドメインの、実在ユーザと仮想ユーザ用のパスワードディレクトリ構造を作成する。これによって、/var/qmail/authdb/pwduser および pop ディレクトリが用意される。必ず root で:

root# /var/qmail/bin/vida-pwdbinit

パーミションを確認しておいたほうが良いディレクトリとファイル:

/var/qmail
        \ authdb/        authdb.vida   700
            \ pop/       authdb.vida   700
               \ cdb     authdb.vida   600
                 passwd  authdb.vida   600
            \ pwdusers/  authdb.vida   700
        \ users/         qmailu.qmail 2755
            \ assign     qmailu.qmail  644
              cdb        qmailu.qmail  644
/home/pop/               pop.vida      700

その他諸々

qmail が初回インストールの場合は、「qmail の設定 (基本編) 」 を参考に、基本的な環境整備を行う。

各種設定と調整

qmail-smtpd と qmail-pop3d 起動スクリプトの調整

qmail 基本編の起動スクリプトをベースに話を進める。つまり、deamontool は使用しておらず、tcpserver を介して起動するものと仮定する。まずは微調整で済む pop3 のほうから行こう。

qmail-pop3d の起動スクリプト

以前のスクリプトを元にして、start ファンクション部分の checklocalpwdcheckpassword に変更し、後述の環境変数設定のために pop3 コネクション用の tcpserver ルール cdb 読み込みオプションを足す:

 .
 .
  return 1
fi
 
  tcpserver -H -R -v -x /etc/service/tcp.pop3.cdb 0 $SVCPORT \
 qmail-popup $MYSVNAME \
 checkpassword $MYPROGNAME Maildir 2>&1 | splogger $LOGPREFIX&

qmail-smtpd の起動スクリプト

こちらも start ファンクションの書き換えだが、やや大きな変更となる。というのも、qmail-vida によって、qmail-popup 同様に qmail-smtpup という別個の認証部分ができたからだ。 qmail-smtpup がしかるべき ID で qmail-smtpd に処理を渡すので tcpserver の動作ユーザ/グループ指定は要らなくなる。起動の核心部分はこのようになる;

  tcpserver -H -R -v -x /etc/service/tcp.smtp.cdb 0 $SVCPORT \
 rblsmtpd -r sbl.spamhaus.org -r dnsbl.ahbl.org \
 qmail-smtpup $MYSVNAME checkpassword $MYPROGNAME 2>&1 | \
 splogger $LOGPREFIX &

最終的な起動スクリプトファイルがこれ(qsmtpd_vida)/etc/init.d/qsmtpd としてコピーして使用する。

サブミッションポート用SMTPサーバを併設したい場合

SPAMを少しでも出しにくくする一案として、SMTPポートを従来の 25 から 587 に変える「サブミッションポート」あるいは「OutBound Port 25 Block」という SMTPサーバ実装手法が盛んになっている。「25番ポートの qmail-smtpd と併設するにはどうしたらいいか」というお問い合わせをいただいたのを機会に、実装方法を検証してみた。

まず、通常の qmail-smtpd 起動スクリプト内に `tcpserver -H -R -v ... submission ...' と起動コマンドだけを併記してもうまくいかない。それではふたつの PID を書き出すことができず、デーモンが終了できなくなってしまうからだ。一番シンプルな解決策は、 qsmtpd とは別に qsmtpd_op25b という起動スクリプトを作成し、別々に制御してやることだ。メールキューは通常の qmail-smtpd と共用できる。

サブミッションポートは、メールクライアントとSMTPサーバにポート587を使用させるだけでなく、以下の条件を満たさなければ有名無実・インチキOP25B となってしまう。

ひとつ目は、当サイトの実装方法では既に完了済みだ。
ふたつ目はつまり、サブミッションポートでの接続時には /var/qmail/control/rcpthosts を無視させなければいけないわけだ。今のままでは、SMTP認証は「リレーを許可するかどうか」を左右するだけであり、当サーバの抱えるメールアドレスに対するメールはSMTP認証なしでも許可するようになっている。この挙動を変えるためには下のパッチを適用する;

QmailMSP (ariollak.com)

パッチを qmail ソースに -p1 オプションで適用して qmail を上書きインストールしたら、サブミッションポート版の qmail-smtpd 起動スクリプトを /etc/init.d/ に作成する。これだ (これにも我が小ユーティリティ detectpid が要る);

init.d/qsmtpd_op25b

また、/etc/services ファイルにポート 587/TCP (submission) が定義されているかを確認し、なければ書き加えておく。

もうひとつ、上記 rcスクリプト用の tcpserver のルールファイルも別途作成しなければならないが、それは次の「環境変数の設定」で説明する。

環境変数の設定

qmail-smtpup は SMTP認証時に CRAM-MD5 による暗号化 (ハッシュ) ネゴシエーションを、また、 vida によってパッチが当たった qmail-popup は APOP 認証をデフォルトとしている。しかし、メールクライアント側の移行をシームレスに行うため (特に Windows版の OUTLOOK EXPRESS が未対応なので問題)、平文認証も生かしておく必要がある。smtp, pop3 とも、環境変数 ALLOWPLAIN が設定されていると、平文認証も許可するようになる。実際にどちらでネゴシエーションを行うかは、セッションでクライアントが送ってくるコマンドによって自動的に選択される。環境変数を設定する手段はいろいろと考えられるが、ここでは tcpserver のルール cdb を活用することにする。

pop3 用 tcp.pop3.cdb

root になって /etc/service/tcp.pop3 ファイルを新規エディット。内容はこれだけ:

:allow,ALLOWPLAIN=""

保存したら cdb に書き出す:

root# cd /etc/service
root# tcprules tcp.pop3.cdb tcp.pop3.tmp < tcp.pop3

smtp 用 tcp.smtp.cdb

root 権限で /etc/service/tcp.smtp ファイルを編集する:
Qmail-Scanner をインストールしてない場合は、QMAILQUEUE=... の部分は、無いだろうから無視していただきたい。

127.0.0.1:allow,RELAYCLIENT="",ALLOWPLAIN=""
:allow,QMAILQUEUE="/var/qmail/bin/qmail-scanner-queue.pl",ALLOWPLAIN=""

同様に cdb へ変換:

root# tcprules tcp.smtp.cdb tcp.smtp.tmp < tcp.smtp

smtpサブミッションポート用 tcp.smtp_op25b.cdb

QmailMSP パッチは、SUBMISSION という環境変数がセットされていることを目印にして、tcpthosts を無視するかどうかを決める。よって、/etc/service/tcp.smtp_op25b は以下のようになる。 root 権限で /etc/service/tcp.smtp_op25b ファイルを新規エディットする:
Qmail-Scanner をインストールしてない場合は、QMAILQUEUE=... の部分は、無いだろうから無視していただきたい。

127.0.0.1:allow,RELAYCLIENT="",ALLOWPLAIN=""
:allow,QMAILQUEUE="/var/qmail/bin/qmail-scanner-queue.pl",ALLOWPLAIN="",SUBMISSION=""

cdb へ変換:

root# tcprules tcp.smtp_op25b.cdb tcp.smtp_op25b.tmp < tcp.smtp_op25b

ユーザマネージメント

ここではバーチャルドメインは考えに入れていないので、基本的には本稿の 「システムアカウントを増やさずにメールユーザを作る」 の設定をベースに解説する。パスワードの管理方法が変わっただけで、根本的には同じことをやっているからだ。行われることの意味が理解したいのなら、「システムアカウントを増やさずにメールユーザを作る」 が役に立つはずだ。

例で使用する設定 実在システムユーザ:
仮想メールボックスの実オーナー:
仮想メールボックスの実グループ:
仮想メールボックスのベースdir:
最初の一般メールユーザ:
hoshu
pop
vida
/home/pop
hanako

qmail-vida のマニュアルでは、上記の項目を以下のように呼んでいる。適宜読み替えていたきたい:

大半の作業は qmail-vida のツールで行うことになる。通常使うプログラムはデフォルトなら /var/qmail/bin/ にあり:

vida-passwd メールパスワードの追加、削除、変更を行う。デフォルト動作では、同時にパスワード cdb のアップデートも行われる。実行するユーザによって動作が異なる
vida-assign 一般メールユーザの登録、削除を行う。つまり、qmail/users/assign の変更だ。デフォルトでは、同時にユーザ cdb のアップデート (つまり qmail-newu) も行われる
vida-maildirmake 一般メールユーザの Maildir (仮想メールボックス) を作成する。仮想メールボックスの実オーナー、つまり pop 権限で実行しなければならない

実在システムユーザのマネージメント

実際にシステム上にユーザアカウントを持っているユーザの場合、操作はすべてそのユーザの権限 (例では hoshu) で行う。

登録

既に Maildir を持っている場合

qmail/authdb/pwdusers/cdb にパスワードを登録するだけ。

hoshu$ /var/qmail/bin/vida-passwd
新たにシステムユーザを作成した際の手順

ここでも、ユーザ名は hoshu だったと仮定する。

hoshu$ cd
hoshu$ /var/qmail/bin/maildirmake Maildir
hoshu$ /var/qmail/bin/vida-passwd

もちろん、ドットqmail ファイルも作る必要がある。ユーザの dot-qmail ファイル作成を読むべし。

メールパスワードの変更

hoshu$ /var/qmail/bin/vida-passwd -c

登録解除 (pop も smtp も使う必要がなくなった場合など)

hoshu$ /var/qmail/bin/vida-passwd -d

一般 (仮想) メールユーザのマネージメント

仮想メールボックスを使うユーザを登録する際には、仮想メールボックスの実オーナーである pop となって作業を行う。

※ 当然ながら、既に assign に存在するものと重複するユーザエントリは作成できない。これまで手動で assign を行ってきたユーザデータベースが qmail/users にある場合は、cdb も元テキストファイルもリネームするなどして、どけておかなくてはならない。その際に、assign ファイルが存在しなかったりパーミションが正しくないと vida-assign は正常動作できないので、ディレクトリの整備 に示した正しい属性で空の assign ファイルを作っておく必要がある。

ユーザの作成

user$ su pop
pop$ /var/qmail/bin/vida-passwd -a -u hanako        (1)
pop$ /var/qmail/bin/vida-assign -a -u hanako        (2)
pop$ /var/qmail/bin/vida-maildirmake hanako Maildir (3)

ドットqmail の面倒は見てくれないので手動で作成する必要がある。上記によって行われることは:

(1) qmail/authdb/pop/passwd への hanako 用パスワード追加と cdb への変換
(2) qmail/users/assign への hanako 定義の追加と、 qmail-newu コマンドによる qmail/users/cdb の更新
(3) /home/pop/hanako ディレクトリの作成と /home/pop/hanako/Maildir 構造の作成

(2) で追加される assign の記述は下記。意味を知りたければ /var/qmail/users/assign の編集と cdb への変換 を参照のこと:

=hanako:pop:900:900:/home/pop/hanako:::
+hanako-:pop:900:900:/home/pop/hanako:-::
悪いパスワードでも強制的にユーザ作成を行う方法

vida-passwd には、入力されたパスワードが短すぎると "Bad Password. Password too short" などのエラーを吐いてユーザ作成を継続させてくれない。通常はありがたい機能なのだが、それまで checklocalpwd などを使用してきた環境から vida メカニズムに移行する場合には、既存のメールユーザが使ってきた「悪い」パスワードをそのまま使わざるを得ないこともある。そういった際には、通常なら vida-passwd 経由でコールされるプログラム vida-pwdbmake を、単独で利用すれば登録が可能だ。まず、一般 (仮想) メールユーザの場合の手順を示そう:

  1. pop$ /var/qmail/bin/vida-passwd -a -u hanako で、暫定的に「悪くない」仮パスワードにてパスワードを登録。
  2. /var/qmail/authdb/pop/passwd を root 権限で編集。hanako のパスワードを元来の「悪い」パスワードに書き換える。
  3. pop$ /var/qmail/bin/vida-pwdmake
  4. pop$ /var/qmail/bin/vida-assign -a -u hanako

実在システムユーザの場合は;

  1. hoshu$ /var/qmail/bin/vida-passwd で、仮パスワードにてパスワード登録。
  2. /var/qmail/authdb/pwdusers/passwd を root 権限で編集。hoshu のパスワードを元来の「悪い」パスワードに。
  3. hoshu$ /var/qmail/bin/vida-pwdmake
付属のサンプルスクリプトの使用

実は qmail/doc/qmail-vida/samples/admin に、上記 1, 2, 3 の手順を簡略化するためのシェルスクリプトサンプルが提供されている。一般メールユーザの追加は vida-useradd, 削除用には vida-userdel だ。例えば:

pop$ vida-useradd hanako

という風に使う。これらをベースにして工夫を加えるといいだろう。例えば、vida-useradd にはドットqmail の作成を追加。vida-userdel は一般メールユーザのディレクトリ (例えば /home/pop/hanako) の削除も行われる仕組みになっているが、.qmail が存在したり、Maildir が複数あった場合 (サブメールアドレス hanako-second@hoge.cxm も持っている時など) は手に負えなくなるので、手を加える必要がある。

メールパスワードの変更

pop$ /var/qmail/bin/vida-passwd -c -u hanako

ユーザの抹消

pop$ /var/qmail/bin/vida-passwd -d -u hanako
pop$ /var/qmail/bin/vida-assign -d -u hanako
pop$ cd ~
pop$ rm -rf ./hanako