imap

kyoma@cosmos.sci.hokudai.ac.jp

最終更新:1999/7/16

はじめ,Debian のパッケージになっている imapd をインストールしたのだが,どうしても imap 要求を受け付けなかった.そこで文献調査をした結果,以下のことがわかり,方針をきめた.このドキュメントは,この方針に沿って作業を行うためのものである.

qmail がメールを配送する ~/Mailbox に imapd を対応させるためのパッチ
(ftp://summersoft.fay.ar.us/pub/linux/qmail/qmail-imap/qmail-imap-4.5.BETA-qmail.patch)
が存在する.

このパッチが何をするのかは,文献 1 に解説されている.
これによれば,このパッチは,imap_4.5BETA のソースにあたる.

imap の現在の最新版(http://mirror.nucba.ac.jp/mirror/imap/imap-4.5.tar.Z)
のバージョンは 4.5 なので,qmail-imap-4.5.BETA-qmail.patch を直接あてることはできない.
そこで,文献 1 での解説に従って,手動でこれにパッチをあて,コンパイルする.

取得・編集・コンパイル

http://mirror.nucba.ac.jp/mirror/imap/imap-4.5.tar.Z を取得,展開.imap-4.5/src/osdep/unix/env_unix.c を 文献 1 の解説(以下に引用)に従って編集.

このパッチが行っていることを具体的に説明します。まず、~userid/Mailbox を使うための方法を示します。imap-4.5.BETA/src/osdep/env_unix.c の関数 char *sysinbox () において
sprintf (tmp,"%s/%s",MAILSPOOL,myusername ());

sprintf (tmp,"%s/Mailbox",myhomedir ());
に書き換えます。

次に、ホームディレクトリ直下のファイルを見せなくするための方法を示します。先と同じファイル env_unix.c の関数 char *mailboxdir (char *dst,char *dir,char *name) において
else strcpy (dst,myhomedir());/* no arguments, wants home directory */

else strcpy (dst,myhomedir()), strcat( dst, "/mail" );/* no arguments, wants home directory */
に書き換えます。さらに関数 char *mailboxfile (char *dst,char *name) において
sprintf (dst,"%s/%s",dir,name);

sprintf (dst,"%s/mail/%s",dir,name);
に書き換えます。

imap-4.5/Makefile を見ると,

# The following plaintext login types are defined:
# afs   AFS authentication database
# dce   DCE authentication database
# md5   MD5 database (must also have md5 as an authenticator)
# nul   no plaintext authentication (note: this will break some secure
#        authenticators -- don't use without checking first!!)
# std   system standard (typically passwd file), determined by port

PASSWDTYPE=std
とあるので,
PASSWDTYPE=md5
に書き換える.imap-4.5/docs/md5.txt には,MD5 を用いた認証について書かれている.これによれば,この認証方式はパケット盗聴に対してセキュアだそうだ.PASSWDTYPE=std としてコンパイルした場合,imap 認証にはログインに使うパスワードと同じ物が用いられる.これはアンセキュア!

imap-4.5/README に従って,

$ cd imap-4.5/
$ make slx

su になって,

# cp imap-4.5/imapd/imapd /usr/local/sbin/imapd

設定

/etc/services に,
imap2           143/tcp                         # Interim Mail Access Proto v2
imap2           143/udp
があることを確認.

/etc/inetd.conf に以下の一行を加える.余談:はじめ,imap-4.5/docs/BUILD に従ってプロトコル名を "imap" としていたのだが,うまく動作しなかった."imap2" に改めたのは,/etc/services にそう表記されていたため.

imap2   stream  tcp     nowait  root    /usr/local/sbin/imapd    imapd
inetd に HUP を送る.
# kill -HUP xxxx
xxxx: inetd のプロセス番号.

一般ユーザ毎に ~/.qmail を編集.以下の一行を加える.

./Mailbox
メールが ~/Mailbox へ配送されるようになる.

MD5 認証データベースファイル

imap-4.5/docs/md5.txt に従って,/etc/cram-md5.pwd を書く.これが,CRAM_MD5 の認証データベースファイルとなる.
# CRAM-MD5 authentication database
# Entries are in form <user><tab><password>
# Lines starting with "#" are comments

kyoma	xxxxxxxx
ユーザ名と imap 用パスワードの間は tab で区切るとされている.

root 以外のパーミッションは,0 とする.

MD5 認証データベースファイル自動生成

CRAM_MD5 の認証データベースファイル /etc/cram-md5.pwd の書き込みには root 権限が要る.そのため,imap 認証のパスワードを各ユーザが編集することはできない.そこで,apop 認証パスワード ~/Maildir/.password を読み出して,/etc/cram-md5.pwd を生成するスクリプトを書いた.これを root 権限で定期的に実行すれば,(遅れはあるものの)/etc/cram-md5.pwd が更新される.

スクリプトは以下.これを,/etc/cron.daily/imappwdbg とした.パーミッションは,744.

#!/usr/bin/perl
#Kyoma TAKAHASHI 1999.7.9
#Thanks for Toyoda's help.

$chmodbin = '/bin/chmod';
$imappwdb = '/etc/cram-md5.pwd';
$userpwfile = 'Maildir/.password';

system "$chmodbin 600 $imappwdb";
open(DBFILE,"> $imappwdb");
        print DBFILE '# CRAM-MD5 authentication database',"\n";
        print DBFILE '# Entries are in form <user><tab><password>',"\n";
        print DBFILE '# Lines starting with "#" are comments',"\n";
        print DBFILE "\n";

while (($user,$passwd,$uid,$gid,$quota,$comm,$gcos,$dir) = getpwent) {

        open(PWFILE,"< $dir/$userpwfile");
        $pass = '';
        $pass = $_ while(<PWFILE>);
        chop($pass);
        close(PWFILE);

        if($pass ne '') {
                print DBFILE $user;
                print DBFILE "\t";
                print DBFILE $pass;
                print DBFILE "\n";
        }

}

close(DBFILE);
system "$chmodbin 400 $imappwdb";

文献

  1. http://www.ne.jp/asahi/cyber/taki/server/qmail/uw-imapd.html