ここでは、qmail インストールのバリエーションとして、TAKIZAWA Takashi 氏の qmail-vida を中心にいくつかのパッチやユーティリティを組み合わせたインストールを行う。vida は VIrtual Domain and Authentication から名付けたパッケージ名だそうで、バーチャルドメインを含めたユーザ管理, cdb によるパスワードデータベース, SMTP-AUTH と CRAM-MD5 によるその暗号化, APOP など、qmail を様々な面で拡張してくれる。
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
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
checkpassword, ucspi-tcp, qmail から qmail-vida への必要ライブラリのコピーと、ucspi-tcp, qmail から checkpassword へのライブラリコピーが行われる。
user$ cd ../qmail-vida-0.53 user$ make copy
user$ su root# cd ../netqmail-1.05/netqmail-1.05 root# make setup check root# ./config-fast mail.hoge.cxm (初回インストールの場合のみ!!)
root# cd ../../checkpassword-0.90 root# make root# make setup check
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/ にインストールされる。
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 基本編の起動スクリプトをベースに話を進める。つまり、deamontool は使用しておらず、tcpserver を介して起動するものと仮定する。まずは微調整で済む pop3 のほうから行こう。
以前のスクリプトを元にして、start ファンクション部分の checklocalpwd を checkpassword に変更し、後述の環境変数設定のために 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&
こちらも 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 としてコピーして使用する。
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認証なしでも許可するようになっている。この挙動を変えるためには下のパッチを適用する;
パッチを qmail ソースに -p1 オプションで適用して qmail を上書きインストールしたら、サブミッションポート版の qmail-smtpd 起動スクリプトを /etc/init.d/ に作成する。これだ (これにも我が小ユーティリティ detectpid が要る);
また、/etc/services ファイルにポート 587/TCP (submission) が定義されているかを確認し、なければ書き加えておく。
もうひとつ、上記 rcスクリプト用の tcpserver のルールファイルも別途作成しなければならないが、それは次の「環境変数の設定」で説明する。
qmail-smtpup は SMTP認証時に CRAM-MD5 による暗号化 (ハッシュ) ネゴシエーションを、また、 vida によってパッチが当たった qmail-popup は APOP 認証をデフォルトとしている。しかし、メールクライアント側の移行をシームレスに行うため (特に Windows版の OUTLOOK EXPRESS が未対応なので問題)、平文認証も生かしておく必要がある。smtp, pop3 とも、環境変数 ALLOWPLAIN が設定されていると、平文認証も許可するようになる。実際にどちらでネゴシエーションを行うかは、セッションでクライアントが送ってくるコマンドによって自動的に選択される。環境変数を設定する手段はいろいろと考えられるが、ここでは tcpserver のルール cdb を活用することにする。
root になって /etc/service/tcp.pop3 ファイルを新規エディット。内容はこれだけ:
:allow,ALLOWPLAIN=""
保存したら cdb に書き出す:
root# cd /etc/service root# tcprules tcp.pop3.cdb tcp.pop3.tmp < tcp.pop3
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
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) も行われる |
一般メールユーザの Maildir (仮想メールボックス) を作成する。仮想メールボックスの実オーナー、つまり pop 権限で実行しなければならない |
実際にシステム上にユーザアカウントを持っているユーザの場合、操作はすべてそのユーザの権限 (例では hoshu) で行う。
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
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 の面倒は見てくれないので手動で作成する必要がある。上記によって行われることは:
(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 を、単独で利用すれば登録が可能だ。まず、一般 (仮想) メールユーザの場合の手順を示そう:
実在システムユーザの場合は;
実は 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