おうちではIMAPでメール

おうちでは端末を決めて何から何までやってんですけど、最近新しいノートPCを手に入れたので、今は先代の端末機と併用の状態。困るのは POP しか使えない ISP のボックスにあるメールを読む時。別の端末で読んじゃうとバラバラになっちゃうんですねー。もちろん会社や出先でメールを読んじゃう人なんかもそういった悩みがあるでしょう。

というわけで、おうちに IMAP 鯖をたてました。別にたいしたことではないんですが、Linux では始めて動かすんでとりあえずメモメモ、ということです。セキュリティ面の問題があるので、おうちでは無縁と思ってたんですが(仕事場ならいいんかい?)、今回のケースでは外部からは繋がないので、まあいいか、ということです。ただし、それでも攻撃方法があるので、気をつけるですよー!あとで書きます。

■ imapd のインストール ■

※Linux ではパッケージが用意されているかもしれません(ていうか最小インストールでない人は既に入ってるかも)。面倒だったり、自信が無ければそちらでどうぞ。毎度のことですが、私は Debian 以外ではパッケージというものは一切使わ(え)ないので、お許しを。

さて、IMAP 鯖として動作するものはいくつかあるでしょうが、ユーザー・関連ドキュメントが多いのは ワシントン大学で開発されている UW IMAPかな。カーネギーメロン大学の Cyrus プロジェクトにも Cyrus imapd というのがありますが、ちょっと難しそうです。でもそっちのほうがネタとしてはよかったかな?

さて、バイナリもあるようですが、いつものようにソースです。さて白状しますが、いままで FreeBSD にしか入れたことがないのです。Linux で動くんかな?心配になってきました。ま、ソースだから気楽です。どうにでもなります。ソースはIMAP server source distributionからもって来れます。インストール詳細についてはUW IMAP Server Documentationも読んでね、せめて読むフリ。

ではどっかで展開しましょう。まあ /usr/local/src でいいんではないでしょうか。

$ zcat imap.tar.Z | tar xvf -
現時点では imap-2001a というディレクトリが出来ますが、おそらく名前は変わってしまうので、適当に読み替えてください。さて、ドキュメントを読むと分かるように、構築は通常のスタイルではありません。Makefile は既に出来ています。make 引数でコンフィギュレーションを兼ねるスタイルです。Makefile を見てみましょう。
$ cd imap-2001a
$ less Makefile

〜ここまで省略

# The following ports are bundled:
以下にある引数を指定するのです。Linux 関連はいくつかありますなー。

# lnx	Linux with traditional passwords and crypt() in the C library
#	 (see lnp, sl4, sl5, and slx)
# lnp	Linux with Pluggable Authentication Modules (PAM)
# lrh	RedHat Linux 7.2
# sl4	Linux using -lshadow to get the crypt() function
# sl5	Linux with shadow passwords, no extra libraries
# slx	Linux using -lcrypt to get the crypt() function
最新の赤帽は特別扱いですか、わかりますが腹立ちますな。まあいいか。
よくわからなければ赤帽なヒトは別として、slx, lnp あたりを試してみたらいいでしょう。あと、必要なら Makefile を修正。説明ではデフォルトで行きましょう。お?ところで、
# cyg	Cygwin
なんてのもあるのか。あとで試そう。じゃコンパイル。
$ make slx
完了すると imapd/imapd が出来ます(他にもいろいろ出来ます)。さて、インストールも make install ではありません。ドキュメントにこう書いてあります。
      The ipop2d, ipop3d, and imapd daemons should be installed in a system
 daemon directory (in the following examples, /usr/local/etc is used), and
 invoked by your /etc/inetd.conf file with lines such as:
 
 pop	stream	tcp	nowait	root	/usr/local/etc/ipop2d	ipop2d
 pop3	stream	tcp	nowait	root	/usr/local/etc/ipop3d	ipop3d
 imap	stream	tcp	nowait	root	/usr/local/etc/imapd	imapd
つまり生成物は手でコピーせよ、と。でもワタクシ的には /usr/local/etc は好きじゃないなあ。FreeBSD なら libexec というのがあるんだけど。ま、どこでもいいのです。 /usr/local/bin あたりでどうですか。あと、まあ一応 ipop3d, ipop2dもやっときますか。
# cp imapd/imapd /usr/local/bin
# cp ipopd/ipop3d /usr/local/bin
# cp ipopd/ipop2d /usr/local/bin
で、/etc/inetd.conf に書けと。はいはい。
pop	stream	tcp	nowait	root	/usr/local/bin/ipop2d	ipop2d
pop3	stream	tcp	nowait	root	/usr/local/bin/ipop3d	ipop3d
imap	stream	tcp	nowait	root	/usr/local/bin/imapd	imapd
を追加しましょう。tcpd があるなら
pop	stream	tcp	nowait	root	/usr/sbin/tcpd	ipop2d
pop3	stream	tcp	nowait	root	/usr/sbin/tcpd	ipop3d
imap	stream	tcp	nowait	root	/usr/sbin/tcpd	imapd
でしょう。こうすると hosts.deny, hosts.allow で制御できるので、都合のよいように編集して。 でまあ、ひとまず完了。 あと、サービス名とポートの関連付けのため
pop		109/tcp
pop3		110/tcp
imap		143/tcp
というのが必要ということですが、最近のディストリビューションならフツーありますね。


■ imapd 設定ファイル ■

/etc c-client.cf というのが設定ファイルといえばそう。今回は最低限のことだけ書いとく。 imapd はほっとくとホームディレクトリをご開帳なので、そうしないように細工するです。 詳しくは imap-2001a/docs/imaprc.txt にあるんでよろしく。
# cat> /etc/c-client.cf < I accept the risk for IMAP toolkit 4.1.
> set black-box-directory /home/imap-mbox
>EOD
chmod 600 /etc/c-client.cf
1行目の I accept ... はおまじないなので、必ず間違わずに書くこと。2行目が細工の一部分。ではこれに対応するディレクトリを作ればいい。つまりどこを指定してもいいっつーこと。
# mkdir /home/imap-mbox
# chmod 755 /home/imap-mbox
# mkdir /home/imap-mbox/hoge 
# chown hoge /home/imap-mbox/hoge 
# chgrp hoge /home/imap-mbox/hoge 
# chmod 700 /home/imap-mbox/hoge 
これでユーザー hoge の設定はOK。テストしたかったら自機から
# su hoge
$ telnet
> open localhost imap
うんたらかんたら
〜
〜
* OK うんたらかんたら
となるので、
A01 LOGIN hoge hogepasswd
と打って A01 OK うんたらかんたら authenticated と返れば成功。そしたら
A02 LOOUT
で抜けてくださいな。


■ ISP のメールボックスからごっそり持ってくる ■

すでに POP 鯖運用していたヒトはもちろんこのまんま運用方面に突き進んでもよいです。また、bind, sendmail を走らせるに充分な知識のある人もどうぞ。また知識は無くても命知らずなヒトならよいです。あるいは qmail とかきっつきつのツールを使いこなせる(ガマンして使える、とも言う)場合もいっちゃって下さい。

とりあえずは単に「ISP のメールボックスからごっそり持ってきてあとはどの端末から見てもバラバラにならない」という小さな幸せを目指すことにします。これには fetchmail, procmail というツールを使います。ちなみに今回は sendmail を一切使わない、つまり無くてもよい方法です。

fetchmail, procmail のインストールはあまりにもフツーなので省略しますがいいですよね?「わからん!ちゃんとやれ!」というヒトは imapd 入れられんでしょうし、「だって imapd 最初から入ってたもん」というヒトはよく見てみればそのディストリビューションには fetchmail も procmail も勝手に入ってます。

※設定ファイルを書く

$HOME/.fetchmailrc というのを書きます。以下のように
#-----------------------------------------------------
#set daemon 600 
set postmaster hoge
set no bouncemail

poll pop.gufufu.com protocol pop3:
        user "UHIHI4649" with password "HAHIFUHE-HO", is "hoge" here wants mda
"/usr/local/bin/procmail -d hoge"

poll pop.dokkiri.com protocol pop3:
        user "MUHIHI4649" with password "NYANYANYA", is "hoge" here wants mda
"/usr/local/bin/procmail -d hoge"

#keep
#-----------------------------------------------------
これが最低限。set no bouncemail はエラーメールを送信者ではなく postmaster に送ります。こうしないとこっちの都合の取得失敗のたびに相手にメールが飛んで非常に迷惑です。きっと絶交されるでしょう。 上の例は別のISPに2つのアカウントを持っている例ですが、一つならもちろん poll セクションは1つです。 コメントアウトしてありますが keep は取得時にISPサーバーから削除しない設定、daemon はデーモンモードで、つまり間隔600秒でポーリングする便利なオプションで「お、いいじゃん使おうよ」といきたいところですが、セキュリティ上ここでは使いません(後述)。sendmail が生きてる場合は上のようにごたごた書かなくてもいいけど、まあガマンしてくださいな。処理を procmail に任せてるというのがなんとなく分かりますね。ここは自分の好きなコマンドでよいです(もちろん処理可能なヤツね)。


■ もうすこしカスタマイズ ■

コレを基本にいろいろできる。procmail は基本的に振り分けツールだから活用してくださいな。$HOME/.procmailrc にごたごたと書けばよいです。マニュアルは分かりやすいので大丈夫でしょ。


■ 問題点と対処 ■

いくつかの問題点が考えられる。まずは実際の運用では適当にポーリングして定期的に ISP から取り込んでくることになるが、この自動化は少々危険である。取り込む時は所詮 POP である。暗号化もされていない。手元でメーラーで落としてもどこか不安なのに、まったく見えてないところでしかも何度も何度もPOPサーバーにアクセスしている状況というのはどんなもんか。とにかく「メール」というものはどこからどんなものがやってくるか分からない、という意味で攻撃に応用しやすい。考えていくといろいろ出そうだ。

たとえばメールボムとして送りつけられた大量のメールがISPに存在する場合を考える。こういった場合も律儀に fetchmail がPOPでアクセスしてしまうのは嬉しくない。簡単な対処のヒントを

  • fetchmailをラップする
    fetchmail はメール最大サイズ制限(limit)、1回のフェッチ最大数の制限(fetchlimit)、1回の処理最大数(batchlimit)ができるので、これを利用する(.fetchmailrc に書いておく)。フェッチは daemon モードは使わず、シェルスクリプトを書いて、cron で回し、実行ステータスを毎回チェックする。先ほどの設定をしておくとこういったメールを検知した可能性を知ることができるので、その場合は然るべき措置をとる(スクリプトに記述しておく)。cron からはずしてしまってもよいだろうし、呼ばれてもなにもしないようにしてもいいし、好きなようにすればいい、緊急用の .fetchmailrc を用意しておいてそれに置き換えて次回の起動待ちというのが面白いしおススメである。このために daemon モードにしないのである。
セキュリティ的にはけっこう奥が深い。IMAP にも潜在的な脆弱性があったりしてるので、外部にさらす場合は一応注意して使いたいですねー。

クライアントソフトについては他によいページがいっぱいありますので。まあソフト自体は Wanderlust しか考えられないでしょうかね。ちなみに Mew は以前はフォルダが扱えないもののいちおう IMAP 喋りましたが、現行の 2.X では切り捨てられてるようです。


トップページ