2004年11月04日

FreeBSD qmail セットアップメモ

FreeBSDでのMTAのセットアップ作業をまとめる。MTAにはqmailを選んだ。処理能力が高さ、設定のシンプルさと簡単さ、セキュリティホールが何年も見つかっていない堅牢さがその理由である。逆に先端機能への対応や拡張性では、他の有名なMTAであるsendmailやpostfixが良いだろう。qmailのインストールとセットアップ作業をまとめる。

■ 構成

少人数で使うことを前提として、メールアカウントはシステムユーザの情報/etc/passwdを使う。正当なユーザだけが送信用メールサーバとして使えるようにSMTP AUTHを組み込む。また、SMTP AUTHやメールの情報が漏洩するのを防ぐため、通信を暗号化するTLSを組み込む。

■ インストール

まず、qmail にあてるパッチを2つ準備する。どちらも絶対必要なものではなく、好みに応じて使えば良い。1つ目はqmail-smtpd-relay-rejectであり、本来qmailでは無効なリレー中継要求を明示的に遮断するためのパッチである。2つ目はqmail-date-localtime.patchであり、メールヘッダの日付の時間帯をローカルに合わせるためのパッチである。
# mkdir /root/qmail
# cd /root/qmail
# fetch http://www.qmail.org/qmail-smtpd-relay-reject
# fetch http://mirror.averse.net/pub/FreeBSD/ports/local-distfiles/sada/qmail-date-localtime.patch.gz
# gzip -d qmail-date-localtime.patch.gz

続いて、qmailの本体をportsを使って利用する準備に入る。portsを使うことで、qmailが必要とするシステムユーザの追加やMTAの切り替えが簡単に行える。ひとまずコンパイル前の状態で処理を止め、さきほど入手したパッチを適用する。
# cd /usr/ports/mail/qmail-smtp_auth+tls
# make patch
# cd work/qmail-1.03/
# patch -p1 < /root/qmail/qmail-date-localtime.patch
# patch -p1 < /root/qmail/qmail-smtpd-relay-reject

portsに展開されたファイルへのパッチの適用が終わったら、コンパイルとインストールを続けて行う。
# cd ../..
# make
# make install

標準で利用されているMTAあるsendmailを無効にするため、次のコマンドを実行する。/etc/rc.conf に sendmail_enable="NONE" を加えてくれる。
# make disable-sendmail

システムからmail関連のプログラムが呼び出される際、mailer.confが参照される。qmailの関連ファイルが呼び出されるよう設定するため、次のコマンドを実行する。/etc/mail/mailer.conf を書き換えてくれる。
# make enable-qmail

ローカルへのメール配送用プログラムの起動スクリプトを準備する。/var/qmail/boot/ディレクトリにあるファイルから、適当なスクリプトを選択してコピーする。maildir を使う場合は、次のようにファイルをコピーする。また、シンボリックリンク/usr/local/etc/rc.d/qmail.shを作成してシステム起動時に呼び出されるようにする。
# cp /var/qmail/boot/maildir /var/qmail/rc
# ln -s /var/qmail/rc /usr/local/etc/rc.d/qmail.sh

TLSを使った暗号化通信のために、適当な自署名証明書を作る。次のコマンドを実行して、対話メニューを入力すると、/var/qmail/control/servercert.pem を作ってくれる。
# make certificate
-----
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:Tokyo
Locality Name (eg, city) []:Mitaka
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Toshikazu Ichikawa
Organizational Unit Name (eg, section) []:Toshikazu Ichikawa
Common Name (eg, YOUR name) []:mail.toshikazu.org
Email Address []:

SMTP AUTHを使うために必要なツールをインストールする。
# portinstall sysutils/ucspi-tcp
# portinstall security/checkpassword

checkpasswordを正しく動かすために、所有者と権限を設定する。
# cd /usr/local/bin
# ls -alF checkpassword
-rwsr-xr-x 1 root wheel 7464 Sep 12 23:33 checkpassword*
# chown root:qnofiles checkpassword
# chmod 4750 checkpassword
# ls -alF checkpassword
-rwsr-x--- 1 root qnofiles 7464 Sep 12 23:33 checkpassword*

ネットワークへのメール送受信を行うSMTPサーバプログラムを起動するためのスクリプトを準備する。次のようなファイルを準備する。ファイル中のcommoore.toshikazu.orgは適当なドメイン名に置き換えること。ちなみに、このスクリプトの名前をqmail-smtpd.shにしてしまうと、stop機能がうまく働かない点に注意(grepが引っかかるため)。
# vi /usr/local/etc/rc.d/smtpd.sh
# chmod 750 /usr/local/etc/rc.d/smtpd.sh

--- smtpd.shはここから ---
#!/bin/sh
#
# This script will not kill the tcpserver process !!!

case "$1" in

start)
# Start tcpserver instead of Inetd
/usr/local/bin/tcpserver -v -H -l 0 -R -u82 -g81 \
0 smtp /var/qmail/bin/qmail-smtpd \
commoore.toshikazu.org /usr/local/bin/checkpassword /usr/bin/true \
2>&1 | /var/qmail/bin/splogger smtpd 3 &
echo " qmail-smtpd "
;;
stop)
# kill command here
kill -TERM `ps axwww | grep [q]mail-smtpd | awk '{print $1}'` && \
echo " qmail-smtpd "
;;
*)
echo ""
echo "usage: qmail-smtpd.sh {start|stop}" >&2
echo ""
;;
esac
# end of script
--- smtpd.shはここまで ---

SMTPサーバを起動する。
# /usr/local/etc/rc.d/smtpd.sh start

これで、port 25番にアクセスした際に、startsslによりSSL/TLSを使う設定のMUAで接続すると通信が暗号化される。また、上記のように自証明証明書を用いている場合は、MUAで証明書を検証しないようにしておく必要がある。SMTP AUTHにはLOGINかPLAINを使う。そのときのIDとPWにはシステム/etc/passwdのものが有効になる。上記の設定だけでは、CRAM-MD5に有効なユーザは存在しない。SSL/TLSを使う設定にせず、SMTP AUTHのLOGINかPLAINを使うとパスワードが平文のままネットワークに流れて危険なので、MUAの設定には注意すること。

■ 設定

ローカルドメインの設定は次のようになる。

ローカルドメインをローカルと受信対象のリストに加える。
# cd /var/qmail/control
# echo toshikazu.org >> locals
# echo toshikazu.org >> rcpthosts

主要アドレスのあて先をユーザichiにする。
# cd /var/qmail/alias
# echo '&ichi' > .qmail-mailer-daemon
# echo '&ichi' > .qmail-postmaster
# echo '&ichi' > .qmail-root
# echo '&ichi' > .qmail-abuse
# echo '&ichi' > .qmail-hostmaster
# echo '&ichi' > .qmail-webmaster
# echo '&ichi' > .qmail-ichikawa
# echo '&ichi' > .qmail-ichikaw
# echo '&ichi' > .qmail-toshikazu

ユーザのメールフォルダを作成し、メールが受信できるようにする。
# su - ichi
% cd
% /var/qmail/bin/maildirmake ~/Maildir
% echo ./Maildir/ > ~/.qmail
% chmod 600 ~/.qmail
% exit

また、バーチャルドメインの設定は次のようになる。

バーチャルドメインを受信対象のリストに加え、バーチャルドメインと受信ユーザの対をバーチャルドメインのリストに加える。
# cd /var/qmail/control
# echo tsushin.tv >> rcpthosts
# echo tsushin.tv:tom >> virtualdomains

ユーザのメールフォルダを作成し、メールが受信できるようにする。
# su - tom
% cd
% /var/qmail/bin/maildirmake ~/Maildir
% echo ./Maildir/ > ~/.qmail-default
% chmod 600 ~/.qmail-default
% exit
この例では、tsushin.tvドメインのユーザhoge宛のメールは、ユーザtomの設定ファイル.qmail-hogeに従って配送される。このファイルがなければ、代わりに.qmail-defaultが参照される。この例では、tsushin.tvドメイン宛のメールはすべてユーザtomのメールフォルダに配送される。

■ 参考

qmail の導入・設定メモ (FreeBSD) [fkimura.com]
qmailのセットアップ作業・関連情報がよくまとまっている。

qmail + qmail-vida で SMTP-AUTH
いくつかのqmailのパッチを丁寧に解説している。

FreeBSDなせいかつ
qmailをソースから入れるか、portsを利用するか悩み、当記事と同じくportsを使った場合をその観点で解説している。

qmail-smtpd-auth
qmail-smtpd-authの開発・配布元。

@IT:qmailをより使いこなすTips(便利な小技編)(1/2)
SMTP-AUTHの使い方が載っている記事。

asahi-net: 設定ガイド:主なメールソフトの対応状況
メーラのSSL/TSL対応状況が良くまとまっている。

PostfixでTLS
CRAM-MD5の問題点と、SSL/TLSの優位点について触れている。当記事でも、これに納得して、CRAM-MD5を使わずにTLSでセキュリティを保つ方法を採用している。

qmailで IPv6 + TLS + SMTP-AUTH + POP3S + IMAPS
当記事の構成にとても近い事例。

The tcpserver program
qmail-smtpdを起動に用いたtcpserverの1次情報元。

Qmail smtp authentication & VirusScan
qmail-smtpdの起動設定の注意事項。

/var/qmail/doc/FAQ
基本的な質問事項