UW-IMAPを使ってみる
%%Title: UW-IMAPを使ってみる
%%Created: Tue Jun 7 14:51:13 JST 2005
%%Updated: Fri Jan 20 19:42:34 JST 2006
NOTE: 2006/01/20 気が変わった。本家を使いたい気持は変わらないけど、並列処理と言う意味で Maildir形式に移行した。uw-mapは Maildir形式をサポートしていないので Courierを使うことにした。
o 背景
最近の個人情報保護法案のあおりで会社のノートPCに会社の業務に関連する情報は
置いちゃならない事(基本的には…と言う表現だが、実質置くなって事)になった。
これまで10数年間の運用は、
- メールサーバは sendmail + qpopper
- メールサーバのメールを全て手もとのノートPCに蓄える。
- メールサーバにはメールを残さない。
- 適時ノートPCのバックアップをする。
ところがメールアドレスも個人情報にあたるので、メールそのものを置けなくなった。
もともと IMAPに以降したいと思っていたし、いい機会だから環境を変えてみよう。
qpopperさよなら計画発動。プラットフォームは NetBSD2.0です。
手もとのファイルを暗号化するには、こっちも参照。
o IMAPって?
説明するまでもないでしょう。
RFC2060 に規定された INTERNET MESSAGE ACCESS PROTOCOLのこと。
version 4 rev 1なので、IMAP4とか呼ばれることもある。
1996年12月の規格なので拡張がたくさんあるみたい。
- フリーなサーバ実装 [2005/6/7]
UW
http://www.washington.edu/imap/
Cyrus
http://asg.web.cmu.edu/cyrus/imapd/
Courier
http://www.courier-mta.org/imap/
DOVECOT
http://www.dovecot.org/
BINC
http://www.bincimap.org/
- フリーなクライアント実装 [2005/6/7]
http://www.imap-partners.net/clients.html
o サーバのインストール
sendmailが保存する形式(mailbox形式ていうの?1ファイル1フォルダ)と、
MH形式(1ファイル1メール)をサポートしているのと、
Maildir形式(1ファイル全フォルダ)はいまいち好きになれなかったので、uw-imapを使うことにする。
機能はどうあれ、やっぱり本家を使いたくなるでしょ…。こっちがほんとの理由。
NetBSD2.0の場合は pkgになってるので楽ちん。
# pkg_add imap-uw-2004c1nb2.tgz
- inetd.confの編集
qpopperを動かしていたので以下の行を削除。
pop3 stream tcp4 nowait root /usr/local/libexec/qpopper qpopper -s
pop3 stream tcp6 nowait root /usr/local/libexec/qpopper qpopper -s
imapを動かすために以下の行を追加。
imap stream tcp4 nowait root /usr/pkg/libexec/imapd imapd
imap stream tcp6 nowait root /usr/pkg/libexec/imapd imapd
なお popと共存させるには uw-imapの popデーモンを動かす必要がある。
以下の行を追加。
pop3 stream tcp4 nowait root /usr/pkg/libexec/ipop3d ipop3d
pop3 stream tcp6 nowait root /usr/pkg/libexec/ipop3d ipop3d
inetd.confを編集したら kill -HUPを忘れずに。
念のため /etc/services に imapが追加されているか確認。
% grep imap /etc/services
imap 143/tcp imap2 imap4 # Internet Message Access Protocol
imap 143/udp imap2 imap4
imap3 220/tcp # Interactive Mail Access
imap3 220/udp # Protocol v3
imaps 993/tcp # imap4 protocol over TLS/SSL
imaps 993/udp # imap4 protocol over TLS/SSL
o テスト
テストのために /var/mail/sakane に1通置く。
% cat /var/mail/sakane
From sakane Tue Jun 7 14:59:51 2005
To: sakane@kame.net
Subject: test
Date: Tue, 07 Jun 2005 15:00:29 +0900
From: Shoichi Sakane
Lines: 1
this is test.
- telnetでつないでみる
% telnet ::1 imap
Trying ::1...
Connected to localhost.
Escape character is '^]'.
* OK [CAPABILITY IMAP4REV1 LITERAL+ SASL-IR LOGIN-REFERRALS STARTTLS AUTH=LOGIN] localhost IMAP4rev1 2004.357 at Tue, 7 Jun 2005 16:03:31 +0900 (JST)
x login sakane "hoge"
x OK [CAPABILITY IMAP4REV1 LITERAL+ IDLE NAMESPACE MAILBOX-REFERRALS BINARY UNSELECT SCAN SORT THREAD=REFERENCES THREAD=ORDEREDSUBJECT MULTIAPPEND] User sakane authenticated
コマンドの大文字小文字は無視される。
先頭の x はタグと呼ばれるクライアントがセッションを識別するための任意の文字列。
パスワードは、¨hoge¨ (ダブルクォーテーション)で囲まないと
x BAD Missing or invalid argument to LOGIN
と怒られた。uw-imapだけかどうかは不明。
x select inbox
* 1 EXISTS
* NO Trying to get mailbox lock from process 1881
* 0 RECENT
* OK [UIDVALIDITY 1118125715] UID validity status
* OK [UIDNEXT 2] Predicted next UID
* FLAGS (\Answered \Flagged \Deleted \Draft \Seen)
* OK [PERMANENTFLAGS (\* \Answered \Flagged \Deleted \Draft \Seen)] Permanent flags
x OK [READ-WRITE] SELECT completed
select inbox で /var/mail/sakane を指定する。
x fetch 1 body.peek[]
* 1 FETCH (BODY[] {142}
To: sakane@kame.net
Subject: test
Date: Tue, 07 Jun 2005 15:00:29 +0900
From: Shoichi Sakane
Lines: 1
this is test.
)
x OK FETCH completed
1番目の bodyを見てみる。
データの指定を body.peekとしている点に注意。
bodyを指定してしまうと、
X-IMAPbase: 1118129568 1
Status: O
X-Status:
X-Keywords:
X-UID: 1
とかが元のメールに追加されてしまう。
x logout
* BYE localhost IMAP4rev1 server terminating connection
x OK LOGOUT completed
Connection closed by foreign host.
logoutで接続を切る。
o 設定
サーバ側で共通の設定は /etc/c-client.cfに書く。
何はともあれ1行目に
I accept the risk
と書く :-)
理由は、こっち。imaprc.txtより抜粋:
The very first line of the file MUST start with the exact string "I
accept the risk". This ensures that you have checked the file for
correctness against this version of the IMAP toolkit. This enable
string may change without notice in future versions, and the new
string may or may not be accurately described in an updated version of
this file.
生パスワードでログインさせないようにするには
set disable-plaintext 1
で、どうやってログインするかと言うと CRAM-MD5方式てのがあるみたい。md5.txt参照。
/etc/cram-md5.pwdに、ユーザ名とパスワードを書いておく。
区切り文字はタブ1文字。うっかりハマル可能性あり ;-(
コメントは行頭に #(シャープマーク)
# cat /etc/cram-md5.pwd
sakane hoge
# chmod 0400 /etc/cram-md5.pwd
注意: set disable-plaintext 1 していなくても、
/etc/cram-md5.pwd ていうファイルがあると、
*全て*のユーザは CRAM-MD5方式でログインしなければならなくなる。
逆引きして遅くなるのを回避するには
set allow-reverse-dns 1
IMAP4rev1 2004.357 だと、効いてないような。コード未確認。
ログイン成功後、listコマンドを使うとHOMEディレクトリ以下がごっそり見えてしまう。
x list "" "%"
* LIST (\NoSelect) "/" Mail
* LIST (\NoInferiors \UnMarked) "/" .viminfo
* LIST (\NoSelect) "/" diary
: (snip)
x OK LIST completed
認証後だから気にしなくてもよさそうだけど、もしCRAM-MD5のパスワードが
バレちゃうと、メール以外のファイルも漏れちゃう。
気持ち悪いのでサーバ側で不可にする。
set black-box-directory /var/spool/imap/
と書くと、ユーザのホームディレクトリをこっちに向けることができる。
select inboxすると
# mkdir /var/spool/imap/sakane
# chown sakane /var/spool/imap/sakane
% ln -s /var/mail/sakane /home/imap/sakane/sakane
しとく。
ついでに、他のユーザディレクトリや絶対パス、相対パスの指定を不可にする。
set restrict-mailbox-access all
set black-box-directoryすると、これ必要なさそうな気もする。コード読めって ;-(
ところで、
This should be done ONLY on systems which do not permit users to have shell access
とあるけど、set chroot-server の理由ならともかく、こっちで推奨しない理由が分からない。
shellアクセスできるユーザなら、ファイルシステムの許可フラグで制限できるでしょ?
て理由かな。
ユーザ毎の設定は ~/.imaprcに書く。
/etc/c-client.cfに
set allow-user-config 1
しとかないと無効。
ログイン失敗した時に何回試せるかを設定。デバッグ時以外は 1 でいいと思う。
set maximum-login-trials
0 にすると無限回試せる。
…と、書いてるけど、効いてないぽい。
1 にして試すと
% telnet ::1 143
Trying ::1...
Connected to localhost.
Escape character is '^]'.
* OK [CAPABILITY IMAP4REV1 LITERAL+ SASL-IR LOGIN-REFERRALS STARTTLS AUTH=LOGIN] localhost IMAP4rev1 2004.357 at Tue, 7 Jun 2005 19:30:32 +0900 (JST)
x login hoge hoge
x NO LOGIN failed
x login hoge hoge
x NO LOGIN failed
x login hoge hoge
x NO LOGIN failed
: (snip)