授業資料/第09回 の変更点

Top / 授業資料 / 第09回

* 認証システムについて一般的な話 [#ue28434b]

unix サーバに限らず,コンピュータ一般に「認証」という仕組みは不可欠である.
基本的に,危険な領域であるインターネット上をパスワードをどのようにやりとりするか,パスワードとユーザ名などの照合をどのように行うのかの二点について様々な方法があり,これらを柔軟に選べるようになっているものが多い. 
そのために初学者には混乱があるかと思うが,実際はこの二カ所の選択だという構図が分かれば分かりやすいだろう.
実際,おおまかには,unix 上でのソフトウェアは通常は以下の図のような構造をしているので,この構図を頭にいれて以下の話を読めばわかるだろう.

&ref(./authentication-structure_ss.png);
CENTER:認証の一般的な仕組み

* 前回からの続き [#ja89ff28]


** SMTP Auth の設定(postfix) [#z61f2855]

さて,SMTP Auth の設定となるとマニュアルにも特に記述がないことだし,情報をきちんと調べてから行ないたい.
SMTP Auth に関してはまだまだ変更があいついでいるようなので,こういうときはまずは本家 http://www.postfix.org/ で確認したい.
具体的には http://www.postfix.org/SASL_README.html をチェックすることになる. すると,まずは次のように書いてあるところが参考になる.

  Enabling SASL authentication in the Postfix SMTP server
  
  In order to enable SASL support in the Postfix SMTP server:
  
    /etc/postfix/main.cf:
        smtpd_sasl_auth_enable = yes
  
  In order to allow mail relaying by authenticated remote SMTP clients:
  
    /etc/postfix/main.cf:
        smtpd_recipient_restrictions = 
            permit_mynetworks 
            permit_sasl_authenticated 
            reject_unauth_destination
  
  To report SASL login names in Received: message headers (Postfix version 2.3 and later):
  
    /etc/postfix/main.cf:
        smtpd_sasl_authenticated_header = yes
  
  Note: the SASL login names will be shared with the entire world.
  
  Older Microsoft SMTP client software implements a non-standard version 
  of the AUTH protocol syntax, and expects that the SMTP server replies to 
  EHLO with "250 AUTH=mechanism-list" instead of "250 AUTH mechanism-list". 
  To accommodate such clients (in addition to conformant clients) use the following:
  
    /etc/postfix/main.cf:
        broken_sasl_auth_clients = yes

まずはこの指示にしたがって main.cf を修正しよう.   ただし,上の文中の/etc/postfix は FreeBSD では /usr/local/etc/postfix に変更されているので脳内で変換しながら読もう. また,"smtp" と "smtpd" (最後に "d" がついている)とでは意味が違ってくるので,タイプミスをしていないか注意深く記述しよう.  ここでは全部で 4つの記述が加わることになる. これは main.cf の最後に固めて記述しても問題ないはずだ.

さらに上記資料を読み進むと,
  Cyrus SASL configuration for the Postfix SMTP server
で始まる部分があるのでこれまた読まないといけない. ただここは読んでも良く分からない部分も多いだろうから修正箇所を書いておくと,main.cf にとりあえず以下の二つの記述を加えておけばよい.
  smtpd_sasl_path = smtpd
  smtpd_sasl_local_domain = $myhostname
ただし,ここを読み飛ばさない方が良い. というのも,SMTP auth に使うパスワードの作り方が丁寧に書いてあるのだ.
具体的には,
  saslpasswd2 -c -u `postconf -h myhostname` exampleuser
とせよ,と書いてある(最後の "exampleuser" というのはユーザ名に置き換えて読むべし)((要はレルムを正しく設定せよということなんだが,こうしておけば間違える余地が減るよね,ということかな)).

** SMTP Auth の動作確認 [#s456d9a5]

*** ユーザの登録(SMTP Auth 専用で) [#vdd4553f]

SMTP Auth を行う際,ユーザとパスワードの照合をどういうデータに基づいて行うかには本来は選択肢が複数ある.
今回は特に複数の選択肢を指定していない((詳しくは前回の授業資料において "You can use sasldb2 ..." で始まるログメッセージ部分を読めば分かる))ので使えるのはデフォルトの pwcheck_method のみ,つまり,SMTP Auth が利用する SASL 専用のユーザ/パスワード表を利用することになる.

ということは,SMTP Auth を使う前に,利用者の登録が必要だということである.
具体的には,上にあるように saslpasswd2 コマンドを使うことになる.

ちなみに,ユーザと(SMTP Auth 専用の)パスワードがきちんと登録されたかの確認は,
  sasldblistusers2
とすると
  ユーザ名@ホスト名: userPassword
などという表示が出るので確認できる.

*** 実習 [#ha38d029]
ユーザを SMTP Auth 用に登録しよう.
また,前回授業資料に載っているログメッセージによると SMTP Auth に使える "ユーザとパスワードの照合方法" には /etc/passwd, PAM, LDAP などがあると書かれている.
これらは何か,調べてみよ.

*** 実際に手で接続してみる. [#f569f61c]

SMTP Auth で接続する際の認証方法にもいくつかあり,自由に設定で選ぶことができる.
今回のインストールでは特に設定を加えなければ NTLM認証,login認証, plain認証,GSSAPI認証, Digest-MD5認証, CRAM-MD5認証が使えるようになっているだろう.

そこで,このうちの簡単に利用できるが暗号化ナシの plain認証と,きちんと使うなら定番の CRAM-MD5認証を試してみよう.

その前に,後で用いるコマンドである mmencode を準備としてインストールしておく.
具体的には,ports コレクションを新しくしておいてから,
  portinstall mmencode
とすればよい.

*** 手で SMTP Auth を試す : Plain 認証の場合 [#ub232516]

Plain 認証はお気楽なモノで,SMTP Auth 時に文字列 "\0ユーザ名\0パスワード"((\0 はヌルバイト))を base64 でエンコードしたものをサーバに渡すという簡単な仕組みだ.
ちなみに,base 64 は暗号化ではなくて(コンピュータで扱うのに便利になるような)単なる変換((ちなみに,base64 エンコードしたテキストは,"mmencode -u" で元に戻すことができる.))なので,セキュリティは全く確保されないことに注意が必要だ.
つまり,パスワード等を base64 エンコードしたもの(後述の mmencode をかけたもの)を人に教えたりしてはいけない.

さて,接続前に接続に必要な文字列を作ってしまおう.
具体的には,コマンドラインで
  printf '\0000ユーザ名\0000パスワード' | mmencode 
とすればよい((\0000 となっているところは \0 でもよいのだが,パスワードの1文字目が数字だったりするとうまくいかないので,念の為にこうしてある.)).
ユーザ名とパスワードはさきほど SMTP Auth 用に saslpasswd2 コマンドで設定したものである.

こうすると,'\0ユーザ名\0パスワード' が base64 エンコードされた文字列が出力される((例えば '\0test\0password' を mmencode すると "AHRlc3QAcGFzc3dvcmQ=" という文字列が出力される.))ので,これをどこかへ保存しておこう((文字端末エミュレータに覚えさせてしまえば楽だろう)).

あとはいつものように telnet localhost 25 で自前の MTA に接続してみる. 
いつものように "EHLO localhost" として応答を進めると,次のように SMTP AUTH ができるよという表示込みで応答が進むはずだ((250-AUTH で始まるほぼ同じ行が二回出てくるのが Microsoft の MUA 対策である. )).
  250-(ホスト名)
  250-PIPELINING
  250-SIZE 10240000
  250-VRFY
  250-ETRN
  250-AUTH NTLM LOGIN PLAIN GSSAPI DIGEST-MD5 CRAM-MD5
  250-AUTH=NTLM LOGIN PLAIN GSSAPI DIGEST-MD5 CRAM-MD5
  250-ENHANCEDSTATUSCODES
  250-8BITMIME
  250 DSN
この段階で SMTP Auth の Plain 認証を試してみよう.
具体的には,ここで
  AUTH PLAIN 先ほどbase64エンコードして作った文字列
と入力すればよい. Plain 認証はこれだけで済む.
そして
  235 2.0.0 Authentication successful
などと "success" の意がメッセージで返ってくれば,認証が通ったということで OK である.
うまくいかない人は丁寧にこれまでの作業を振り返ろう.

*** 実習 [#y3077878]
ここまで書いてあることを実行しよう.

*** 手で SMTP Auth を試す : CRAM-MD5 認証の場合 [#eee6a04a]

CRAM-MD5認証は先の Plain認証と違って,パスワードを平文で送らない形式である. plain 認証と異なり,ネットワークを盗聴されてもまあ安全といえよう.
具体的には,接続するとサーバが適当な文字列を送ってくるので,これをパスワードをキーにして hmac-md5 でハッシュを求め(これがパスワードを圧縮, 暗号化したことに相当する), ユーザ名とあわせて base64 エンコードして送り返し,サーバで同様に作ったハッシュと同じなら認証 OK という感じになる.

ややこしいが,実は CRAM-MD5 をテストするためのスクリプト "userdb-test-cram-md5" が(後の imap インストールの際に)インストールされるので,それを用いればよい.
よって,''ここの作業は後述の courier-imap をインストールした後に行なうこと''.
ただし,courier-imap の設定はしないで戻ってきてよい.

以下の作業にはコンソールが二つ以上あった方が便利なので,X で適当な文字端末エミュレータを二つ起動してから行おう.
状況を分かりやすくするために,これから各々のエミュレータで動く二つのシェルを各々 Shell-A, Shell-B として書いておこう.

まず,''Shell-A'' で telnet localhost 25 で先と同じように
  250-AUTH NTLM LOGIN PLAIN GSSAPI DIGEST-MD5 CRAM-MD5
  250-AUTH=NTLM LOGIN PLAIN GSSAPI DIGEST-MD5 CRAM-MD5
  250-ENHANCEDSTATUSCODES
  250-8BITMIME
  250 DSN
というところまでいこう. そしてここで
  auth cram-md5
と入力する. すると,
  334 PG5hbmlrYW5vLXNlcnZlcj4=
などと出力が返ってくる.
この ''PG5hbmlrYW5vLXNlcnZlcj4='' がサーバが base64 で送ってきた文字列((これを "mmencode -u" にかけると実際の文字列がわかる))であるので,これをユーザのパスワードをキーにして hmac-md5 でハッシュを計算してユーザ名とあわせて base64 で送り返せばよい. この文字列の生成は面倒にみえるが,なんのことはなくて先のコマンドを使えばよい.

具体的には ''Shell-B で'' userdb-test-cram-md5 を実行して,以下のように対応すればよい.
  Username? testuser ← (SMTP Auth に使う)ユーザ名を入力する
  Password?  password ← (SMTP Auth に使う)パスワードを入力する
  Send: AUTH CRAM-MD5 (or for imap, A AUTHENTICATE CRAM-MD5)
  Paste the challenge here:
  + PG5hbmlrYW5vLXNlcnZlcj4= ← Shell-A でサーバが送ってきた文字列を入力する.
  Send this response:
  dGVzdHVzZXIgY2NiNjc4YmZjZGY1YWRlMGUyYmE2MmM3ODA3OTA1NGI=
すると,上のように最後に返答すべき文字列を生成してくれる. 

そこでこの文字列(この例の場合は ''dGVzdHVzZXIgY2NiNjc4YmZjZGY1YWRlMGUyYmE2MmM3ODA3OTA1NGI='')
をさっきの ''Shell-A での作業の続きに'' 入力する. 
認証が通ればこのあと
  235 2.0.0 Authentication successful
などとうまくいくだろう.

** SMTP over TLS の設定と動作確認 [#ia488eff]

*** SMTP over TLS の設定 [#odede9af]

TLS の利用については,設定のまえに鍵と証明書を用意しないといけない.
web server の設定の時に作った鍵と証明書を /etc/ssl に(汎用的な名前に直して)移動させて使うもよし((この場合はもちろん apache の設定も直さないといけない)),新しく作ってもよいだろう.

今回は鍵と証明書を新しく作って((やり方は授業第07回の SSL の項目に書いてある)) /usr/local/etc/postfix に置くことにしよう. そしてファイル名を例えば(鍵) postfix.key, (証明書) postfix.crt としておく.

ただし,このファイルが他の人に読めてしまうと困るので,作った後すぐに
  chmod 400 postfix.key
  chmod 400 postfix.crt
としておこう.

さて,Postfix の設定は,本家のドキュメント(http://www.postfix.org/TLS_README.html)を読んで自分なりに取捨選択することになる.
サーバかクライアントかや認証をどうするかなど多少ややこしくてよくわからないかと思うので,今回は設定を書いてしまおう.
とりあえず /usr/local/etc/postfix/main.cf に
  smtpd_tls_cert_file = /usr/local/etc/postfix/postfix.crt
  smtpd_tls_key_file = /usr/local/etc/postfix/postfix.key
  smtpd_tls_received_header = yes
  smtpd_tls_security_level = may
  
  smtp_tls_security_level = may
  smtp_tls_note_starttls = yes
などと加えれば良い((Postfix の設定方法が最近変わったため,web 上で参照できる設定の多くは既に古く,あまり推奨できないので留意すること.)). ただし,これは経路の暗号化だけでよい,という設定なので,認証まできちんとしたい人はドキュメントをきちんと読もう.

この編集が終わったら,postfix を一旦停止してから再起動する.
  /usr/local/etc/rc.d/postfix stop
  /usr/local/etc/rc.d/postfix start
再起動時に何かエラーや警告が出ていないか注意しておこう.

*** SMTP over TLS の動作確認 [#c0579bf3]

うまくいっているようだったら再び telnet localhost 25 で確認してみる.
これまでと同様に(途中で EHLO localhost して)
  250-(ホスト名)
  250-PIPELINING
  250-SIZE 10240000
  250-VRFY
  250-ETRN
  250-STARTTLS
  250-AUTH NTLM LOGIN PLAIN GSSAPI DIGEST-MD5 CRAM-MD5
  250-AUTH=NTLM LOGIN PLAIN GSSAPI DIGEST-MD5 CRAM-MD5
  250-ENHANCEDSTATUSCODES
  250-8BITMIME
  250 DSN
などとなる(ここで quit と入力すると抜けられる).
良くみると "250-STARTTLS" という部分があり,とりあえず TLS 対応の動作をしていることがわかる.
これが出ないようなら何かおかしいのでこれまでの作業を振り返ろう.

さて,TLS の動作の確認だが,ここで SMTP の動作チェックに便利なツールを導入しよう.
それは ''swaks'' (Swiss Army Knife SMTP) とよばれるものであり,これまでの telnet localhost 25 という一連の作業を自動的にやってくれる便利なものである.

というわけでまずは portsコレクションを portsnap で新しくしてから swaks をインストールしよう.
  portinstall swaks
とすればよい. インストール時にオプション選択画面
&ref(./swaks-install_s.png);  
が出たら,少なくとも "MX lookup support" と "TLS support" とを ON にしておいてからインストールしよう(NTLM はこの授業では関係ない). あとはスムーズにインストールできるはず. インストールが終わったら念の為に rehash しておこう.

さて, swaks の使い方は swaks --help とするとマニュアルが読めるのでそれをみてもらうとして,まずはおさらいも兼ねてこれまでのテストを再現してみよう.

まずは単に MTA が動作しているかの確認から.
  swaks --server localhost
とすると,テストメールの宛先を聞いてくるので, 自分のアカウント名を答えよう. すると
  === Trying localhost:25...
  === Connected to localhost.
  <-  220 サーバ名 ESMTP Postfix
   -> EHLO サーバ名
  <-  250-サーバ名
  <-  250-PIPELINING
  <-  250-SIZE 10240000
  <-  250-VRFY
  <-  250-ETRN
  <-  250-STARTTLS
  <-  250-AUTH NTLM LOGIN PLAIN GSSAPI DIGEST-MD5 CRAM-MD5
  <-  250-AUTH=NTLM LOGIN PLAIN GSSAPI DIGEST-MD5 CRAM-MD5
  <-  250-ENHANCEDSTATUSCODES
  <-  250-8BITMIME
  <-  250 DSN
   -> MAIL FROM:<差出人アドレス>
  <-  250 2.1.0 Ok
   -> RCPT TO:<宛先>
  <-  250 2.1.5 Ok
   -> DATA
  <-  354 End data with <CR><LF>.<CR><LF>
   -> Date: 日付
   -> To: 宛先
   -> From: 差出人
   -> Subject: test 日付
   -> X-Mailer: swaks v20061116.0 jetmore.org/john/code/#swaks
   ->
   -> This is a test mailing
   ->
   -> .
  <-  250 2.0.0 Ok: queued as D6E7C11430
   -> QUIT
  <-  221 2.0.0 Bye
と MTA とやり取りして,その途中経過をきちんと出力してくれる. いまはテストメールを実際に送ったはずなので,アカウントのホームディレクトリの Maildir/new にメールが届いているはずである. 確認してみよう.

次に,SMTP Auth の plain認証を試してみよう. ただし,いちいちメールが届く必要ももうないので,動作確認のみでメールは送らないようにしよう. それには次のようにすればよい.
  swaks --auth PLAIN --server localhost --quit RCPT
すると最初に(実際には送らないが)テストメールの宛先を聞いてきて,その後に SMTP  Auth の認証に必要なユーザ名とパスワードを聞いてくるので答えよう.  その後,出力をよく見て,確かに SMTP Auth の Plain認証がうまくいっていることを確認しよう.

次に SMTP Auth の CRAM-MD5 認証を試してみる. それには
  swaks --auth CRAM-MD5 --server localhost --quit RCPT
とすればよい. 後はさっきのと同じである.

さて,やっと肝心の SMTP over TLS をテストしよう. といってもここまでくればテストはもう簡単で,
  swaks -tls --server localhost
とすればよい. ただし,念の為にテストメールを実際に送ろうとしている.
これを実行して,swaks の出力を読んで問題がなければ OK だ. もちろん, Maildir/new に実際にメールが届いているかもチェックしておこう.

最後に,SMTP Auth と SMTP over TLS を組み合わせてみよう. SMTP Auth の認証はなんでもよい. 好きなものを使ってやってみよう.
具体的には例えば次のようにすればよい(SMTP Auth は自動的に選んでもらう設定).
  swaks --auth -tls --server localhost --quit RCPT
ここで出力を丁寧に読んでみよう.  そして ''starttls してから SMTP Authしている'' こと, つまり,「暗号化してからパスワードをやり取りする」順番になっていることに注意して欲しい.
これは SMTP over TLS と組み合わせるならば認証(パスワードのやり取り)は平文でも安全なはず,ということである((逆に言えば,over TLS していないならばネットワークを介して Plain認証を使うと危ないよということになる)).

*** 実習 [#l2766ac6]
SMTP over TLS/SSL には上記の StartTLS の他にもうひとつ SMTPS と呼ばれるものがあり,今回も設定次第ではそれを動かすことができる.
では,SMTPS とは何か,StartTLS と比べての利点/欠点は何か調べよ.
さらに余力があるようだったら何か手元の MUA で starttls に対応するように設定して動作確認してみよ.

* IMAP/POP サーバのインストール,管理 [#bc50b8a7]

さて,ユーザ宛に届いたメールを MUA に渡すのに広く使われている POP/IMAP のサーバについても触れよう.
いまだ広く使われている POP,ユーザにとっては便利だがサーバへの負担が高めのために商業ベースではなかなか用いられない IMAP,と大まかに言える. 
ここでは,将来的なことも考えて IMAP サーバについて学習してみよう. ちなみに,POP サーバは IMAP サーバに比べれば単純なので,IMAP サーバが扱えればPOP サーバについては困らないだろう.

さて,IMAP サーバとしては courier-imap が広く使われているので授業でもこれを用いよう.
なお,courier-imap をインストールすると一緒に courier-pop もインストールされるので,POP サーバをインストールしたい,というときに courier-imap を選択してもよい.

** courier-imap のインストール [#s46e219d]

さて,いつものように ports コレクションからインストールしよう.
ただし,imap サーバのインストールの前に courier-authlib(courier-imap の認証関係だけ抜き出したmeta ports) のインストールを行っておく((そうしないと実質的に使えない.)).
いつものように
  portinstall courier-authlib
とする. 最初に出るオプション画面では
&ref(./courierauth-install.png);
のように少なくとも userdb を選んでおく. あとはスムーズに進むだろう.

次に
  portinstall courier-imap
として courier-imap 本体をインストールする. 最初にオプション選択画面
&ref(courierimap-install.png);
が出るが,多分デフォルトで OpenSSL と IPv6 が選ばれているだろう. 特に問題ないので,そのまま OK でよい.

しばらく待っていると(いくつか他に必要なソフトウェアをインストールしてから)インストールが終わる.
その途中でやはりいくつかメッセージが出るが,今回は少なめで,実質的には次のものだけである.
  In case you use authpam, you should put the following lines
  in your /etc/pam.d/imap
  auth    required    pam_unix.so         try_first_pass
  account required    pam_unix.so         try_first_pass
  session required    pam_permit.so
  
  You will have to run /usr/local/share/courier-imap/mkimapdcert to create
  a self-signed certificate if you want to use imapd-ssl.
  And you will have to copy and edit the *.dist files to *
  in /usr/local/etc/courier-imap.

これは,IMAP の認証方法として他の方法である PAM を使いたければこうしろ,ということと,IMAP over TLS/SSL を使う際の自己認証証明書の作り方が書いてある. 
いずれも結構重要なメッセージなので,読み飛ばさないようにしよう.

** courier-imap の設定 [#m47e11c1]

さて,インストールが済むと /usr/local/etc/authlib に認証関係の設定が,/usr/local/etc/courier-imap に imap/pop 関係の設定ファイル等が置かれる.

まず認証関係を整理しよう.
認証機構そのものの設定については /usr/local/etc/authlib に設定ファイルを用意して云々…となるのだが,今回は userdb しか選んでいないので設定は不要な状態である. なのでこのディレクトリでやることはない.

次に,over TLS/SSL で使う自己認証証明書(courier-imap はこれを要する)を作る.
先に作った鍵と証明書とは違う機能のものなので,新たに作らないといけない.

方法は簡単で,/usr/local/etc/courier-imap にサンプルとしておいてある imapd.cnf.dist と pop3d.cnf.dist をコピーして  imapd.cnf と pop3d.cnf というファイルを作り,中をみて適当に編集.
それから,
  cd /usr/local/share/courier-imap/
  mkimapdcert
  mkpop3dcert
とすると,/usr/local/share/courier-imap/ に imapd.pem, pop3d.pem という自己認証証明書ができる.
ファイル名も場所も特に変更を要しないので,これで証明書の作成はおわり.

次に,IMAP 本体の設定を行おう. /usr/local/etc/courier-imap で,imapd というファイルを編集する((もし imapd というファイルがなければ,imapd.dist がサンプルなのでこれをコピーして作ろう.)).
具体的には,
>  IMAP_CAPABILITY="IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA AUTH=CRAM-MD5 AUTH=CRAM-SHA1 AUTH=CRAM-SHA256 IDLE"
>  IMAP_CAPABILITY_TLS="$IMAP_CAPABILITY AUTH=PLAIN AUTH=LOGIN"

の二カ所を修正(画面の都合で折り返しているが,各々 1行ずつなので注意)すればよい. 
各々,デフォルト値から変わった部分を見れば何をしたかはわかるだろう. ちなみに二つ目の最後の AUTH=LOGIN は(適当だが) MS 対策である.

あと,POP サーバも使いたいならば,とりあえず同様に pop3d というファイルの中の2箇所を
  POP3AUTH="CRAM-MD5 CRAM-SHA1"
  POP3AUTH_TLS="LOGIN PLAIN"
と修正しておけばよい.

さて,あとは IMAP サーバの起動準備であるが,これはヒントが少ない.
しかたないので,courier-imap インストール時のメッセージを再び読むと,最後の方に
      This port has installed the following startup scripts which may cause
      these network services to be started at boot time.
  /usr/local/etc/rc.d/courier-imap-pop3d-ssl.sh
  /usr/local/etc/rc.d/courier-imap-imapd-ssl.sh
  /usr/local/etc/rc.d/courier-imap-imapd.sh
  /usr/local/etc/rc.d/courier-imap-pop3d.sh  
とあるので,実際はこれらのスクリプトが起動操作を行うのだということはわかる.
そして念の為に /usr/local/etc/rc.d ディレクトリを覗いてみると,これらは確かにあり,かつ,他に courier-authdaemond というファイルもあり, これも同様の役割を担うことが推測できる.

そこでこれらのファイルのうち,IMAP サーバの起動に関連しそうなスクリプト "courier-authdaemond", "courier-imap-imapd.sh", "courier-imap-imapd-ssl.sh" の3つを直に読んでみよう.
すると,例えば courier-imap-imapd.sh には
  # Define these courier_imap_imapd_* variables in one of these files:
  #       /etc/rc.conf
  #       /etc/rc.conf.local
  #       /etc/rc.conf.d/courier_imap_imapd
  #
  # DO NOT CHANGE THESE DEFAULT VALUES HERE
  
  courier_imap_imapd_enable=${courier_imap_imapd_enable-"NO"}
と書いてあり,どうやら /etc/rc.conf に courier_imap_imapd_enable の内容を記述すれば良さそうだということが推測できる.
同様に他2つのスクリプトファイルにも記述があり,これらを総合すると /etc/rc.conf に
  # for IMAP
  courier_authdaemond_enable="YES"
  courier_imap_imapd_enable="YES"
  courier_imap_imapd_ssl_enable="YES"
などと書き込むのが良さそうだということが推測できる. そこでこれを書き込み,念の為にリブートしておこう((変にスペースを入れたりしないように)).

** IMAP 用のユーザ情報の登録 [#y88b0d6e]

今回は userdb でパスワード照合を行うようにインストールしたので, IMAP 用にユーザ情報を登録しておかないといけない.
具体的には次の順番で作業を行えばよい.

+ まず空のディレクトリ /usr/local/etc/userdb を作成する.
    cd /usr/local/etc
    mkdir userdb
    chmod 700 ./userdb
などとすればよい.
+ (パスワード以外の)ユーザ情報を登録する
-- /etc/passwd から作る方法
既にシステムのユーザでもあるならば簡単でおすすめ.
pw2userdb コマンドを用いて
  cd /usr/local/etc/userdb/
  pw2userdb | grep ユーザ名 >> ./users
とすればよい.
--  零から作る方法.
userdb コマンドで直接いろいろ指定する方法. ちょい面倒.
  userdb "john@example.com" set home=/home/vmail \
  mail=/home/vmail/Maildir-john-example  uid=UUU gid=GGG"
などとする方法. 
+ パスワードを設定する.
  cd /usr/local/etc/userdb
  userdbpw -hmac-md5|userdb users/ユーザ名 set hmac-md5pw
とすればよい. この hmac-md5 というのが CRAM-MD5 で利用される.
うまくいっているかどうか,users ファイルを読んで確認しておこう.
+ 追加,変更箇所を有効にする.
  makeuserdb
とすればよい.

ではここで上の手順にしたがって IMAP 用のユーザ情報を登録しておこう.

** courier-imap の動作確認 [#c34258bd]

SMTP Auth の時と同様に,2つの文字端末エミュレータを用意して動作確認を行う.

ただし,動作確認でもたついていると courier-imap サーバが接続を切ってしまうので,これに余裕を持たせておきたい.
そのための準備を先にしておこう. 具体的には,/usr/local/etc/courier-imap/imapd ファイルの
  IMAP_IDLE_TIMEOUT=60
という部分が「60秒反応がなければ切断」という意味なので,この 60 を適当に増やしておけばよい.
例えば 180 ぐらいにすれば問題ないだろう.

なお,このファイルを編集したら courier-imap サーバを一旦停めて再度動かさないといけないのでそうしておこう. 
具体的には
  /usr/local/etc/rc.d/courier-imap-imapd.sh stop
  /usr/local/etc/rc.d/courier-imap-imapd.sh start
としておけばよい.

さて,では SMTP Auth の時と同じようにやってみる.
''Shell-A'' で,telnet localhost 143 とすると
  Connected to localhost.
  Escape character is '^]'.
  * OK [CAPABILITY IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA AUTH=CRAM-MD5 AUTH=CRAM-SHA1 AUTH=CRAM-SHA256 IDLE ACL ACL2=UNION STARTTLS] Courier-IMAP ready. Copyright 1998-2005 Double Precision, Inc.  See COPYING for distribution information.
などと言ってくる. ここで,
  a authenticate cram-md5
と入力すると
  + PG5hbmlrYS1pbWFwQHNlcnZlcj4=
などとサーバから文字列が送られてくる.

この文字列 ''PG5hbmlrYS1pbWFwQHNlcnZlcj4='' に対して,先ほどと同様に ''Shell-B''で userdb-test-cram-md5 コマンドを使って返答用文字列を作る.
例えば次のようになるだろう.
  Username? testuser ← IMAP 用に登録したユーザ名
  Password? password ← IMAP 用に登録したパスワード
  Send: AUTH CRAM-MD5 (or for imap, A AUTHENTICATE CRAM-MD5)
  Paste the challenge here:
  + PG5hbmlrYS1pbWFwQHNlcnZlcj4= ← 今の文字列
  Send this response:
  dGVzdHVzZXIgYjlkMDA5MzQ4YmVjMzlkNzcwMWU4MWRiZWE3NmZhN2M=
この最後の文字列 ''dGVzdHVzZXIgYjlkMDA5MzQ4YmVjMzlkNzcwMWU4MWRiZWE3NmZhN2M='' が IMAP サーバに出すべき返事になるので,これを ''Shell-A'' での作業の続きに張り付けて返答とする.

そして
  a OK LOGIN Ok.
となれば,IMAP サーバの認証が通ったということになり,動作が確認できたことになる((ここでは ^] としてから quit とすれば抜けられる)).

なお,POP サーバを立ち上げたならば同様にテストが可能である.
その際は
  telnet localhost 110
  (サーバからの応答)
  capa
  (サーバからの応答)
  auth cram-md5
  (サーバから文字列を送ってくる)
  (それに対応して返答用文字列を用意して…)
  返答用文字列張り付け
という流れになる.  

*** 実習 [#xc95fa94]
ここまでの作業を行おう.
また,余裕があれば適当な MUA で IMAP サーバに接続してみよう.
さらに余裕があれば,IMAP over TLS/SSL 設定でサーバに接続してみよう.

* レポート [#p1151247]
途中で「調べよ」と指示された事項について調査を行い,報告せよ.
また,ここまでの実習を行い,報告せよ.