以下のテキストは、執筆時当時の情報を元に書いたものであり、 現在の情勢にそぐわないことを含む場合があるので注意されたい。 また、テキストは最終提出原稿で校正を経る前のものなので、実際に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@