安全なメール環境の構築

以下のテキストは、執筆時当時の情報を元に書いたものであり、 現在の情勢にそぐわないことを含む場合があるので注意されたい。 また、テキストは最終提出原稿で校正を経る前のものなので、実際にUNIXUSER 本誌に記載されたものとは異なる。誤字脱字等そのままである。

致命的な誤り以外は加筆修正等は行なわないので情報の鮮度に気をつけつつ 利用して欲しい。

目次

註1: 本記事は当初Part4として執筆したが前後の記事のバランスを 考えてPart3として掲載された。

註2: 記事では tcp wrappers を利用するように書いているが、 今となっては tcpserver(ucspi-tcp) の利用を断然お勧めする。


PartIV 安全なメイル環境の構築

電子メイルはいまや最も基本的なインターネットを利用したインフラであるとい
えよう。基本的であるがゆえに新しく導入されたサーバに最初に入れることを要
求される初級管理者も多いのではなかろうか。ここではqmailを利用したメイル
サービス環境を構築する手順を説明する。

ここでの解説は一般的なシステム環境でのインストールを前提にしているが、
PartIIIで解説したJail環境内にメイルシステムを構築するのも効果的だろう。
PartIIIで作成したjail環境はユーザレベルで見ればおおむね本体システムの環
境と変わらないものであるため、以後の説明での作業をjail環境内で行なったと
してもさほど変わらないはずである。


■メイルサーバの導入

	メイルサーバを構築するときにセキュリティ上気をつけるべき点は何だ
	ろうか。ひとつはサービスデーモンプログラムのセキュリティホールに
	よる侵入に警戒するという点。そしてもう一つはアカウントを所有して
	いない外部の不心得者にSMTPサーバを勝手に利用させないよう注意する
	という点である。

	前者に関しては現在最も安全だとの評判が高いqmailを利用することを、
	後者に関しては外部ネットワークからのSMTPサーバ利用に "POP before
	SMTP" 手法を用いることを今回の方針とする。

  ●qmailの特長

	D. J. Bernstein 氏によるqmailは信頼性の高さと高速な配送性能が特
	長である。現在最も良く利用されているMTAである sendmail はインター
	ネットの大普及のはるか以前からインターネット以外のネットワークと
	のメイルのやりとりをも実現するサービスプログラムとして長く活躍し
	て来た。しかしその分プログラムは大きく、複雑化し、それを制御する
	設定ファイル sendmail.cf (を生成するCFなどの定義ファイル) も設定
	すべき項目が非常に多く、それを初めて目にする管理者を悩ませている。

	qmailはsendmailが担っていた過去のサービスや習慣を全く捨てた、現
	代のインターネットを利用する電子メイルに即した新しいデザインとなっ
	ている。それゆえsendmailでの運用に慣れている管理者が最初にqmail
	の設定を試みるときには、sendmailでの設定に対応するものが見当たら
	なくて面食らうかもしれない(※ほ)。むしろ、sendmailの知識が少ない
	管理者の方がすんなりqmailの管理に馴染めるのではないだろうか。

--- 註[ほ] ---------------------------------------------------------------
  筆者もその口であった。
--------------------------------------------------------------------------

	また、安全性と高速性という謡い文句に隠れてあまり着目されないのだ
	が、qmailが一般利用者に与える利便性の高さは、乗り換えの苦労を補っ
	て余りあるものである。代表的なものとして一般利用者が個人で持つこ
	とのできるメイルアドレスの数に制限が無くなるというものがあり、こ
	れをうまく利用すると「個人メイル用」、「管理者メイル用」、「仕事
	のML受信用」、「趣味のML受信用」など複数の立場で別々にメイルを受
	けることや、簡単な連絡用メイルリストなどを手軽に作成することが可
	能になる。

  ●qmail導入の流れ

	新規にメイルサーバを構築する場合の作業の流れは以下のようになる。

		1. メイルドメインのDNS登録
		2. qmailのインストール
		3. アクセス制限

	qmail自体のインストールは簡単なので、2.まではあっさりとできてし
	まう。しかし、初期状態では外部からのメイルサーバ不正利用も可能な
	状態になりかねない。いくらqmailの安全性が高くても、管理者がしっ
	かりとアクセス制限を施さなければUBE(Unsolicited Bulk E-mail:いわ
	ゆるSPAMメイル)発信の温床となってしまうので、最後のステップまで
	一気に設定するよう気をつけて欲しい。

  ●メイルドメインのDNS登録

	新規にメイルドメインを起こすときに必須の作業として、メイルドメイ
	ンのDNS登録がある。これを正確に行なわないと、メイルが届かないば
	かりか外部のメイルサーバに無駄な負担をかけて迷惑をかけることにも
	つながるので慎重に行なって欲しい。

	すでにWWWサーバのDNS登録の手順で説明したのと同様にゾーンファイル
	を編集する。ここでは、新規にメイルを受けるホストを
	mail.hoge.co.jp であると仮定する。

	/--- リスト4 [hoge.zone] -------------------------------------------
	|$TTL	86400
	|@	IN	SOA	ns.hoge.co.jp. postmaster.hoge.co.jp. (
	|			2000101000	; Serial No
	|			10800		; Refresh = 3 hours
	|			3600		; Retry   = 1 hour
	|			3600000		; Expire  = 1000 hours
	|			86400		; Minimum = 1 day
	|			)
	|	IN	NS	ns.hoge.co.jp.
	|	IN	NS	ns2.hoge.co.jp.
	|	IN	MX	0  mail.hoge.co.jp.	;プライマリサーバ
	|	IN	MX	10 mail2.hoge.co.jp.	;セカンダリサーバ
	|;メイルサーバ
	|mail	IN	A	192.168.0.2
	|	IN	MX	0 mail.hoge.co.jp.  ;自身のプライマリサーバ
	|	IN	MX	10 mail2.hoge.co.jp.;自身のセカンダリサーバ
	|mail2	IN	A	192.168.0.3
	|	IN	MX	0 mail2.hoge.co.jp. ;自身のプライマリサーバ
	|	IN	MX	10 mail.hoge.co.jp. ;自身のセカンダリサーバ
	\-------------------------------------------------------------------

	リスト4の設定では、@hoge.co.jp 宛のメイルを受け取るプライマリサー
	バとして mail.hoge.co.jp を、さらにそのサーバが不調のときに一旦
	メイルを受け取るセカンダリサーバとして mail2.hoge.co.jp を指定し
	ている。MXを受け持つホストの指定にあるピリオドも重要なので間違え
	ないようにする。また、mailサーバを将来移転する可能性を考えてMXレ
	コードにCNAME(別名)を書いてしまいがちだが、これは外部のMTAを混乱
	させる可能性がある(※へ)ので、MXを受け持つホスト名は、**必ずAレ
	コードを定義する** ように注意する。また、このとき 192.168.0.2 の
	逆引き登録は必ずしも mail.hoge.co.jp でなくとも良いが、逆引きの
	登録先が CNAME になっていてはいけない。ややこしいので例を挙げよ
	う。リスト5では、メイルサーバとなるIPアドレスの逆引き登録として 
	www.hoge.co.jp. が定義してある。いっぽうこのホスト名の順引
	きゾーンファイルをを見ると、そこにはCNAMEが定義されている。

	/--- リスト5 メイルサーバにふさわしくない設定例 --------------------
	| [hoge.zone (順引き設定ファイル)] の一部
	|	:
	| mail		IN	A	192.168.0.2
	| venus		IN	A	192.168.0.2
	| www		IN	CNAME	venus
	|	:
	|
	| [192.160.0.rev (逆引き設定ファイル)] の一部
	|	:
	| 2		IN	PTR	www.hoge.co.jp.
	| 		;; www.hoge.co.jp. はCNAMEなので×
	|	:
	\-------------------------------------------------------------------

	このような設定は、古典的なIPアドレス偽造のテクニックと同種とみな
	されて、TCP Wrappers などのアクセス制御ツールを利用しているサイ
	トへの接続が拒否されるので、そうならないようとくに慎重に設定を行
	なう。

--- 註[へ] ---------------------------------------------------------------
  古いMTAの組合せではプライマリサーバにトラブルがあったときにループを起
  こす可能性が、qmail同士の組合せでは VirtualDomain 宛のメイル配送がうま
  く行かなくなる可能性がある。
--------------------------------------------------------------------------

  ●qmail-1.03のインストール

	メイルサーバのDNS登録を確実に済ませたら(※と)qmailのインストール
	に移る。執筆時最新版は qmail-1.03.tar.gz でこれも付録CDROMに収録
	されているのでそちらを利用されたい。

--- 註[と] ---------------------------------------------------------------
  利用するホストのDNS登録が不十分だと自動初期設定がうまくいかない。
--------------------------------------------------------------------------

	パッケージを展開すると INSTALL.* にマッチするファイルにインストー
	ル手順の説明が書いてある。これを参考に作業を進めよう。作業は

		1. qmail動作に必要なUID/GIDの登録
		2. qmailのコンパイルとインストール

	という流れとなる。以後の説明は、サーバマシンに初めてqmailをイン
	ストールするという前提で進める。また、作業は、qmail-1.03パッケー
	ジを展開したディレクトリで行う。

	+-------------------------------------------------------------------
	| # tar vzxpf qmail-1.03.tar.gz
	| # cd qmail-1.03
	+-------------------------------------------------------------------

	(1)UID/GIDの登録

	    INSTALL.ids ファイルを参考に登録作業を行う。

	    +-------------------------------------------------------------
	    | # pw groupadd nofiles
	    | # pw useradd alias -g nofiles -d /var/qmail/alias -s /nonexistent
	    | # pw useradd qmaild -g nofiles -d /var/qmail -s /nonexistent
	    | # pw useradd qmaill -g nofiles -d /var/qmail -s /nonexistent
	    | # pw useradd qmailp -g nofiles -d /var/qmail -s /nonexistent
	    | # pw groupadd qmail
	    | # pw useradd qmailq -g qmail -d /var/qmail -s /nonexistent
	    | # pw useradd qmailr -g qmail -d /var/qmail -s /nonexistent
	    | # pw useradd qmails -g qmail -d /var/qmail -s /nonexistent
	    +-------------------------------------------------------------

	(2)qmailのコンパイルとインストール

	    まずqmailをインストールするディレクトリを作成する。

	    +-------------------------------------------------------------
	    | # mkdir /var/qmail
	    +-------------------------------------------------------------

	    続いてコンパイル、インストールを行う。

	    +-------------------------------------------------------------
	    | # make setup check
	    +-------------------------------------------------------------

	    そしてそのホストに固有の設定ファイルを作成してもらう。

	    +-------------------------------------------------------------
	    | # ./config
	    +-------------------------------------------------------------

	    ホストのDNS登録が完了していればconfigスクリプトにより必要最
	    低限の設定ファイルが自動作成される。もしうまく行かない場合は、
	    定義ファイルを全て手動で作成する必要があるがさほど難しくない。
	    基本的な定義ファイルの書き方に関しては後述する。

	    次に最低限のシステム全域のアドレスエイリアスを定義する。

	    +-------------------------------------------------------------
	    | # (cd ~alias
	    | >  touch .qmail-postmaster .qmail-mailer-daemon .qmail-root
	    | >  chmod 644 ~alias/.qmail*
	    | >  )
	    +-------------------------------------------------------------

	    この例では postmaster, MAILER-DAEMON, root というメイルアド
	    レスを有効化している。

	    ここまでエラーがなく進めば、qmailのインストールに必要な最低
	    限の設定は完了していると言って良い。実際に起動してみて正しく
	    配送されるかどうかを確認しよう。起動に必要なスクリプトを作成
	    する。

	    +-------------------------------------------------------------
	    | # cp /var/qmail/boot/home /var/qmail/rc
	    +-------------------------------------------------------------

	    qmailの配送デーモンを起動する前に、qmailを利用する場合の障害
	    とならないようsendmailを止めておくことが必要である。まず、本
	    体システムの /etc/rc.conf にsendmailの非起動を記述する。

	    /--- [/etc/rc.conf に追加] -------------------------------------
	    | sendmail_enable="NO"
	    \---------------------------------------------------------------

	    もし、sendmailが動いている場合はこれを止め、さらに sendmail
	    コマンドをqmail付属のwrapperに置き換える。

	    +-------------------------------------------------------------
	    | # killall sendmail
	    | # cd /usr/sbin
	    | # mv sendmail sendmail.bak
	    | # chmod 0 sendmail.bak
	    | # ln -s /var/qmail/bin/sendmmail sendmail
	    +-------------------------------------------------------------

	    /var/qmail/bin/sendmail はコマンド経由でメイルを送信するとき
	    に sendmail と同様のインタフェースで送れるようにするものであ
	    る。これは送信時の日付をGMTで記録するのだが、もしローカル時
	    刻(JST)で記録して欲しい場合は /var/qmail/bin/sendmail のかわ
	    りに /var/qmail/bin/datemail を /usr/sbin/sendmail の置き換
	    えとすると良い。

	    最後にSMTPサーバとして機能させるために /etc/inetd.conf に登
	    録しよう。FreeBSD 4.1.1R の場合は標準状態の inetd.conf に
	    qmail用の定義がコメントアウトされた形で入っているので通常は
	    このコメントを外して

	    /--- [/etc/inetd.conf の一行] ----------------------------------
	    | smtp   stream  tcp     nowait  qmaild  /var/qmail/bin/tcp-env  tcp-env /var/qmail/bin/qmail-smtpd 
	    \---------------------------------------------------------------

	    とする。あとで直ちに動作実験に入る場合はinetdにHUPシグナルを
	    送っておく。

	    +-------------------------------------------------------------
	    | # killall -HUP inetd
	    +-------------------------------------------------------------

	    ここでqmailを起動しよう。

	    +-------------------------------------------------------------
	    | # csh -cf '/var/qmail/rc &'
	    +-------------------------------------------------------------

  ●qmailの動作定義ファイル

	動作確認に入る前にqmailの動作定義ファイルの種類とそれらの意味を
	確認しておこう。基本的な利用に必要なのは、configスクリプトにより
	生成される defaultdomain, locals, me, plusdomain, rcpthosts 
	と、defaulthost ファイルだけである。

	* me ファイル

	  メイルサーバ自身のホスト名を書いておく。以下で説明する
	  defaultdomain, defaulthost, locals, plusdomain ファイルが存在
	  しないときのデフォルト値としても利用される。

	* locals ファイル (qmail-sendが参照)

	  このメイルサーバで「ローカル配送」として処理すべきドメインを一
	  行に一つずつ列挙する。受け取ったメイルの宛先のドメイン部(@記号
	  より後ろ)が、localsに書かれているものである場合、そのメイルは
	  qmail-local に渡されてローカルで処理されることになる。qmailの
	  動作中にこのファイルを更新したら qmail-send に HUP シグナルを
	  送る必要がある。

		
	* rcpthosts ファイル (qmail-smtpdが参照)

	  ネットワーク経由で来たメイルのうち、このメイルサーバで受理する
	  べきドメインを一行に一つずつ列挙する。rcpthostsファイルに書い
	  てないドメイン宛のメイルは不正リレーとみなして受け取りを拒否す
	  る。UBEの温床となる Open Relay サイトとならないために
	  重要な設定ファイルである。例外として、qmail-smtpdの起動時に環
	  境変数 RELAYCLIENT がセットされていた場合はrcpthostsファイルの
	  内容は無視され、全てのドメイン宛のメイルを受理するようになる。
	  これを利用して POP before SMTP などを実現する。方法については
	  後述する。

	  ドメイン名をピリオド(.)で始めるとそのドメイン配下のアドレスは
	  全て受理するものみなす。たとえば、@hoge.co.jp 宛のメイルも 
	  @XXX.hoge.co.jp (XXXは任意) 宛のメイルも全て受理したい場合は

		+--------------------------------------------------------
		| hoge.co.jp
		| .hoge.co.jp
		+--------------------------------------------------------

	  と書く。ローカル配送すべきメイルは全て受理するわけであるから、
	  すくなくとも locals ファイルに書いてあるものはすべて rcpthosts 
	  ファイルにも書くのが普通である。通常はこれに加えてセカンダリメ
	  イルサーバを受け持つドメインや、virtualdomain なども書き加える
	  ことになる。

	* defaultdomain ファイル (qmail-injectが参照)

	  このホストからメイルを送信するときに(※ち)、宛先もしくは送信者
	  のドメイン部にドット(.)が無いときに自動的に後ろに付加するドメ
	  イン名。たとえば、defaultdomain ファイルの内容が hoge.co.jp の
	  場合 foo@venus というメイルアドレスは自動的に 
	  foo@venus.hoge.co.jp に置換される。

	* defaulthost ファイル (qmail-injectが参照)

	  このホストからメイルを送信するときに、宛先もしくは送信者のドメ
	  イン部が省略されているときに自動的に後ろに付加するドメイン名。
	  たとえば、defaulthost ファイルの内容が hoge.co.jp の場合 foo 
	  というアドレスは自動的に foo@hoge.co.jp に置換される。外部ドメ
	  インにメイルを出すときにホスト名を隠蔽したい場合は defaulthost 
	  ファイルにドメイン名だけを書いておく必要がある。

	* plusdomain ファイル (qmail-injectが参照)

	  宛先のドメイン部が + で終っているときに追加するドメイン名。
	  plusdomain に ac.jp と書いてある場合、foo@hoge+ というアドレス
	  は foo@hoge.ac.jp に置換される。このような使い方を使用しない場
	  合 plusdomain ファイルは不要である。

--- 註[ち] ---------------------------------------------------------------
  qmail-injectコマンドによりメイルを送信するとき。多くの場合 sendmailコ
  マンドやMailコマンドを利用してメイルを送信するときにあたる。
--------------------------------------------------------------------------

	以上の解説を見ながら ./config コマンドによって自動的に生成された
	ファイルの内容を吟味し、問題がなさそうなら導入後試験に移ろう。

	以後の説明では、各動作定義ファイルの内容がリスト6のようになって
	いる場合を仮定する。

	/--- リスト6 /var/qmail/control/* ファイルの内容 -------------------
	| [me]
	|    mail.hoge.co.jp
	| [locals]
	|    localhost
	|    localhost.hoge.co.jp
	|    hoge.co.jp
	|    .hoge.co.jp
	| [rcpthosts]
	|    prison.hoge.co.jp
	|    hoge.co.jp
	|    .hoge.co.jp
	| [defaulthost]
	|    hoge.co.jp
	| [defaultdomain]
	|    hoge.co.jp
	| [plusdomain]
	|    co.jp
	\-------------------------------------------------------------------


  ●qmailの動作試験

	FreeBSD上に標準インストールした場合、qmailは配送関係のログを
	/var/log/maillog に吐き出す。動作試験時にはこれを別端末に表示し
	ておくと良いだろう。

	+-------------------------------------------------------------------
	| # tail -f /var/log/maillog
	+-------------------------------------------------------------------

	/var/qmail/rc スクリプトの起動によりqmailが正常に待機している場
	合はログファイルに以下のようなメッセージがあるはずである。

		qmail: status: local 0/10 remote 0/20

	"cannot start" などのエラーメッセージが出ている場合はインストー
	ルに失敗している可能性がある。手順を良く確認してやり直そう。うま
	く行った場合は、配送試験に入る。まずはローカル配送から。

	+-------------------------------------------------------------------
	| prison# echo to: root@hoge.co.jp | /var/qmail/bin/qmail-inject
	|         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	+-------------------------------------------------------------------

	maillogに以下のようなメッセージが書き込まれたら配送が行なわれて
	いる。
	
	+-------------------------------------------------------------------
	| starting delivery 1: msg 88607 to local root@hoge.co.jp
	+-------------------------------------------------------------------

	デフォルトでは、このメイルは ~alias (/var/qmail/alias) ディレク
	トリにある Mailbox というmbox形式ファイルに書き込まれているはず
	である。


  ●リレー許可ホストの設定

	通常 rcpthosts には、メイルサーバが受理すべき宛先ドメインのみを
	列挙する。この場合外部のドメイン宛のメイルは一切受理しないことに
	なるので、LAN内のPCなどからSMTPサーバとして利用することができな
	いことになり不便である。部署内LANに属するホストからは、任意のア
	ドレス宛に送信できるように設定しよう。qmailの場合はこれを
	qmail-smtpd 起動時の環境変数で調整する。qmail-smtpdの起動は、
	inetd経由、もしくはtcpserver(※り)経由で行なうのが一般的である。
	前者の場合は TCP Wrappers を組み合わせて利用することで接続要求を
	して来たホストに応じて qmail-smtpd に任意の環境変数を渡すことが
	可能である。幸いにも FreeBSD はバージョン3.2R以降において、inetd
	自身に TCP Wrappers のライブラリが組み込まれているので新たなパッ
	ケージをインストールすることなくリレー許可ホストの設定ができる。

--- 註[り] ---------------------------------------------------------------
  http://cr.yp.to/ucspi-tcp.html
--------------------------------------------------------------------------

	TCP Wrappers では、/etc/hosts.allow ファイルに接続要求ホスト名か
	IPアドレス(またはそのパターン)を書き、それに対応するサービスデー
	モンプログラムの起動方法を決定できる。例えば今回の場合、

	* hoge.co.jp ドメイン配下の全てのホストからのSMTP接続
	  → 任意の宛先へのリレー許可

	* 上記以外のホストからのSMTP接続
	  → rcpthosts に列挙してある宛先ドメインのみ受理

	という切替えをしたいので、/etc/hosts.allow には以下のように記述
	する。

	/---[ /etc/hosts.allow の一部 ] ------------------------------------
	| tcp-env : localhost 192.168.0. .hoge.co.jp : setenv = RELAYCLIENT
	| tcp-env : ALL : ALLOW
	\-------------------------------------------------------------------

	hosts.allow ファイルは

	    プログラム : 接続要求パターン : オプション [ : オプション... ]

	という書式で記述する。これを踏まえて tcp-env に関する設定の一行
	目を読むと、接続要求をして来たホストが

		localhost  192.168.0.  .hoge.co.jp

	のいずれかである時のオプションとして

		setenv = RELAYCLIENT

	を施すという意味である。もちろん、"192.168.0." が hoge.co.jp ド
	メイン全ての部署ないLANマシンを指し示すのであれば、".hoge.co.jp"
	は不要であるし、逆もまた然りである。

	接続要求ホストとのマッチングはホスト名ベース、またはIPアドレスベー
	スでパターンを記述できる。前者の場合はホスト名をそのまま書くか、
	先頭がピリオドのドメイン名を書くことでそのドメインに属す全てのホ
	ストというワイルドカード指定ができる。IP アドレスベースで書く場
	合は、完全なIPアドレスを書くこともできるし、末尾をピリオドにする
	ことで残りのオクテットが何番でもマッチするワイルドカード指定も書
	ける。また、192.168.0.0/255.255.255.0 のような netmask 指定を書
	くこともできる。なお、DNS偽造ホストは接続拒否されるので安心して
	ホスト名ベースでの記述を利用して良い。

	hosts.allow ファイルの場合オプションに明示的に "DENY" を指定しな
	い場合のデフォルトの動作は接続許可となる。よって、二行目は
	ALLOW(接続許可を表すオプション)を省略しても同じである。オプショ
	ン "setenv" は指定した環境変数をセットした状態でデーモンプログラ
	ムを起動する。つまり、一行目の例は

	  localhost, 192.168.0.*, *.hoge.co.jp のいずれかにマッチするホ
	  ストからの接続要求があったときに、環境変数 RELAYCLIENT をセッ
	  トした状態で tcp-env を起動する

	ということを意味する。つまり、上記のパターンにマッチするホストが
	部署内LANのものであると仮定すると、それらホストからのSMTP接続で
	あった場合にはLAN内外問わず任意の宛先に送信できるということであ
	る。それ以外のホストからは、該当メイルサーバを利用したリレー送信
	はできないということである。

	hosts.allow ファイルにはここで紹介した以外にさまざまな動作を定義
	できる。より詳しい書き方については、hosts_access(5),
	hosts_options(5) のマニュアルを参照するか、本誌1999年12月号を参
	照して欲しい。


  ●qmailのアドレス管理(エイリアス)

	qmailでは、xxx@hoge.co.jp という宛先にメッセージが来た場合、ロー
	カルに xxx というユーザが存在する場合はそのユーザに送られる。存
	在しない場合はシステムのエイリアスが参照される。これはqmailイン
	ストール時に作成した ユーザ alias のホームディレクトリにある
	.qmail-xxx というファイルによって配送先が定義される。たとえば、
	(fooというユーザがいないときに)foo@hoge.co.jp という宛先のメイル
	を受け取りたい場合は ~alias/.qmail-foo というファイルに配送先を
	記述すれば良い。このファイルの書式は次節で解説する。

	また、qmailでは一般ユーザも任意個のエイリアスを作成することがで
	きる。ユーザ名を "someone" とすると、"someone-" で始まる任意の英
	数字名を自分宛のメイルアドレスとして作成することができる。もし、
	someone-yyy@hoge.co.jp というメイルアドレスを受信できるようにし
	たいときは自分のホームディレクトリに .qmail-yyy というファイルを
	作成し、そこに配送先を記述すれば良い。

	また、.qmail-default というファイルを作ると 
	someone-zzz@hoge.co.jp の zzz の部分がどんな文字列でも受け取るア
	ドレスを定義できる。

  ●dot-qmailファイルの書式

	上述のルールにしたがって作成された .qmail- で始まるファイルのこ
	とを dot-qmail と呼ぶ。dot-qmail にはそのアドレス宛に来たメイル
	の実際の配送先を記述する。配送先を大別すると3種類のものがある。

	1. ユーザのメイルボックス

	   メッセージがテキストファイルとして保存される一般的な最終形式
	   である。メイルボックスの形式はさらにsendmailのメイルボックス
	   と同じ mbox 形式(※ぬ) と、より安全な Maildir 形式がある。
	   前者を利用する場合 dot-qmail ファイルに

		./Mbox

	   と書けばホームディレクトリの Mbox というファイルに全てのメッ
	   セージが結合された状態で格納される。後者を利用する場合は
	   dot-qmail ファイルに

	        ./Maildir/

	   とピリオド(カレントディレクトリ)ではじまり末尾が / で終わるディ
	   レクトリ名を書けばその宛先に届いた各メッセージが ~/Maildir/ 
	   というディレクトリにMaildir形式で保存される。Maildir形式はた
	   とえメイルボックスへのメッセージの書き込み中にシステムクラッ
	   シュが起きたとしてもメイルボックスが崩壊しないように設計され
	   たきわめて信頼性の高い形式である。もし旧来の mbox 形式に特別
	   の愛着があるのでなければ、メイルボックスとしては Maildir 形式
	   を利用することを強く勧める。また、本記事の後半で紹介するPOPサー
	   バは拡張機能を使う場合 Maildir 形式にしか対応していないことも
	   あるので、以後の説明では Maildir 形式で利用することを前提とす
	   る。

	   Maildirは使い始めるときに maildirmake コマンドを利用して作成
	   する必要がある。一般ユーザでログインして

	   +-------------------------------------------------------------------
	   | % /var/qmail/bin/maildirmake ~/maildir-admin
	   +-------------------------------------------------------------------

	   とすると、新しい Maildir である ~/maildir-admin を作成できる。
	   これを someone-admin というアドレスで受け取りたい場合はホーム
	   ディレクトリに .qmail-admin ファイルを作成し
	
	   /---[ ~/.qmail-admin ] ---------------------------------------------
	   | ./maildir-admin/
	   \-------------------------------------------------------------------

	   と書けば良い。maildir-admin と .qmail-admin の -admin は揃え
	   る必要はない。実際に配送されるか確かめる場合は、

	   +-------------------------------------------------------------------
	   | # echo to: someone-admin@hoge.co.jp | /var/qmail/bin/qmail-inject
	   +-------------------------------------------------------------------

	   などとしてみて、~someone/maildir-admin/new/ ディレクトリの下
	   に新しくメッセージの入ったファイルができているか確認する。

	   +-------------------------------------------------------------------
	   | # ls -lF ~someone/maildir-admin/new
	   | total 3
	   | drwx------ 2 someone 512 Oct 14 13:19 ./
	   | drwx------ 5 someone 512 Dec  6  1999 ../
	   | -rw------- 1 someone 327 Oct 14 13:19 971497455.268.prison.hoge.co.jp
	   +-------------------------------------------------------------------

--- 註[ぬ] ---------------------------------------------------------------
  全てのメッセージを単一ファイルに含める形式
--------------------------------------------------------------------------

	2. プログラム起動

	   配送先記述の二つ目の形式は、プログラム起動である。dot-qmail 
	   ファイルの行の先頭を |(縦棒) で始める形で、

		| /somewhere/somecommand

	   のように記述すると、メッセージを標準入力として与える形で 
	   somecommand を起動する。もし、someone-bsdml という宛先のもの
	   を自分の ~/Mail/bsdml フォルダに全て格納したい場合はホームディ
	   レクトリに .qmail-bsdml というファイルを作成し、

	   /---[ ~/.qmail-bsdml ] ---------------------------------------------
	   | | /usr/local/bin/imstore -d +bsdml
	   \-------------------------------------------------------------------

	   のように書けば良い(※る)。| は行頭に書き、コマンドラインはクォー
	   トせずに手動でコマンド起動するときと全く同じ文字列を書くこと
	   に注意する。コマンドを起動するきっかけとなったメッセージの差
	   出人・宛先のメイルアドレスなどが環境変数にセットされる。これ
	   らについては qmail-command(8) 参照。

--- 註[る] ---------------------------------------------------------------
  imstore は IM に含まれるコマンドで、標準入力をフォルダに格納してくれる
  機能を持つ。http://www.mew.org/
--------------------------------------------------------------------------

	3. 他アドレスへの転送
	
	   行の先頭を & で始めると別アドレスへの転送となる。たとえば、
	   someone-job 宛に届いたメイルを someone@shigotoba.co.jp に転送
	   して欲しいときは ~/.qmail-job ファイルを作成し、

	   /---[ ~/.qmail-job ] -----------------------------------------------
	   | &someone@shigotoba.co.jp
	   \-------------------------------------------------------------------

	   と記述する。もちろん転送先は外部のアドレスだけでなく、ローカ
	   ルアドレスでも構わない。

	dot-qmail ファイルには、以上3つの形式を一行に一つ、何個でも書く
	ことができる。dot-qmailの書き方の、より詳しい情報に関しては
	dot-qmail(5) を見ると良い。

  ●Virtualdomainを立てる

	qmailでは標準のメイルアドレス空間(ローカルユーザと ~alias ディレ
	クトリ)とは独立した空間を virtualdomain としていくつでも持つこと
	ができる。これを利用すると、あるドメイン宛のメイルを全て特定のユー
	ザに向けることができる。例として、yamada.hoge.co.jp というメイル
	専用のドメインを作成し、@yamada.hoge.co.jp 宛に来たメイルを全て
	ローカルユーザの yamada さんに向ける設定を紹介しよう。まず、
	/var/qmail/control/virtualdomains ファイルを作成し以下のように記
	述する。

	/---[ /var/qmail/control/virtualdomains ]---------------------------
	| yamada.hoge.co.jp:yamada
	\-------------------------------------------------------------------

	virtualdomains を書き換えたら qmail-send に HUP シグナルを送る。

	+-------------------------------------------------------------------
	| # killall -HUP qmail-send
	+-------------------------------------------------------------------

	さらに、SMTP経由で届いた @yamada.hoge.co.jp 宛のメイルを受理する
	ように /var/qmail/control/rcpthosts ファイルに yamada.hoge.co.jp
	を追加する。ただし、今回の例の場合はすでに .hoge.co.jp が
	rcpthosts ファイルに存在しているので敢えて yamada.hoge.co.jp を
	書かなくともメイルを受理する状態になっている。

	qmail側の設定が終わったら、yamada.hoge.co.jp というメイルドメイ
	ンをDNS登録する。DNSゾーンファイルに

	/---- [hoge.zone] --------------------------------------------------
	| yamada	IN	MX	0 mail1.hoge.co.jp.
	|		IN	MX	10 mail2.hoge.co.jp.
	\-------------------------------------------------------------------

	というエントリを追加し、シリアル番号を上げて ndc reload する。

	さて、上記の virtualdomains 定義により qmail は

		xxx@yamada.hoge.co.jp  →  yamada-xxx@yamada.hoge.co.jp

	というアドレス書き換えを行なった上でローカルの yamada-xxx 宛に配
	送する。これを利用すると、見栄えの良いメイルアドレスを何個でも作
	れるという個人的利点が得られるほか、メイリングリスト用の
	virtualdomainを作成することで、全ての作業を非管理者権限でMLを運
	営でき、なおかつ他のアカウント名とのバッティングを気にせず自由に
	ML名を決定できる、などという利用者全体の利点も得られる。

	virtualdomains ファイルではドメイン名部分にワイルドカードなども
	指定できる。それらの方法については qmail-send(8)参照のこと。

 +---[コラム]--------------------------------------------------------------
  = qmail と procmail =

  procmailは個人に来たメイルを、差出人、宛先名、サブジェクト、などのパター
  ンに基づいて格納先を変更する、いわば自動振り分けのためのツールである。
  sendmailからqmailに乗り換えてしばらくすると出て来る質問に「qmailでは
  procmailは使えないか?」というものがある。もちろん答はYESで、qmailパッ
  ケージのFAQファイルに答が書いてある。

  しかし、そもそもprocmailのようなツールがなぜ必要なのだろう? それは
  sendmailでは原則として一般ユーザは一つしかアドレスを持てないので、あら
  ゆる種類のメイルを混ぜこぜに受け取らざるを得ないからである。qmailや
  postfixでは個人のメイルアドレスをいくらでも作れるので、自分の持ってい
  る職務毎に違うアドレスを作ることが可能である。メイルの発信源となるリス
  トに自分の基本アドレスを登録するのではなく、職務に応じたアドレスを登録
  することで100%確実に的確なフォルダに配送される。

  既に procmail のレシピ書きの達人になってしまった場合はprocmailを使い続
  けるのが最も負担が少ないであろうが、そうでない場合は登録アドレスを使い
  分ける工夫をしたほうが、より確実な振り分け処理を簡単に実現できるのであ
  る。
 +-------------------------------------------------------------------------


  ●セカンダリサーバを立てる

	プライマリのメイルサーバの構築に成功したら、セカンダリサーバを立
	てよう。プライマリのサーバが落ちているときに代理で一時的にメッセー
	ジをため込んでくれるサーバである。これがないと、プライマリサーバ
	のシステムダウン時に発信されたメッセージは、送信者側のSMTPサーバ
	に残り負担を与えることになったり、場合によってはエラー配送となる
	可能性もあるので信頼の置けるメイルサーバを作る場合はセカンダリサー
	バの設置も怠らないようにする。

	セカンダリサーバはネットワークと電源経路の異なる場所に設置するの
	が望ましいが、それが難しい場合は手の届く範囲にあるマシンで構わな
	いだろう。サーバの構築自体はとくに難しいことはない。

	* qmailをインストールする
	* /var/qmail/control/rcpthosts にプライマリサーバの rcpthosts
	  の内容を追加する
	* セカンダリサーバをDNSに登録する

	リスト4で例示したDNSゾーンファイルで hoge.co.jp のセカンダリメイ
	ルサーバとして mail2.hoge.co.jp を定義してある。このホストでは
	/var/qmail/control/rcpthosts に

		hoge.co.jp
		.hoge.co.jp

	を書いておけばセカンダリサーバとして機能する。なお、mail2 の
	locals ファイルに hoge.co.jp, .hoge.co.jp を書くとローカル配送し
	てしまうので注意する(その方が好ましい場合もある)。なお、いくつも
	のサイトのセカンダリサーバを引き受けるなどして rcpthosts ファイ
	ルが大きくなって来た場合(目安として50程度)は、morercpthosts ファ
	イルを併用するようにした方が効率が良い。morercpthosts の使い方に
	関しては qmail-smtpd(8), qmail-newmrh(8) を参照。

  ●配送キューの監視

	現在配送が完了せずキューに溜っているメッセージは qmail-qread コ
	マンドで確認できる。

	+-------------------------------------------------------------------
	| # /var/qmail/bin/qmail-qread | grep -v done
	+-------------------------------------------------------------------

	とすると、現在のキューの様子が分かりやすい。キューに入っているメッ
	セージの強制的再配送を指示するには動作中の qmail-send に ALRM シ
	グナルを送る。

	+-------------------------------------------------------------------
	| # killall -ALRM qmail-send
	+-------------------------------------------------------------------

  ●迷惑メイルの排除

	メイルサーバを設置すると間もなく国内外からローカルユーザ宛に迷惑
	メイルが届くようになる。これらは手を変え品を変え様々な抜け道を探
	して送りつけて来るので、それらが一切来なくなるようにまともに対処
	しているとそれだけで貴重な時間を費してしまい時間の無駄である。無
	視するのが一番だが、何も対策しないとさすがにうんざりするので、単
	純だが比較的効果の高い方法を紹介する。

    ・/var/qmail/control/badmailfrom

	受け取りを拒否したい差出人アドレスを一行に一つずつ列挙する。お決
	まりのアドレスからお決まりの迷惑メイルが続けて送られて来るときに
	は badmailfrom ファイルに登録しておくと次回から受け取らなくなる。
	単純だがかなり効果的である。rcpthostsファイルと同様のワイルド記
	述もできる。qmail-smtpd(8)参照。

    ・qmail-1.03 mfcheck パッチ

	本誌CDROMに収録した qmail-1.03-mfcheck.3.patch は、SMTP経由でき
	たメイルの差し出し人アドレス(エンベロープFROM)のドメイン部が正し
	くDNS登録されたものかどうかを調査し、存在しないドメインであった
	場合には受信を拒否するようにするものである。発信者のアドレスが届
	かないものであるならば、そのメイルは受け取る価値のないものと判断
	できるのでこのパッチはかなり効果的である。qmailをコンパイルした
	ディレクトリに移動し、

	+-------------------------------------------------------------------
	| # patch < qmail-1.03-mfcheck.3.patch
	| # make
	+-------------------------------------------------------------------

	とすると新しい qmail-smtpd ができる。これを /var/qmail/bin にコ
	ピーすれば良い。さらに、FROMアドレスチェックを有効にするために
	/var/qmail/control/mfcheck ファイルに "1" を記録しておく。

	+-------------------------------------------------------------------
	| # echo 1 > /var/qmail/control/mfcheck
	+-------------------------------------------------------------------

    ・その他のツール

	Open Relay となっているサイトをデータベース登録しているRBLなども
	qmailから利用できるし、その他のフィルタリングツールも各種存在す
	る。それらの情報は http://www.qmail.org/ から得られるようになっ
	ている。ただし、これらのツールも利用しすぎると本来届くはずのメイ
	ルが届かなくなるおそれもあるので、やりすぎないように気を付けたい。


■POP/IMAPサーバの導入

	メイルサーバを入れただけの状態では、サーバマシンにログインしない
	とメイルを読むことができない。一般的にはPOP3サーバまで用意しなけ
	れば自分のメイルを手元のPCに取り込むことができない。

	今回の主眼である「安全なサーバを作る」という観点からすると、POP3 
	というのは比較的頭の痛いサービスである。というのも、これまで一般
	的に利用されて来たPOP3サービスは

	* POP3接続用パスワードとしてUNIXパスワードを利用する。
	* POP3接続時のやりとりは平文なので、UNIXパスワードも平文のままネッ
	  トワークを流れる。
	* さらに最近のWindowsクライアントにはPOP3を利用したbiffの代用
	  アプリケーションがあり、数分に一度平文パスワードを何度もネット
	  ワークに流す。

	などの危険この上ない性質をはらんでいる。このような性質の残るPOP3 
	サービスを導入したのでは、せっかく高いセキュリティ性を誇るqmail
	をMTAとして選択した意味がなくなってしまう。

	そこで今回は上記の弱点を克服するために、

	* POP3接続用パスワードとしてUNIXパスワードと独立したものも利用で
          きる。
	* POP3接続は部署内LANなど、あらかじめ許可したネットワークからの
          アクセス時のみ許可する。
	* それ以外のネットワークからはAPOP(パスワード認証のやりとりを暗
          号化したプロトコル)だけを許可する

	という特長を備えたPOPサーバを導入しよう。なお、以下の説明では平
	文のままパスワードのやりとりをするPOP3のことを単にPOP3と表現し、
	POP3の認証部分を Challenge & Response でMD5符号化して行なう方式
	のことを単にAPOPと表現する。

  ●WU IMAP 4.7c2 + 拡張パック

	本誌付録CDROM中の imap-4.7c2qmav-20001016.tar.gz は、WU-IMAPD バー
	ジョン 4.7c2 に対し、先述の特長に加え以下の機能を追加(※る)した
	ものである。

	1. Maildir 対応
	2. ~/.qmail-* による拡張アドレス対応
	3. virtualdomainn アカウント対応
	4. POP before SMTP 機構

--- 註[る] ---------------------------------------------------------------
  これらのうち、2〜4は筆者が対応作業を行なった。2000人程度の規模のドメイ
  ンで運用している範囲ではとくに問題は発覚していないが、読者のサイトで完
  璧に動く保証はない。最近これらの拡張機能の揃ったPOPサーバはないかとの
  問い合わせが多いので本記事で取り扱うことにした。このパッケージ限った話
  ではないが、自己責任での利用を心がけて欲しい。本パッケージに関する最新
  情報は http://www.gentei.org/~yuuji/software/imapext/ にある。
--------------------------------------------------------------------------

	余談だが、元々利用しているサービスを、よりセキュリティの高いもの
	に置き換えようとする場合、その利点がセキュリティの向上ただ一点で
	はその置き換えを一般利用者に浸透させるのは難しいと筆者は常々考え
	ている。POPをAPOPに変えるだけで外部からのメイル取り込みがずいぶ
	んと安全になるのだが、メイルリーダの設定をAPOPに変えるという管理
	者にとってきわめて簡単なことでも、一般利用者にとってはとても面倒
	な作業である。「セキュリティ向上」は利用者にとっては目に見えない
	利点であり、それを達成するために余分な手間が発生するのなら、面倒
	なだけで何も(自分が)得るものがない、と感じられてしまいがちである。
	それでは移行作業に協力してもらうのは難しい。もし、既存のシステム
	(利用形態)を、より安全なものに変えて行きたいと考える場合は、「安
	全」という管理者側の利点だけでなく、「便利」という一般利用者側の
	利点も作り込むことが、(人間を含めた)システムのスムーズな移行につ
	ながる。

  ●POP/IMAP サーバ(WU IMAPD)のインストール

	WU IMAPD を利用したPOPサーバの導入作業は

	1. pop3/imap デーモンプログラムのコンパイルとインストール
	2. inetd.conf の設定
	3. hosts.allow と POP before SMTP の設定

	という手順になる。POP/IMAPサーバとして使うだけなら1, 2だけで完了
	だが、セキュリティを確保するためには3が必要になる。

    ・ipop3d/imapd のコンパイルとインストール

	WU IMAPD の POP3、IMAPのデーモンプログラム名はそれぞれ ipop3d,
	imapd となっている。まずは ipop3d と、必要なら imapd のインストー
	ルをしよう。

	imap-4.7c2qmav-20001016.tar.gz を展開しまずはREADMEという名前で
	始まるファイル群に目を通す。さらにMakefileをみると、利用している
	OSによってmakeに与えるターゲット名が決められていることが分かる。
	FreeBSD では bsf というターゲット名を与えてmakeする。

	+-------------------------------------------------------------------
	| # tar zxpf imap-4.7c2qmav-20001016.tar.gz
	| # cd imap-4.7c2qmailapopbeforesmtpvd
	| # less README*
	| # less Makefile
	| # make bsf
	+-------------------------------------------------------------------

	コンパイルが終了すると ipopd/ipop3d と imapd/imapd ができている。
	以後の説明では、これらを /usr/local/etc にインストールするものと
	する。

	+-------------------------------------------------------------------
	| # install -cs ipopd/ipop3d /usr/local/etc
	| # install -cs imapd/imapd /usr/local/etc
	+-------------------------------------------------------------------

	両方をインストールする例を示したが、どちらかを利用する予定がない
	場合それはインストールしない(※を)。

--- 註[を] ---------------------------------------------------------------
  試しに入れてみて、結局使わなかったネットワークサービスが、甘い設定のま
  まシステムに常駐し、それが忘れたころにセキュリティホールになることが多
  い。
--------------------------------------------------------------------------

	最後に、本拡張パック固有のツールをインストールする。

	+-------------------------------------------------------------------
	| # cd APOPtools
	| # install -c -m 700 deapop /usr/local/sbin
	| # install -c -m 755 apoppasswd /usr/local/bin
	| # install -c -m 700 pop3-age /usr/local/etc
	| # ln -s pop3-age /usr/local/etc/pop3-update
	| # ln -s pop3-age /usr/local/etc/pop3-record
	+-------------------------------------------------------------------

	これらのコマンドのインストール場所を変えたい場合はパッケージ中の
	README.qmapop を読んでmakeしなおす必要がある。

    ・inetd.conf の設定

	ネットワークサービスとして起動させるため、/etc/inetd.conf に以下
	の記述を追加する。

	/--- [/etc/inetd.conf への追加分] ------------------------------
	| pop3	stream	tcp  nowait root  /usr/local/etc/ipop3d  ipop3d
	| imap	stream	tcp  nowait root  /usr/local/etc/imapd   imapd
	\---------------------------------------------------------------

	つづいて、root権限で killall -1 inetd して、inetd に inetd.conf
	を再評価させてから、実際に別のマシンから接続できるか確かめてみよ
	う。

	+-------------------------------------------------------------------
	| venus% telnet prison pop3
	| Trying 192.168.0.2...
	| Connected to prison.hoge.co.jp.
	| Escape character is '^]'.
	| +OK POP3 v7.64 server ready <418.39e7db88@prison.hoge.co.jp>
	+-------------------------------------------------------------------

	+OK で始まるメッセージが得られれば成功である。FreeBSDのインストー
	ル後に /etc/hosts.allow を自分で書き換えた場合は上記のようなメッ
	セージは出ないかもしれない(ipop3d接続を許可していないため)。その
	ような場合は、次の hosts.allow の設定を行なう。

    ・hosts.allow の設定

	今回紹介する WU IMAPD + 拡張パック では、POP接続要求をして来たホ
	ストのネットワークアドレスによってPOP3を許可するか、APOPのみ許可
	するかを選択できる。POP3を許可する場合はipop3d起動時に環境変数
	INTRANET がセットされていれば良い。部署内LANではPOP3を許可し、そ
	れ以外は許可せずにipop3dを起動する場合の hosts.allow エントリは
	以下のようになる。

	/--- [/etc/hosts.allow への追加分] ------------------------------
	| ipop3d : 127.0.0.1 192.168.0. : setenv INTRANET
	| ipop3d : ALL : ALLOW
	\---------------------------------------------------------------

	部署内からはPOP3が許可し、部署外からは POP3 を禁止しているか確認
	しよう。

	+-------------------------------------------------------------------
	| venus% telnet prison.hoge.co.jp pop3
	|        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	| Trying 192.168.0.2...
	| Connected to prison.hoge.co.jp.
	| Escape character is '^]'.
	| +OK POP3 v7.64 server ready <420.cd20db08@prison.hoge.co.jp>
	| user someone
	| ~~~~~~~~~~~~
	| +OK User name accepted, password please
	| quit
	| ~~~~
	| +OK Sayonara
	| Connection closed by foreign host.
	|
	| 部署外マシン% telnet prison.hoge.co.jp pop3
	|               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	| Trying 192.168.0.2...
	| Connected to prison.hoge.co.jp.
	| Escape character is '^]'.
	| +OK POP3 v7.64 server ready <519.385adb88@prison.hoge.co.jp>
	| user someone
	| ~~~~~~~~~~~~
	| -ERR Sorry, we don't allow POP3 from your network.  Use APOP instead.
	| quit
	| ~~~~
	| +OK Sayonara
	+-------------------------------------------------------------------

	部署内、部署外、どちらからやっても同じ場合は、システム標準の
	hosts.allow ファイルに

		ALL : ALL : ALLOW

	という行が存在し、そこで無条件に ipop3d を起動してしまっている可
	能性が高い。この行を削除するか、ipop3d の行をALLの行よりも先に持っ
	て来るようにする。

    ・一般ユーザのPOP利用の準備

	今回紹介する拡張パックでは Maildir の使用が前提となっている。自
	力で設定できる一般利用者には、先述した maildirmake コマンドで 
	Maildir をホームディレクトリに作った上で ~/.qmail にその Maildir 
	を書いてもらう。そうでない利用者には許可を得てから管理者権限で代
	理作成してあげれば良かろう。

	利用者が、自身で設定を行う場合は初期設定として

	* Maildir を作成し配送先を Maildir に指定する
	* メイル専用のパスワードを設定する

	という二つの作業が必要となる。

	+-------------------------------------------------------------------
	| % /var/qmail/bin/maildirmake ~/maildir
	|   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	| % echo ./maildir/ > .qmail
	|   ~~~~~~~~~~~~~~~~~~~~~~~~
	| % /usr/local/bin/apoppasswd
	|   ~~~~~~~~~~~~~~~~~~~~~~~~~
	| Enter APOP Password: (メイル専用パスワードを入力)
	| Again APOP Password: (同じパスワードを再度入力)
	+-------------------------------------------------------------------

	これでリモートマシンからのメイル取り込み準備完了である。これらの
	作業を管理者が代行する場合は作業例【わ】のようにすれば良い。いず
	れの場合も既にホームディレクトリに .qmail ファイルを作っていると
	きにこれを壊さないように配慮する必要がある。

	【作業例 わ】
	+-------------------------------------------------------------------
	| 【rootのシェルがsh系の場合】
	| # for u in user1 user2 user3 user4 ; do
	|   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	| ? echo '/var/qmail/bin/maildirmake ~/maildir
	|   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	| ? echo ./maildir/ > ~/.qmail
	|   ~~~~~~~~~~~~~~~~~~~~~~~~~~
	| ? jot -r -c 8 a z | rs -g 0 8 > ~/.apop
	|   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	| ? chmod 600 ~/.apop
	|   ~~~~~~~~~~~~~~~~~
	| ? ' | su $u
	|   ~~~~~~~~~
	| ? done
	|   ~~~~
	| 【rootのシェルがcsh系の場合】
	| prison# foreach u (user1 user2 user3 user4)
	|         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	| foreach? echo '/var/qmail/bin/maildirmake ~/maildir \
	|          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	| foreach? echo ./maildir/ > ~/.qmail \
	|          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	| foreach? jot -r -c 8 a z | rs -g 0 8 > ~/.apop \
	|          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	| foreach? chmod 600 ~/.apop \
	|          ~~~~~~~~~~~~~~~~~~~
	| foreach? ' | su $u
	|          ~~~~~~~~~
	| foreach? end
	|          ~~~
	+-------------------------------------------------------------------

	また、将来新規作成するユーザの初期ホームディレクトリに Maildir
	が置かれるよう /etc/skel に見本を作成しておくと良い。

	+-------------------------------------------------------------------
	| # /var/qmail/bin/maildirmake /etc/skel/maildir
	| # echo ./maildir/ > /etc/skel/maildir/.qmail
	+-------------------------------------------------------------------

	こうしておけば、新規ユーザを作成するときに

	+-------------------------------------------------------------------
	| # pw useradd NewUserName -m
	+-------------------------------------------------------------------

	とすれば、そのユーザの初期メイルボックスを Maildir 形式とするこ
	とができる。

    ・一般ユーザのPOP取り込み実験

	常用しているメイルリーダなどから取り込めるか実験しよう。まずは
	POP3の許可された部署内LANから。パスワードとして、メイル専用のも
	のを入力することに注意する。また、POP3に限りこれまでUNIXパスワー
	ドでの認証も行えるようになっている。APOPのみを許可しているネット
	ワークからは、メイルリーダのプロトコル設定をAPOPに変更した上で取
	り込みができるか実験してみよう。

    ・拡張アドレスと virtualdomain アドレスのPOP取り込み

	~/.qmail-xxx などで作成した拡張メイルアドレスも Maildir 形式への
	受信になっていればAPOPにて外部から取り込むことが可能になっている。
	既に ~/.qmail-xxx ファイルに格納用Maildirが記述してあるとすると、

	+-------------------------------------------------------------------
	| % /usr/local/bin/apoppasswd -e xxx
	+-------------------------------------------------------------------

	によって専用パスワードを設定することで someone-xxx@hoge.co.jp 宛
	に来たメイルをAPOPで受信することができる。virtualdomain で作成し
	たメイルアドレスの場合も専用パスワードを設定することでAPOPで取り
	込める。これらの詳細は付属の README.qmapop ファイルを参照してほ
	しい。

  ●POP before SMTP の設定

	+--- !! 注意 !! --------------------------------------------------
	| POP before SMTP はアクセス許可設定ファイル(hosts.allow)を動的
	| に更新するものなので、設定を誤ると全てのネットワークサービスが
	| 拒否される状態に陥る可能性がある。導入に当たっては、その仕組み
	| を良く理解し、hosts.allow ファイルをいつでも元に戻せる体制で作
	| 業を行うこと。
	+-----------------------------------------------------------------

    ・POP before SMTP とは

	前半で解説したqmailの設定では、SMTPサーバとして利用する場合、外
	部の任意の宛先に送信できるのは部署内LANに限られていた。しかし、
	出張先の公衆回線からメイルを送信したいときなど、オフィスのメイル
	サーバを利用したいことなどもある。このような場合、外部のホストか
	らSMTP サーバを利用する前に、一旦POPによるユーザ認証をさせること
	でそのホストのユーザがそのメイルサーバにアカウントを持っている人
	間であるとみなし、一定時間そのホストからのSMTP利用を全面的に開放
	するのが POP before SMTP という概念である。

    ・POP before SMTPの導入

	POP before SMTPを行うためには、POPサーバに「認証が通ったら一定時
	間SMTPサーバの起動方法を変える」という特別処理を組み込む必要があ
	る。qmail の場合は hosts.allow を一時的に書き換えることになる。
	今回インストールしたipop3dには APOP認証が成立すると
	/usr/local/etc/pop3-record というコマンドがあればこれを呼ぶ機能
	があるのでこれを利用して POP before SMTP を実現する。この流れを
	要約すると以下のようになる。

	1. ipop3d 起動時に接続要求ホストのアドレスを環境変数にいれる
	2. ipop3dのAPOP認証が通ると pop3-record が呼ばれ環境変数が渡る
	3. pop3-record でその環境変数の値(クライアントのアドレス)を
	   hosts.allow に反映させる
	4. 一定時間が経過したら hosts.allow を元に戻す

	この流れで分かるように hosts.allow ファイルが動的に書き換えられ
	るので、あらかじめその書き換え見本となるファイルを別個に作成して
	おく必要がある。パッケージの APOPtools ディレクトリにあるスクリ
	プトでは /etc/hosts.allow.src というファイルから動的に 
	/etc/hosts.allow を生成するようになっている。これを利用する場合
	の手順に関して説明する。

	まず、現状の hosts.allow を hosts.allow.src にコピーする。

	+-------------------------------------------------------------------
	| # cp /etc/hosts.allow /etc/hosts.allow.src
	+-------------------------------------------------------------------

	以後、手動で編集するのは hosts.allow.src ファイルとし、編集結果
	を hosts.allow に反映させるためには /usr/local/etc/pop3-update
	コマンドを利用する。

	続いて ipop3d 起動時に接続要求ホストのアドレスが渡るように工夫す
	る。hosts.allow.src ファイルの ipop3d に関する記述を以下のように
	書き換える。

	/--- [/etc/hosts.allow.src の修正分] ---------------------------
	|ipop3d: 127.0.0.1 192.168.0. : setenv INTRANET : setenv RELAYCLIENT %h
	|ipop3d: ALL : setenv RELAYCLIENT %h
	\---------------------------------------------------------------

	更新を hosts.allow に反映させる。

	+-------------------------------------------------------------------
	| # /usr/local/etc/pop3-update
	+-------------------------------------------------------------------

	これで、APOP認証が通過する度に /usr/local/etc/pop3-record が呼ば
	れ、/etc/hosts.allow にSMTPリレー許可の設定が書き加わることにな
	る。

	最後に、リレー許可情報が一定時間毎にクリアされるように
	/etc/crontab に pop3-age コマンドを登録する。

	/--- [/etc/crontab への追加分] ---------------------------------
	| */10	*	*	*	*   root /usr/local/etc/pop3-age
	\---------------------------------------------------------------

	この設定では、10分に一度 pop3-age が呼ばれる。ちなみに pop3-* の
	各コマンドはどれも同じスクリプトとなっている。これは排他制御など
	をしていないごく簡単なものなので、秒刻みでPOPリクエストが来るよ
	うな超大規模ドメインで利用する場合は排他制御も考慮して高速に処理
	できるコマンドを各自作成する必要があるだろう。

    ・動作確認

	外部ネットワークから一般ユーザとしてAPOP接続を行い、POPサーバ上
	の /etc/hosts.allow ファイルの先頭にクライアントホストのアドレス
	が書き込まれていれば成功である。その後約10分間は、任意の宛先にメ
	イルを送信できるようになる。


■OpenSSHを利用したSMTP/POPの遠隔利用

	APOPを利用することで外部ネットワークからのSMTP/POP利用が安全に行
	えるようになる。しかし、残念ながら全てのメイルリーダがAPOPをサポー
	トしているわけではない。そのようなメイルリーダを利用している場合、
	サーバとの間で Port Forwarding を利用することでセキュリティ的な
	問題を解決できる。

  ●UNIXクライアントからの Port Forwarding

	一般ユーザがローカルマシンのポートを利用する場合はUNIXでは1024番
	以降を利用しなければならない。ここでは、ローカルマシンの8025番を
	サーバホスト(mail.hoge.co.jp)のSMTPポートに、ローカルマシンの
	8110番をサーバホストのPOPポートにフォワードする例を示す。

	+-------------------------------------------------------------------
	| % ssh -L 8025:localhost:25 -L 8110:localhost:25 mail.hoge.co.jp
	+-------------------------------------------------------------------

  ●Windowsクライアントからの Port Forwarding

	Windows上のSSHクライアント TeraTermPRO+TTSSH(※か) を利用すると
	ローカルWindowsマシンのポートをサーバのネットワークポートにフォ
	ワードできる。Windowsでは利用者が任意のポートを利用できるのでロー
	カルPCの25番をサーバホストのSMTPポートに、110番をサーバホストの
	POPポートにフォワードしてしまうとメイルリーダの設定が簡単になる。

	TTSSHを利用してサーバマシンにSSHログインした上で [Setup] → [SSH
	Forwarding] によりポートフォワード設定画面を出し、[Add]ボタンを
	押す。ポート番号とホストを入力するウィンドウが現れるので、

		Forward local port 	[25]
		to remote machine 	[mail.hoge.co.jp]
		port			[25]

	のように入れて[OK]を押す。さらにもう一度[Add]ボタンを押し、

		Forward local port 	[110]
		to remote machine 	[mail.hoge.co.jp]
		port			[110]

	も追加する。この状態をセーブしておけば次回SSH接続時に自動的にポー
	トフォワードが張られる。セーブは[Setup] → [Save setup]にて行な
	うことができる。

	TTSSH側でのポートフォワードが開通している状態で、メイルリーダの
	SMTPサーバ、POPサーバのホスト名としてともに localhost を指定する
	ことで外部ネットワークからも安全にかつ制約なくサービスを利用する
	ことができるようになる。

--- 註[か] ---------------------------------------------------------------
  http://www.vector.co.jp/authors/VA002416/
  http://www.zip.com.au/~roca/ttssh.html
--------------------------------------------------------------------------


 +---[コラム]--------------------------------------------------------------
  = OpenSSH のデフォルト設定について =

  FreeBSD 4.1.1R でシステムに組み込まれたことがきっかけで OpenSSH を利用
  し始めた人も多いのではなかろうか。多くの人が利用していたであろう
  ssh-1.2.27 の sshd を起動するときのインストール後標準設定と OpenSSH の
  それにはいくつか差異がある。これらのうちデフォルト値の違いにより利用者
  に混乱を招きやすいオプションに関して説明する。FreeBSD 4.1.1R の sshd 
  の設定ファイルは/etc/ssh/sshd_config である。ここを見ながら以下の解説
  を読むと良い。

  * Protocol
   接続に利用するプロトコルのバージョンを指定する。デフォルトでは SSHv1,
   SSHv2 両方を受け付ける。SSHv1プロトコルのみのサーバとしたい場合は
   "Protocol 1" と書く。

  * PermitRootLogin
    ユーザroot のログインを許可するか。デフォルトはno。

  * X11Forwarding
    X11のフォワーディングを許可するか。デフォルトはyes。OpenSSH 2.1/2.2
    のポータブルパッケージではデフォルトがnoで、それと異なるので注意。

  * CheckMail
    ログイン時に /var/mail/USER にメイルが来ているかの確認表示をする。
    FreeBSD でのデフォルトはyes。MTAとしてqmailを入れる場合は意味がない
    ので no に変更する。

  また、OpenSSH で ssh-agent を利用する場合、標準状態では ssh-askpass コ
  マンドが入っていないため、GUI型のパスワード入力ができない。ssh-askpass
  は、Portsコレクションに入っているので、これを利用してインストールする
  と簡単である。portsをインストールしてある場合は
  /usr/ports/security/openssh-askpass ディレクトリで、make install とす
  れば良い。http://www.ntrnet.net/~jmknoble/software/x11-ssh-askpass/ も
  参照。
 +-------------------------------------------------------------------------

■まとめ

	メイルシステムの安全性を高めるにはPOPサービスまで含めた構成を考
	える必要があることを理解して頂けたのではないかと思う。今回紹介し
	たPOPサーバのほかにも、APOP+Maildir対応のものはいくつかあるので、
	探してみると良いだろう。

	いろいろなシステム管理に共通することだが、普段システムを良く利用
	することはトラブルの早期発見にもつながる。便利なメイルシステムを
	構築し、それを自身でも最大限に利用することが良きシステムの運営に
	役立つといえよう。是非安全で快適なシステムを構築して欲しい。


yuuji@example.org
Fingerprint16 = FF F9 FF CC E0 FE 5C F7 19 97 28 24 EC 5D 39 BA
HIROSE Yuuji - ASTROLOGY / BIKE / EPO / GUEST BOOK / YaTeX [Tweet]