Solaris 道をゆく(15) - qmailを使ったメールサーバー

qmail のインストールと構成

今回は予告通り安全なメールサーバとして最近人気が高まってきているqmail について解説していきましょう。

qmail とは

qmailは前号で紹介したdjbdnsと同じD.J.Bernstein氏が作成しているメールサー バです。djbdnsと同様、設計段階からセキュリティや性能を考慮してある点が sendmailと比較した大きな利点といえるでしょう。またインターネットに特化 しているため、サーバとして必要な機能を保持しながら設計の簡素化が図られ ている点もdjbdnsと共通しています。
qmailのセキュリティの高さを示すものとして、最新版のqmail-1.03が1998年 にリリースされてから3年近く経過しているという点があげられるでしょう。 毎日のように何らかのプロダクトでセキュリティホールが発見され、ソフトウェ アのバージョンアップが行なわれている現状を考えると、qmailの安定性には 本当に驚嘆します。
なおqmailのソースファイルおよびインストールや運用に必要な各種情報は、 http://www.jp.qmail.org/以下から日本語で入手することが可能になっていま す。qmailを利用するのであれば、必ず参照するようにしてください。また本 誌2001年4月号の特集中でもqmailを取り上げていますので、参考にするとよい でしょう。

qmailのインストールと起動

qmailを利用するには、ソースアーカイブの入手とコンパイルの作業が必要に なります(注1)。それでは早速見ていきましょう。

注1: djbdnsと同様、セキュリティと互換性維持のため、qmailのバイナリを配布するには、http://www.jp.qmail.org/qmail/dist.htmlで定められた非常に厳格な条件を満たすことを求められています。一部バイナリを配布しているサイトなどもありますが、作者のD.J.Bernstein氏のポリシーを尊重して自分でコンパイルして利用することを願います。

ツールの入手とコンパイル

qmailのアーカイブ自体はqmail-1.03.tar.gzという名称で各所に存在しますの で、適宜入手してください。付録CD-ROMにもいれてあります。またqmailは単 体でも動作しますが、前号で紹介したdaemontoolsやucspi-tcp(tcpserver)と の連係が推奨されています。本文中でもucspi-tcpはインストール済という前 提で説明を行なっていきますので、前号を参照して適宜インストールを行なっ ておいてください。
その他にもqmailには連係して動作するプロダクトが幾つかあります。 とりあえず記事中で紹介するプロダクトを全てインストールしてしまいましょう。

qmail のインストール

qmailのインストールには幾つかの準備が必要です。まず実行例1のようにして qmailが利用するアカウントとディレクトリを作成します。多数のアカウント を利用しますが、これは可能な限り権限を細分化することで、万一侵入された ときの影響範囲を最低限にするためです。アカウントが正しく作成されていな いと、後述するmake setup checkが失敗してしまいますので、必ず事前に作成 しておいてください。/var/qmailというディレクトリも作成しておきます。 qmail関連の各種ファイルは基本的にこのディレクトリ以下に置かれることに なります(注2)。

# mkdir /var/qmail

# groupadd nofiles
# useradd -g nofiles -d /var/qmail/alias alias
# useradd -g nofiles -d /var/qmail qmaild
# useradd -g nofiles -d /var/qmail qmaill
# useradd -g nofiles -d /var/qmail qmailp

# groupadd qmail
# useradd -g qmail -d /var/qmail qmailq
# useradd -g qmail -d /var/qmail qmailr
# useradd -g qmail -d /var/qmail qmails

実行例1: qmailに必要なディレクトリとアカウントの作成

注2: 後述するように変更することも可能です。

ディレクトリを作成したら、実行例2のように展開後コンパイルを行ないます。 Solaris の場合ccが存在しないため(注3)、ファイルの展開後にconf-cc と conf-ld というファイル中のccという記述を各々図1と図2のようにgccに修正することを忘れないようにしてください。 開発環境の設定が正しく行なわれていれば(注4)、 root権限のあるアカウントで make setup checkとするだけで(注5) 簡単にコンパイルとインストールおよびインストールが正しく行なわれていることのチェックが完了します。

注3: もちろん商用のコンパイラを導入していれば、 cc のままでもコンパイルできる筈です。

注4: 初心者の方はCompanion CDをインストールした上で、

(1) csh系(csh, tcsh)の場合
csh% setenv PATH /usr/ccs/bin:/opt/sfw/bin:${PATH}

(2) sh系(sh,ksh,bashの場合)
sh$ PATH=/usr/ccs/bin:/opt/sfw/bin:${PATH}
sh$ export PATH

という設定をシェル初期化ファイルに記述してください。 もちろんCompanion CD中の開発ツールを使わずに自前でインストールしても構いません。

図1: conf-cc の修正

gcc -O2

This will be used to compile .c files.

図2: conf-ld の修正

gcc -s

This will be used to link .o files into an executable.

# gunzip -c qmail-1.03.tar.gz | tar xf -
# cd qmail-1.03
# vi conf-cc
# vi conf-ld
# make setup check
( cat warn-auto.sh; \
echo CC=\'`head -1 conf-cc`\'; \
echo LD=\'`head -1 conf-ld`\' \
(中略)
nroff -man forgeries.7 > forgeries.0
./install
./instcheck
# ./config
Your hostname is anduin.
Your host's fully qualified name in DNS is anduin.home.local.
(中略)
Now qmail will refuse to accept SMTP messages except to those hosts.
Make sure to change rcpthosts if you add hosts to locals or virtualdomains!

実行例2: qmail のコンパイル

注5: インストール場所を変更する場合は、conf-qmailというファイルの先頭行の/var/qmailとなっている部分を適宜修正してください。

インストールが完了したら、引続きconfigというスクリプトを実行することで 設定ファイルのテンプレートを作成します。なおこの際にはDNSの設定が行な われていて、ホストのFQDN名が正しく解決できるようにしておく必要がありま す。DNSの設定方法に付いては前号のdjbdnsの記事や、本誌2001年1月号の特集 などを参考にしてください(注6)。

注6: configスクリプトの代わりに、「config-fast <ホストのFQDN名>」と入力すれば、DNSが動作していない場合や、現在のDNSの設定とは無関係に設定を行ないたい場合でも、設定ファイルのテンプレートを作成することができます。ただし、最終的にメールシステムを正しく動作させるにはDNSの設定が必要です。

引続き dot-forward と fastforward という関連プロダクトをインストールし ます。なおこれらのプロダクトの機能や設定については後述します。

dot-forward のインストール

dot-forwardのアーカイブはdot-forward-0.71.tar.gzという名称でqmailのサ イトより入手可能です。入手後は実行例3のようにしてインストールを行なっ てください。qmailと同様、makeの前にconf-cc と conf-ld を修正する必要が あります。

# gunzip -c dot-forward-0.71.tar.gz | tar xf -
# cd dot-forward-0.71
# vi conf-cc ← cc を gcc に変更
# vi conf-ld ← cc を gcc に変更
# make setup check

実行例3: dot-forwardのインストール

fastforward のインストール

アーカイブは fastforward-0.51.tar.gz という名称でqmailのサイトより入手可 能です。入手後は実行例4のようにしてインストールを行なってください。 qmailと同様、makeの前にconf-cc と conf-ld を修正する必要があります。

# gunzip -c fastforward-0.51.tar.gz | tar xf -
# cd fastforward-0.51
# vi conf-cc ← cc を gcc に変更
# vi conf-ld ← cc を gcc に変更
# make setup check

実行例4: fastforward のインストール

sendmailの置き換え

最後に実行例5のようにして、幾つかのコマンドをsendmailが提供するものと 置き換えます。qmail自体はこれらのコマンドを利用することはありませんが、 多数のプログラムがsendmailコマンドの存在を前提として動作しているため、 実際にシステムを稼働させる上ではこのコマンドの置き換えは必須です。

# cd /usr/lib
# mv sendmail sendmail.org
# ln -s /var/qmail/bin/sendmail .

実行例5: sendmail コマンドの置き換え

なお、何度か述べてきているように、オリジナルのsendmailコマンドはバック アップしておき、OSのパッチなどを適用する際には一時的に元に戻しておくよ うにしてください。

最低限の設定と動作の確認

それでは動作確認のために自ホスト宛以外のメールは全てメールサーバに 転送するというメールクライアントとしての設定を行ないましょう。
まずは実行例6のようにしてメールシステムに最低限必要なエイリアスの設定 (注7)を行ないます。引続き実行例7のようにして、宛先が自分以外のメールを 送信するメールサーバを smtproutes ファイルで指定します。

# cd ~alias
# touch .qmail-postmaster .qmail-mailer-daemon .qmail-root
# chmod 644 ~alias/.qmail*

実行例6: 最低限の設定

注7: 後で解説しますが、これはpostmaster、mailer-daemon、root アカウントが各々メールが受け取れる設定を行なったことになります。
# echo :mail.home.local > /var/qmail/control/smtproutes

実行例7:

上記ではメールサーバのホスト名をmail.home.localと指定しています。

なお、このファイルの書式は

ドメイン名:転送先[:転送ポート]

となっていて、特定ドメイン名宛のメールを特定ホストに転送すると いった制御も可能な仕様になっています。ドメイン名が空白の場合は 「全て」のドメインを表しますので、実行例7では自ホストから外 部宛の全てのメールをmail.home.localに転送する指定になっている訳です。

メールサーバとして利用するのでなければ、これだけで設定は完了です。

qmail の起動と停止

最低限の設定ができたところで、qmailを起動してみましょう。 qmailの起動はメール送信(配送)部分と受信部分とで別個に行ないます。

送信部分の起動と動作確認

まずは、送信部分を起動してみましょう。ここではsendmailが起動してい ても構いません。実行例8のように、/var/qmail/rcファイルを作成した上で、 ファイルを実行します(注8)。

# cp /var/qmail/boot/binm3+df /var/qmail/rc
# csh -cf '/var/qmail/rc &'

実行例8:

注8: /var/qmail/boot には、binm+df3 以外にも rc ファイル用のテンプレートが幾つかありますので、適宜利用してください。ただし本記事では、binm3+df を利用する前提で解説を行なっていきます。

起動に成功した場合は、/var/log/syslogファイルに図3のようなメッセージが 表示されます。このように「status: local 0/10 remote 0/20」というメッセー ジがあれば、起動に成功しています。

図3:

May 13 04:11:32 anduin qmail: [ID 748625 mail.info] 989694692.069321 status: local 0/10 remote 0/20

念のため ps コマンドで qmail 関連のプロセスが起動していることを確認し ます。図4のように 5 つのプロセスが起動していれば成功です。

図4: qmail の起動確認

qmails 1768 1 0 17:24:59 pts/2 0:00 qmail-send
qmaill 1769 1768 0 17:25:00 pts/2 0:00 splogger qmail
qmailq 1772 1768 0 17:25:00 pts/2 0:00 qmail-clean
qmailr 1771 1768 0 17:25:00 pts/2 0:00 qmail-rspawn
root 1770 1768 0 17:25:00 pts/2 0:00 qmail-lspawn |dot-forward .forward|preline -f /bin/mail -f "${SENDER:-MAILER-D

ここで実行例9のようにして自ホスト上のアカウントにメールを送信すると、 図5のようなログが記録され、送信できることが確認できるはずです。同様に 自ホスト上の存在しないアカウントに対してメールを送信すると図6のように メールボックスが存在しないというエラーが出力されるはずです。

# echo to: monyo@anduin.home.local | /var/qmail/bin/qmail-inject

実行例9:

図5:

May 13 04:17:55 anduin qmail: [ID 748625 mail.info] 989695075.797727 starting delivery 1: msg 378826 to local monyo@anduin.home.local

図6:

May 13 04:25:23 anduin qmail: [ID 748625 mail.info] 989695523.837197 delivery 6: failure: Sorry,_no_mailbox_here_by_that_name._(#5.1.1)/

引続き、実行例10のように外部へのメール送信も確認しておきましょう。実行 例9が成功するにも関わらず、実行例10のパターンが失敗する場合はDNSの設定 に問題がありますので、2001年1月号や先月号などを参照して、設定を確認し てください。

% echo to: me@remote.host | /var/qmail/bin/qmail-inject
~~~~~~~~~~~~~~ ← 外部のメールアドレスを指定する
=====
Jun 5 02:14:43 anduin qmail: [ID 748625 mail.info] 991674883.015961 delivery 17: success: 210.143.98.156_accepted_message./Remote_host_said:
_250_CAA01116_Message_accepted_for_delivery/

実行例10: リモートへの送出テスト

qmail-smtpd の起動

smtpポートでメールを受信する qmail-smtpd は inetd や tcpserver などを経由して起動します。ここでは inetd を利用してみましょう。inetd.conf に図7のような行を追加した上で、

図7:

smtp stream tcp nowait qmaild /var/qmail/bin/tcp-env tcp-env /var/qmail/bin/qmail-smtpd

# kill -HUP `pgrep inetd`

で変更を反映させます。なお可能であれば tcpserver 経由での起動が推奨されています。tcpserver をインストールしてあれば、実行例11のように tcpserverを実行することで qmail-smtpd の起動が可能です。

# tcpserver -u <qmailのuid> -g <nofilesのgid> 0 smtp /var/qmail/bin/qmail-smtpd &

実行例11: tcpserver での qmail-smtpd 起動

なお sendmail が動作している場合は smtp ポートの利用が競合しますので、設定を行なう前には忘れずに

# /etc/init.d/sendmail stop

と入力して、sendmailを停止させておいてください。なおqmailに完全移行する場合は、/etc/rc2.d/S88sendmail のファイル名をファイル名の先頭に「_」を追加するなどして、sendmailが自動起動しないように設定を変更しておいてください(注9)。

注9: このあたりのディレクトリの役割などに付いては2001年5月号のSolaris速習コース等を参照してください。

起動したら、メールが送信できることを確認しておきましょう。 別のホストから図7のようにしてメールを送信してみましょう。 うまく行けば、図7のように、ログが出力されるはずです。

図7:

% Mail -s test root@anduin.home.local
test message
.
送信終了
=====
Jun 5 02:22:14 anduin qmail: [ID 748625 mail.info] 991675334.169552 info msg 378834: bytes 513 from <monyo@home.local> qp 24783 uid 1073742835
Jun 5 02:22:14 anduin qmail: [ID 748625 mail.info] 991675334.325995 starting delivery 18: msg 378834 to local root@anduin.home.local

ここまで確認したら、一度 qmail を停止しておきましょう。 送信部分の停止は図8のように qmail-send プロセスをkillするだけです(注10)。 図9のようにログに「exiting」というメッセージが出力されたら停止完了です。

図8:

# pkill qmail-send

注10: もし送信中のメッセージが存在した場合は、それらを処理してから終了しますので、メッセージが損失することはありません。

図9:

May 13 04:34:37 anduin qmail: [ID 748625 mail.info] 989696077.750503 status: exiting

qmail-smtpdの方は、inetd.confのエントリを無効にしてから設定を反映させ るか、tcpserverのプロセスをkillしてください。


  1/3 次へ ->

Copyright (C) 1998-2009 TAKAHASHI, Motonobu
Last update: 2005-02-23 14:46:43 JST
webmaster@monyo.com