第8章 仮想ドメイン機能による複数サイトの実現 - qmail で作る快適メールサーバー

佐藤 文優 <https://fumiyas.github.io/>
2001年12月17日 更新, 2001年11月4日 以来

目次

8.1 仮想ドメインとは
8.1.1 1台のホストで複数ドメインのサービスを提供するには
8.1.2 qmail による仮想ドメイン対応
8.1.3 POP3 サーバーの仮想ドメイン対応
8.2 qmail と VMailMgr による仮想ドメイン環境の構築
8.2.1 VMailMgr のインストール
8.2.2 VMailMgr の設定
8.2.3 VMailMgr 環境をテストする
付録
参考文献
更新履歴

8.1 仮想ドメインとは

8.1.1 1台のホストで複数ドメインのサービスを提供するには

DNS や Web そしてメールなど、 いくつかのネットワークサービスを提供するサーバーを構築・運用するとき、 各サービスを別々のホストに分離することはもちろん、 単一のホストに同居させることもできます。 どちらにしても利点と欠点がありますが、 単一のホストにまとめたほうが導入・運用のコストを抑えることができるでしょう。 特に、ホストのパフォーマンスに余裕があるときや、 小規模なサイトであるならば、 1台のホストで複数のサービスを提供することはよくあります。

それでは、 複数のサイト向けのサービスを単一のホストで実現するにはどうしたらよいでしょうか。 例えばインターネットメールサービスであれば、 それぞれのサイトのドメインのメールを扱う SMTP サーバーが必要になります。

1台のホストに複数のサーバーソフトウェアをインストールし、 それぞれ別のサイト (ドメイン) 用のサービスを提供する方法があります。 設定やユーザー情報なども、サイトごとに分離した形で管理されます。 これを実現するには、 SMTP なら各サーバーが同じポート番号 25 を使用するため、 ホストにはサイトの数だけ IP アドレスが必要になります。 近頃の UNIX 系の OS は、 1つの物理的なネットワークインターフェイスに複数の IP アドレスを割り当てることができるので、 ネットワークカードを追加しなくても済みます。

複数サイトのサービスを扱えるサーバーソフトウェアを利用する方法もあります。 この場合も、もちろん設定やユーザー情報はサイトごとに用意しなければなりません。 通信プロトコルやユーザーの認証情報など、 クライアントから渡されるデータに何かしらサイト (ドメイン名) を特定できる情報が含まれているのであれば、 サイトごとに IP アドレスを用意する必要はありません。 サーバーソフトウェアは、 ドメイン情報をもとにサービス対象のサイトを認識します。

このように、単一のホストで複数サイト (ドメイン) 向けのサービスを扱える機能のことを、 「仮想ホスト (virtual host) 機能」あるいは 「仮想ドメイン (virtual domain) 機能」と呼びます。 また、サーバーの IP アドレスにより識別・サービスを提供されるサイトのドメインを 「IP ベースの仮想ドメイン (IP-based virtual domain)」、 クライアントから渡されるドメイン名やホスト名、 ユーザー名などをもとに識別・サービスを提供されるサイトのドメインを 「名前ベースの仮想ドメイン (name-based virtual domain)」 と呼びます。

8.1.2 qmail による仮想ドメイン対応

qmail の仮想ドメイン機能

qmail には、複数のドメインのメールを受信し、 ドメインごとに異なるユーザー空間とメールボックスを扱うための機能があります。

qmail で単一ドメインだけを扱う場合は、通常、 ドメインのユーザーは UNIX のユーザーアカウントに対応します。 各ユーザーのメールは、対応する UNIX ユーザーに配送・保持されます。

一方、 仮想ドメイン機能を利用してほかのドメイン宛のメールをローカル配送させる場合は、 メールはドメインごとに指定された単一の UNIX ユーザー宛に配送されます。 仮想ドメインのユーザーは、 配送先の UNIX ユーザーが所有する .qmail ファイルに対応します。 UNIX ユーザーには通常のアドレスではなく拡張アドレス (→7.2 節) として配送されるため、 「.qmail-仮想ドメインのユーザー名」 という名前のファイルが評価対象になります。 つまり、.qmail ファイルによって、 仮想的なユーザーと配送先のメールボックスを管理します。

qmail の仮想ドメイン機能により受信したメールは、 以下に示すような流れでメールボックスに配送されます。 ここで示している仮想ドメインや UNIX ユーザーの名前、 そして .qmail ファイルとメールボックスの配置の構成は、 ほんの一例です。 当然ながら、これとは異なる名前や構成も可能です。

図: qmail の仮想ドメイン機能によるメールの受信の流れ Overview and flow chart of qmail virtualdomain facility
  1. 仮想ドメイン管理下のアドレス alice@vdom.example.jp 宛のメールを受信する。
  2. 宛先アドレスは、vdom.example.jp ドメインの配送先に指定されている UNIX ユーザー vdomuser の拡張アドレスに変換される。
  3. vdomuser のホームディレクトリ下の .qmail-alice が評価される。
  4. .qmail-alice で指定されたメールボックス ~vdomuser/alice/Maildir/ に配送される。

仮想ドメイン下のユーザーがメールを読むには

qmail の仮想ドメイン機能を利用すれば複数ドメインのメール受信が可能になりますが、 受信しメールボックスに保存されたメールは、 ユーザーがどうやって読むのでしょうか。

先の節で触れたように、 qmail によって受信された仮想ドメインのメールは、 すべてある 1つの UNIX ユーザーが保持しています。 よって、 仮想ドメインのユーザーをメールボックスが保持されているホストにログインさせ、 自分のメールボックスだけを参照させることは難しくなります。

そこで、仮想ドメイン用の独自のユーザー管理と認証、 そして仮想ドメインのメールボックスへのアクセスに対応した POP3/IMAP サーバーを利用します。 仮想ドメインにより管理されるサイトのユーザーには、 ユーザーのクライアント端末から POP3/IMAP を利用してメールボックスにアクセスさせます。

実は、qmail による仮想ドメイン下のユーザーは、 別々の UNIX ユーザーに割り当てることも可能です。 しかし、 ドメインのユーザーに個別の UNIX のユーザー権限を与える必要がないことも多いです。 唯一のドメインを扱うときでさえ、 個別の UNIX ユーザーに分離せず、 仮想ドメイン機能を利用して単一の UNIX ユーザーに集約させることもあります。

8.1.3 POP3 サーバーの仮想ドメイン対応

qmail-pop3d の仮想ドメイン対応

qmail 付属の POP3 サーバー qmail-pop3d は、 仮想ドメイン環境下でも使用することができます。 qmail-pop3d は、 ユーザー認証とメールボックスの位置の指示を別のプログラムに任せているため、 そのプログラムが仮想ドメインに対応していることが要件になります。

先の「5.1 POP サーバーの設定」 で紹介した認証プログラム checkpassword は、 UNIX ユーザーの認証にのみ対応しており、 仮想ドメインには利用できません。 qmail-pop3d とそのフロントエンドである qmail-popup に対応し、 かつ仮想ドメインにも対応している認証プログラムとしては、 VMailMgr か VPopMail がよく利用されます。

VMailMgr の Web サイト
http://www.vmailmgr.org
VPopMail の Web サイト
http://www.inter7.com/vpopmail/

両パッケージにはいくつか違いがありますが、共通して次のような特徴があります。

どちらかというと、VMailMgr より VPopMail のほうが人気があるようです。 VPopMail には、VMailMgr にはない次のような特徴もあるせいかもしれません。

両ソフトウェアパッケージには、ここで紹介していない特徴もあります。 詳しくは Web ページや付属文書などをご覧ください。 VPopMail については、以下のページに日本語で書かれた情報があります (情報が少々古いので注意)。

VPopMail の日本語ドキュメントがある Web サイト (ユーザーサイトの一つ)
http://qmail.visionmakers.net/

また、qmail-popup/qmail-pop3d に対応した認証プログラムの多くは、 The qmail home page で見つけることができます。 ここで紹介した VMailMgr と VPopMail の人気や機能の多さだけにとらわれず、 ほかの認証プログラムも評価してみることをお勧めします。

checkpassword と代替プログラムの情報 (The qmail home page)
http://www9.jp.qmail.org/top.html#checkpassword (ミラー)
http://www.qmail.org/top.html#checkpassword

VMailMgr と VPopMail、どちらがよいか

VPopMail は VMailMgr より高機能であり、利用者も多いため、 筆者は一旦は VPopMail を採用し解説しようとしました。 しかし、VPopMail には次のような問題があることに気付いたため、 結局は VMailMgr を採用することにしました。 そんな私は偏執的でしょうか?

仮想ドメインの管理はすべて root 権限で行う

文書で明示している箇所は見つけられなかったが、 仮想ドメインの管理作業は、 すべて root 権限で行う方針のようである。 付属文書ファイル INSTALL にはそのような操作例が記述がされている。

root 権限は仮想ドメインを受信するために qmail の設定を変更するとき以外、不要なはずである。 仮想ドメインの管理権限を root から委譲することは考慮していないのだろうか。

インストールされるコマンドのファイルが VPopMail 専用ユーザーの所有になる

仮にクラックされ VPopMail 専用のユーザー権限が奪われると、 クラッカーは、 VPopMail 付属のコマンドを書き換えることが可能になる。 VPopMail のコマンドは root が起動することがあるため、 結果、root 権限までも奪取されてしまう。


8.2 qmail と VMailMgr による仮想ドメイン環境の構築

8.2.1 VMailMgr のインストール

VMailMgr のソースの入手

VMailMgr のソースアーカイブを、 同 Web サイトのダウンロードページなどから入手してください。 現在、最新バージョンは 0.96.9 で、 アーカイブファイル名は vmailmgr-0.96.9.tar.gz、 サイズは 362,379 バイトです。

VMailMgr の最新バージョンのソースアーカイブ (RPM/SRPM パッケージもあり)
http://www.vmailmgr.org/current/

VMailMgr のコンパイルには、C コンパイラと C++ コンパイラ、 リンカー、make ユーティリティが必要です。

ソースアーカイブの展開と configure スクリプトの実行

ソースアーカイブは tar + gzip 形式になっているので、 両コマンドを利用して展開します。 ソースは「vmailmgr-バージョン番号」 という名前のディレクトリ以下に展開されます。

VMailMgr ソースアーカイブの展開:
$ gzip -dc vmailmgr-0.96.9.tar.gz | tar xf -

次に展開されたディレクトリに入り、 付属の configure スクリプトを実行し、 コンパイル前の準備をします。

VMailMgr のコンパイル前の準備 (configure スクリプト実行):
$ cd vmailmgr-0.96.9
$ ./configure
… configure の実行状況 …

デフォルトで生成される Makefile は、 VMailMgr のコマンドやマニュアルファイルなどを /usr/local 以下にインストールします。 インストール先を変更するには、 configure スクリプトの --prefix オプションを利用して指定してください。

コンパイルとインストール

あとは make コマンドでコンパイルとインストールを実行します。

VMailMgr のコンパイルとインストール:
$ make
… バイナリなどのコンパイル状況 …
$ su
Password: root のパスワード
# make install
… インストールの状況 …

qmail-pop3d 起動スクリプトに VMailMgr を組み込む

qmail-pop3d (tcpserver) の起動スクリプトを修正し、 checkpassword の代わりに、 VMailMgr 付属の認証プログラム checkvpw を使うように変更します。 デフォルトで checkvpw/usr/local/bin/checkvpw にインストールされます。 「5.2 APOP サーバーの設定」を参考にして修正してください。

修正を終えた後は、 qmail-pop3d (tcpserver) を再起動するのを忘れないようにしてください。

VMailMgr の各種バイナリ/ソースパッケージ

バイナリ/ソース RPM パッケージ (Red Hat Linux など)
ソースアーカイブに RPM パッケージ作成用の spec ファイルが含まれている
VMailMgr の Web サイトにも SRPM/RPM とも公開されている
Debian GNU/Linux
残念ながら公式パッケージはない
http://kebo.vlsm.org/debian-extra/dists/stable/vmailmgr/ などから入手可能
FreeBSD など
残念ながら公式パッケージ / port はない

8.2.2 VMailMgr の設定

この節では、ドメイン vdom.example.com のメールを仮想ドメインで受信し、 POP3 経由でメールボックスにアクセスさせるための設定例を紹介します。

仮想ドメイン用の UNIX ユーザーの作成

VMailMgr は、1つの仮想ドメインを専用の UNIX ユーザーで管理します。 ここでは、ユーザー名を vdomuser とし、グループも専用の vdomgroup を用意して所属させましょう。

ドメイン vdom.example.com 用の UNIX ユーザーとグループの作成 (Linux, Solaris など):
# groupadd -g vdomgroup
# useradd -g vdomgroup -m vdomuser
ドメイン vdom.example.com 用の UNIX ユーザーとグループの作成 (FreeBSD):
# pw groupadd vdomgroup
# pw useradd vdomuser -g vdomgroup -m

仮想ドメインのユーザー情報やメールボックスは、 すべて専用 UNIX ユーザーのホームディレクトリ以下に保持されます。 よってホームディレクトリは必須です。 また、仮想ドメインの管理はこのユーザーで行なうため、 シェルを利用できるようにしておきます。

qmail の仮想ドメインの設定

まずは SMTP (qmail-smtpd) による受信のための設定です。 vdom.example.com ドメイン宛のメールを受信するように、 control/rcpthosts ファイルに次の一行を追加します。

SMTP で vdom.example.com ドメイン宛メールを受信可能にする (control/rcpthosts に追加):
vdom.example.com

受信した vdom.example.com ドメイン宛のメールを仮想ドメインとして扱い、 ローカルのユーザー vdomuser に配送させます。 仮想ドメインの設定は、 control/virtualdomains ファイルで指示します。

vdom.example.com ドメイン宛メールを仮想ドメイン扱いする (control/virtualdomains に追加):
vdom.example.com:vdomuser

control/virtualdomains ファイルの変更を反映するには、 qmail-send プロセスに HUP シグナルを送るか、 再起動しなければなりません。 また、 vdom.example.com 宛のメールが仮想ドメインの設定したこのホストに送信されるよう、 vdom.example.com ドメインの MX レコードの設定も合わせて必要です。

VMailMgr による仮想ドメインの初期設定

仮想ドメインのユーザーを管理する前に、 VMailMgr による仮想ドメインの準備をしなければなりません。 su コマンドを利用して root から仮想ドメインの管理用ユーザー vdomuser になり、 VMailMgr の vsetup コマンドを実行してください。

仮想ドメインの初期設定:
# su - vdomuser
$ /usr/local/bin/vsetup
vsetup: created users directory.
vsetup: wrote '.qmail-default' file.
vsetup: added alias 'mailer-daemon'
vsetup: added alias 'postmaster'
vsetup: added alias 'root'

vsetup コマンドを起動した結果、 ホームディレクトリ以下に次のようなファイルとディレクトリが生成されます。

.qmail-default ファイル
仮想ドメイン宛のメール配送の指示。 このドメインのユーザー宛のメールは、 すべてこのファイルに記述されている配送指定に従う。
VMailMgr の配送プログラム vdeliver を起動するように設定される。
passwd.cdb ファイル
仮想ユーザーの情報を保持するデータベースファイル。 ユーザー名、パスワード (MD5 でハッシュ化)、転送設定、 メールボックス容量制限などの情報が含まれている。
自動的に 3つのエイリアス mailer-daemon, postmaster, root が作成される。 デフォルトの転送先は、 そのホストの postmaster 宛になる (ドメイン部は省略されているため、qmail により control/envnoathost または me に指定されたドメイン名が補完される)。
users ディレクトリ
仮想ユーザーのメールボックスが置かれるディレクトリ。 ユーザーのメールボックスは maildir 形式となり、 パス名は「users/ユーザー名/」となる。

仮想ユーザーの作成

VMailMgr の vadduser コマンドを用い、 仮想ドメインの仮想ユーザーを作成します。

仮想ユーザーの追加とパスワード割り当て:
$ /usr/local/bin/vadduser alice
Enter the user's new password: aliceに割り当てるパスワード
Please type it again for verification: 確認のためのパスワード入力
vadduser: user 'alice' successfully added

8.2.3 VMailMgr 環境をテストする

仮想ドメイン宛にメールを送信

qmail-inject コマンドを使い、 vdom.example.com ドメイン宛のユーザー宛にメールを送信してみましょう。 送信したら、ユーザーのメールボックスにメールが届いたことを確認してください。

仮想ドメインへのメール配送のテスト:
$ echo to: alice@vdom.example.com | qmail-inject
$ ls -l users/alice/new
total 4
-rw-------    1 vdomuser vdomgroup     292 Nov 14 00:10 1005664253.31953.mail

仮想ドメインのメールボックスのメールにアクセス

仮想ドメイン下に管理されるメールボックスを読むには、 サーバーは何らかの方法でアクセス対象のドメインを識別しなければなりません。

VMailMgr 付属の認証プログラム checkvpw は、 ユーザー認証のためクライアントから渡されるユーザー名により、 アクセス対象のドメインを識別することができます (名前ベースの仮想ドメイン機能)。 具体的には、 POP3/IMAP アクセス用のユーザー名として、 ドメインのユーザー名に続けてアットマーク「@」 とドメイン名を付加したものを使います。 つまり、ユーザー名としてメールアドレスを指定します。

以下に telnet コマンドで checkvpw コマンドを組み込んだ POP3 サーバー (qmail-pop3d) に接続し、 仮想ドメイン vdom.example.com のメールボックスにアクセスする例を示します。

仮想ドメインのメールボックスに telnet コマンドでアクセス:
$ telnet localhost pop3
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
+OK <32201.1005666384@mail.isp.example.net>
USER alice@vdom.example.com
+OK 
PASS aliceのパスワード
+OK 
LIST
+OK 
1 292
.
QUIT
+OK 
Connection closed by foreign host.

メールクライアントの中には、 POP3 のユーザー名にアットマーク「@」を含めると、 アットマーク以降を取り除いて POP3 サーバーに渡すものがあります。 そのようなメールクライアントをサポートするため、 アットマークの代わりにコロン「:」を含めることで、 この問題を回避することができます。 先の例では「alice@vdom.example.com」の代わりに 「alice:vdom.example.com」をユーザー名として使用可能です。

ユーザー名にアットマークが含まれていない場合、 仮想ドメインのユーザーでなく UNIX ユーザーの認証が行なわれます。


付録

参考文献

VMailMgr の Web サイト
http://www.vmailmgr.org
VPopMail の Web サイト
http://www.inter7.com/vpopmail/
qmail 周辺ツール
http://qmail.visionmakers.net/

更新履歴

2001-12-17 佐藤文優
初版発行前の校正の取り込み。
2001-11-14 佐藤文優
第1稿の完成
2001-11-04 佐藤文優
執筆開始