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

Top / 授業資料 / 第09回

#contents

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

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

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

* SMTP Auth を使う [#add75714]

** SMTP Auth の設定(postfix, cyrus sasl2) [#taefe69c]

より自由に MTA を使うために SMTP Auth を利用することを想定しよう.
さて,まずは postfix をインストールしたときのログにある smtp auth に関するメッセージを再チェックだ.
該当部分を再掲すると,

>    You can use sasldb2 for authentication, to add users use:
> &br;
>    saslpasswd2 -c username
> &br;
>    If you want to enable SMTP AUTH with the system Sendmail, read
>    Sendmail.README
> &br;
>    NOTE: This port has been compiled with a default pwcheck_method of
>    auxprop. If you want to authenticate your user by /etc/passwd,
>    PAM or LDAP, install ports/security/cyrus-sasl2-saslauthd and
>    set sasl_pwcheck_method to saslauthd after installing the
>    Cyrus-IMAPd 2.X port. You should also check the
>    /usr/local/lib/sasl2/*.conf files for the correct
>    pwcheck_method.

となっており,たいしたことは書いていない.
- smtp auth をつかうならば,ユーザパスワードを saslpasswd2 コマンドで追加せよ
- この port はパスワード照合として pwcheck_method (専用ファイルによる照合)機能を提供するが,他の照合方法を使いたければそれに対応する port もインストールせよ…

ということがわずかにわかるのみである((念の為に saslpasswd2 コマンドのマニュアルを見ると,他に sasldblistusers2 というコマンドがある,ということが他に分かるぐらいか.)).

さて,これだけではどうやって使ってよいかわからないので,情報をきちんと調べよう.
まずは一次情報源ということで,本家 http://www.postfix.org/ で確認したい.
Documentation を見ると,該当しそうなものがすぐ見つかる.

具体的には http://www.postfix.org/SASL_README.html をチェックすることになる. 
すると,まずは次のように書いてあるところが参考になる.

>  Enabling SASL authentication in the Postfix SMTP server
>  &br;
>  In order to enable SASL support in the Postfix SMTP server:
>  &br;
>      /etc/postfix/main.cf:
>          smtpd_sasl_auth_enable = yes
>  &br;
>  In order to allow mail relaying by authenticated remote SMTP clients:
>  &br;
>      /etc/postfix/main.cf:
>          smtpd_recipient_restrictions = 
>                    permit_mynetworks 
>                    permit_sasl_authenticated 
>                    reject_unauth_destination
>  &br;
>  To report SASL login names in Received: message headers (Postfix version 2.3 and later):
>  &br;
>      /etc/postfix/main.cf:
>          smtpd_sasl_authenticated_header = yes
>  &br;
>  Note: the SASL login names will be shared with the entire world.
>  &br;
>  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:
>  &br;
>      /etc/postfix/main.cf:
>          broken_sasl_auth_clients = yes

これを読むと,postfix の設定ファイルである main.cf を書き換えるだけでよいようだ,ということがまずわかる.
大ざっぱには
- SASL を使いたければ,こうしろ.
- 認証されたリモートクライアントによるメールリレーを許可したければ,こうしろ.
- メールのやりとりのヘッダに SASLユーザ名を載せたければ,こうしろ.
- Microsoft の古いメーラには認証プロトコルの文法の一部がおかしいものがあるがこれを許してやりたければ,こうしろ.

という4つのことが書いてある.
どれも特に異論はない内容なので,そのまま従ってよいだろう.

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

さらに上記資料を読み進むと, "Cyrus SASL configuration for the Postfix SMTP server" で始まる部分も関係しているので読もう. 
ただし,postfix (ver.2.5.5,1)や cyrus sasl (ver. 2.1.22_2)のバージョンによって場合わけがされているので,関係する部分だけを抜き出して適宜抜粋すると以下のようになる.

まず,
>  Cyrus SASL configuration for the Postfix SMTP server
> &br;
>  You need to configure how the Cyrus SASL library should authenticate a remote SMTP client's username and password. These settings must be stored in a separate configuration file.
> &br;
>  The name of the configuration file (default: smtpd.conf) will be constructed from a value that the Postfix SMTP server sends to the Cyrus SASL library, which adds the suffix .conf. The value is configured using one of the following variables:
> &br;
>      /etc/postfix/main.cf:
>          smtpd_sasl_path = smtpd
> &br;
>  Cyrus SASL searches for the configuration file in /usr/local/lib/sasl2/.
> &br;
>  Note: some Postfix distributions are modified and look for the smtpd.conf file in /etc/postfix/sasl.
> &br;
>  Note: some Cyrus SASL distributions look for the smtpd.conf file in /etc/sasl2.

ということで,cyrus sasl2 の設定ファイルは /usr/local/lib/sasl2/smtpd.conf で,また,その設定ファイルを有効にするために postfix の設定ファイルに1行書きこんでおく必要がありそうだ.
&ref(./notes.png); まずは上の指示に従って postfix の設定ファイル main.cf に1行書きこもう.

それから,パスワード照合方法の選択についてが次に続いて書かれている.
>      *  To authenticate against the UNIX password database, use: &color(blue){← ログインパスワードを認証に使う場合. 今回は違うので略.};
> &br;
>      *  To authenticate against Cyrus SASL's own password database: &color(blue){← 専用ファイルを使う場合. 今回はこれを使おう.};
> &br;
>  /usr/local/lib/sasl2/smtpd.conf:
>      pwcheck_method: auxprop
>      auxprop_plugin: sasldb
>      mech_list: PLAIN LOGIN CRAM-MD5 DIGEST-MD5

&ref(./notes.png); とあるので,上のように smptd.conf を編集しよう(たぶん新規作成することになる).
&ref(./warning.png); mech_list を除いて実はこれはデフォルトのようなので,smtpd.conf 無しでも一応これからの作業は可能だが,やはりきちんと作っておこう.

それから続けて,

>        This will use the Cyrus SASL password file (default: /etc/sasldb2), which is maintained with the saslpasswd or saslpasswd2 command (part of the Cyrus SASL software). On some poorly-supported systems the saslpasswd command needs to be run multiple times before it stops complaining. The Postfix SMTP server needs read access to the sasldb file - you may have to play games with group access permissions. With the OTP authentication mechanism, the Postfix SMTP server also needs WRITE access to /etc/sasldb2 or /etc/sasldb (or the back end SQL database, if used).
> &br;
>        IMPORTANT: To get sasldb running, make sure that you set the SASL domain (realm) to a fully qualified domain name.
> &br;
>        EXAMPLE:
> &br;
>            % saslpasswd2 -c -u `postconf -h myhostname` exampleuser
> &br;
>        You can find out SASL's idea about the realms of the users in sasldb with sasldblistusers2.

とあり,ユーザのパスワードを登録する際に realm(パスワードの認証有効状況領域とでもいうか)をきちんとこうやって指定しろ,という話などがある.

&ref(./notes.png); 上の指示に従いつつ,smtp auth 用のユーザパスワード登録をしよう(最後の "exampleuser" というのはユーザ名に置き換えて).

&ref(./notes.png); きちんと登録されたか,sasldblistusers2 というコマンドで確認しよう.
>  &color(blue){登録したユーザ名};@&color(blue){ホスト名}; userPassword

という出力が出れば,登録されていることが確認できたということになる.

次に,
>        On the Postfix side, you can have only one realm per smtpd(8) instance, and only the users belonging to that realm would be able to authenticate. The Postfix variable smtpd_sasl_local_domain controls the realm used by smtpd(8):
> &br;
>            /etc/postfix/main.cf:
>                smtpd_sasl_local_domain = $myhostname

とあるので,realm に関する postfix の設定もまた必要だ.
&ref(./notes.png); 上の指示に従って postfix の設定ファイル main.cf に1行書きこもう.

あとは,次のような注意がある.

>  IMPORTANT: The Cyrus SASL password verification services pwcheck and saslauthd can only support the plaintext mechanisms PLAIN or LOGIN. However, the Cyrus SASL library doesn't know this, and will happily advertise other authentication mechanisms that the SASL library implements, such as DIGEST-MD5. As a result, if a remote SMTP client chooses any mechanism other than PLAIN or LOGIN while pwcheck or saslauthd are used, authentication will fail. Thus you may need to limit the list of mechanisms advertised by the Postfix SMTP server.
> &br;
>      *  With Cyrus SASL version 2.1.x or later the mech_list variable can specify a list of authentication mechanisms that Cyrus SASL may offer:
> &br;
>            /usr/local/lib/sasl2/smtpd.conf:
>                mech_list: plain login
> &br;
>  For the same reasons you might want to limit the list of plugins used for authentication.
> &br;
>            /usr/local/lib/sasl2/smtpd.conf:
>                pwcheck_method: auxprop
>                auxprop_plugin: sql

これはパスワードの伝達方法と照合方法との組み合わせのうち,使えないものがあるのでそれでトラブらないように使わない組み合わせを設定ファイルできちんと外しておけ,似たようなことをしたければこうしろ,という内容だ. 今回は特に関係ない.

そして最後に
>  To run software chrooted with SASL support is an interesting exercise. It probably is not worth the trouble. 

とある. まあ言っているとおり,たぶん割にあわないだろうから今回は関係なしとしておこう.
&ref(./warning.png); FreeBSD には chroot よりも進化した機能である jail がある. chroot, jail について知らない人は調べておくとよいだろう.

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

*** 準備 [#w9d117cd]

後で用いるコマンド mmencode を,今のうちにインストールしておこう.
具体的には,いつものように ports コレクションを新しくしておいてから,portinstall
するという手順なので,

  portsnap fetch
  portsnap update
  portinstall mmencode

とすればよい.


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

SMTP Auth で接続する際の認証方法にもいくつかあり,自由に設定で選ぶことができる.
今回のインストールでは上で設定したように login認証, plain認証,Digest-MD5認証, CRAM-MD5認証 が使えるようになっているはずだ.
(デフォルトではさらに NTLM認証と GSSAPI認証が使えるようになるようだ)

そこで,このうちの plain認証と CRAM-MD5認証を試してみよう.
ちなみに,plain認証は簡単に利用できるが暗号化されていないもので,CRAM-MD5認証はその逆と思えばよい.


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

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

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

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

&ref(./notes.png); あとはいつものように telnet localhost 25 で自前の MTA に接続してみる. 
前にもやったように "EHLO localhost" として応答を進めると,次のように SMTP AUTH ができるよという表示込みで応答が進むはずだ(250-AUTH で始まるほぼ同じ行が二回出てくるのが Microsoft の MUA 対策である).

>  250-&color(blue){ホスト名};
>  250-PIPELINING
>  250-SIZE 10240000
>  250-VRFY
>  250-ETRN
>  250-AUTH LOGIN PLAIN DIGEST-MD5 CRAM-MD5
>  250-AUTH=LOGIN PLAIN DIGEST-MD5 CRAM-MD5
>  250-ENHANCEDSTATUSCODES
>  250-8BITMIME
>  250 DSN

この段階で SMTP Auth の Plain 認証を試してみよう.
具体的には,ここで
>  AUTH PLAIN 先ほどbase64エンコードして作った文字列

と入力すればよい. Plain 認証はこれだけで済む.
そして
>  235 2.7.0 Authentication successful

などと "success" の意がメッセージで返ってくれば,認証が通ったということで OK である.
あとは前と同様に ^], quit で抜けよう.

うまくいかない人は丁寧にこれまでの作業を振り返ろう.

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

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

ややこしいが,実は CRAM-MD5 をテストするためのスクリプト "userdb-test-cram-md5" が存在するので,これをインストールして用いればよい.
ただし,このスクリプトは後述の courier-imap のインストールによってインストールされるので,その作業をしてから戻ってこないといけない.
&ref(./warning.png); というわけで,''初めてここを読む場合は,後述の courier-imap のインストールまでジャンプし,インストールした後に戻ってくること''. ただし,courier-imap の設定はしないで戻ってきてよい.

以下の作業にはコンソールが二つ以上あった方が便利なので,X で適当な文字端末エミュレータを二つ起動するなど,工夫して作業しよう.
状況を分かりやすくするために,これから各々のエミュレータで動く二つのシェルを各々 Shell-A, Shell-B として書いておこう.
コンソールが1つしか用意できない場合でも,マウス操作でコピー(左クリックで選択) and ペースト(真ん中クリック)が可能な場合が多いので,マウス操作を試みてみるとよい.

以降,状況を分かりやすくするために 2つの文字端末エミュレータを用意した状況を想定し,その各々の端末上で動くシェルを各々 Shell-A, Shell-B として話を進めよう.

&ref(./notes.png); まず,''Shell-A'' で telnet localhost 25 して,EHLO localhost と対応して先と同じように

>  250-&color(blue){ホスト名};
>  250-PIPELINING
>  250-SIZE 10240000
>  250-VRFY
>  250-ETRN
>  250-AUTH LOGIN PLAIN DIGEST-MD5 CRAM-MD5
>  250-AUTH=LOGIN PLAIN 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   &color(blue){← (SMTP Auth に使う)ユーザ名を入力する};
>  Password?  password  &color(blue){← (SMTP Auth に使う)パスワードを入力する};
>  Send: AUTH CRAM-MD5 (or for imap, A AUTHENTICATE CRAM-MD5)
>  Paste the challenge here:
>  + PG5hbmlrYW5vLXNlcnZlcj4= &color(blue){← Shell-A でサーバが送ってきた文字列を入力する};
>  Send this response:
>  dGVzdHVzZXIgY2NiNjc4YmZjZGY1YWRlMGUyYmE2MmM3ODA3OTA1NGI=  &color(blue){← 返すべき文字列が出力される};

となり,最後に返答すべき文字列を生成してくれる. 

そこでこの文字列(この例の場合は ''dGVzdHVzZXIgY2NiNjc4YmZjZGY1YWRlMGUyYmE2MmM3ODA3OTA1NGI='')をさっきの ''Shell-A での作業の続きに'' 入力する. 
認証が通ればこのあと
>  235 2.7.0 Authentication successful

などと "success" の意がメッセージで返ってくれば,認証が通ったということで OK である.
あとは前と同様に ^], quit で抜けよう.

うまくいかない人は丁寧にこれまでの作業を振り返ろう.


* SMTP over TLS を使う [#f5d400a5]

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

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

今回は鍵と証明書を新たに作って(やり方は Web サーバの授業の回の TLS/SSL の項目に書いてある) /usr/local/etc/postfix に置くことにしよう. そしてファイル名を例えば(鍵) postfix.key, (証明書) postfix.crt としておく.
ただし,このファイルが他の人に読めてしまうと困るので,作った後すぐに chmod で読み出し権限の設定をしないといけない.
&ref(./notes.png); 以下,その作業を行おう.

  cd /usr/local/etc/postfix
  openssl genrsa -out postfix.key 1024
  openssl req -new -x509 -days 365 -key postfix.key -out postfix.crt

証明書作成時に聞かれる質問の応答については以前と同じでよいだろう. 
こうして証明書等が作成できたら,すぐさま

  chmod 400 postfix.key
  chmod 400 postfix.crt

としておこう.

さて,Postfix の設定は,本家のドキュメント(http://www.postfix.org/TLS_README.html)を読んで自分なりに取捨選択することになる.
サーバかクライアントかや認証をどうするかなど多少ややこしくてよくわからないかと思うので,今回は設定を書いてしまおう.
&ref(./notes.png); 今回は, /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_loglevel = 1
>  smtpd_tls_received_header = yes
>  smtpd_tls_security_level = may
>  &br;
>  smtp_tls_loglevel = 1
>  smtp_tls_security_level = may
>  smtp_tls_note_starttls_offer = yes

などと加えれば良い.
ただし,これは経路の暗号化だけでよい,という設定なので,認証まできちんとしたい人はドキュメントをきちんと読もう.
&ref(./warning.png); Postfix の設定方法が近年変わったため,web 上で参照できる設定の多くは既に古く,あまり推奨できないので留意すること.

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

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

&ref(./notes.png); telnet localhost 25 で確認してみよう.
これまでと同様に EHLO localhost して, 応答が

>  250-&color(blue){ホスト名};
>  250-SIZE 10240000
>  250-VRFY
>  250-ETRN
>  250-STARTTLS  &color(blue){← この対応が TLS/SSL 用のもの};
>  250-AUTH LOGIN PLAIN DIGEST-MD5 CRAM-MD5
>  250-AUTH=LOGIN PLAIN DIGEST-MD5 CRAM-MD5
>  250-ENHANCEDSTATUSCODES
>  250-8BITMIME
>  250 DSN

などとなる.
上のように "250-STARTTLS" という部分があれば,とりあえず TLS 対応の動作をしていることがわかる.
あとは前と同様に ^], quit で抜けよう.

これが出ないようなら何かおかしいのでこれまでの作業を振り返ろう.

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

というわけでいつものように swaks をインストールしよう.

  portinstall swaks

とすればよい. インストール時にオプション選択画面
&ref(./swaks-install.png);  
が出たら,少なくとも "MX lookup support" と "TLS support" とを ON にしておいてからインストールしよう.
NTLM は今回は関係ないので外したままでよいだろう.
先へ進むと,自動的に入る p5-Net-SSLeay のインストール時にテストをするかどうか聞かれることがあるが,これは "n" のままで構わない.
あとはインストールが終わるのをまとう.

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

&ref(./notes.png); まずは単に MTA が動作しているかの確認をしよう.
  swaks --server localhost
とすると,テストメールの宛先を聞いてくるので, 自分のアカウント名を答えよう. すると
>  === Trying localhost:25...
>  === Connected to localhost.
>  <-  220 &color(blue){ホスト名}; ESMTP Postfix
>   -> EHLO freebsd7
>  <-  250-&color(blue){ホスト名};
>  <-  250-PIPELINING
>  <-  250-SIZE 10240000
>  <-  250-VRFY
>  <-  250-ETRN
>  <-  250-STARTTLS
>  <-  250-AUTH LOGIN PLAIN DIGEST-MD5 CRAM-MD5
>  <-  250-AUTH=LOGIN PLAIN DIGEST-MD5 CRAM-MD5
>  <-  250-ENHANCEDSTATUSCODES
>  <-  250-8BITMIME
>  <-  250 DSN
>   -> MAIL FROM:<&color(blue){差出人};>
>  <-  250 2.1.0 Ok
>   -> RCPT TO:<&color(blue){宛先ユーザ名};>
>  <-  250 2.1.5 Ok
>   -> DATA
>  <-  354 End data with <CR><LF>.<CR><LF>
>   -> Date: Tue, 16 Dec 2008 20:17:54 +0900
>   -> To: &color(blue){宛先ユーザ名};
>   -> From: &color(blue){差出人};
>   -> Subject: test Tue, 16 Dec 2008 20:17:54 +0900
>   -> X-Mailer: swaks v20061116.0 jetmore.org/john/code/#swaks
>   ->
>   -> This is a test mailing
>   ->
>   -> .
>  <-  250 2.0.0 Ok: queued as B56D41D19C
>   -> QUIT
>  <-  221 2.0.0 Bye
>  === Connection closed with remote host.

と MTA とやり取りして,その途中経過をきちんと出力してくれる. 
いまはテストメールを実際に送ったはずなので,アカウントのホームディレクトリの Maildir/new にメールが届いているはずである. 確認してみよう.

次に,SMTP Auth の plain認証を試してみよう. 
ただし,いちいちメールが届く必要ももうないので,動作確認のみでメールは送らないようにしよう. 
それには次のようにすればよい.
  swaks --auth PLAIN --server localhost --quit RCPT
すると最初に(実際には送らないが)テストメールの宛先を聞いてきて,その後に SMTP  Auth の認証に必要なユーザ名とパスワードを聞いてくるので答えよう.  
そして,その後のやりとりの途中に
> …略…
>   -> AUTH PLAIN &color(blue){パスワードをbase64化したもの};
>  <-  235 2.7.0 Authentication successful
> …略…

というように Auth plain での SMTP Auth がうまくいった,ということが確認できれば OK だ.

次に SMTP Auth の CRAM-MD5 認証を試してみる. それには
  swaks --auth CRAM-MD5 --server localhost --quit RCPT
とすればよい. 入力は上と同様だ.
そして,その後のやりとりの途中に
> …略…
>   -> AUTH CRAM-MD5
>  <-  334 PDI3NTg4NzIyNTMuNDY4OTgzOUBGcmVlQlNENy5jYXMuY21jLm9zYWthLXUuYWMuanA+
>   -> cGFvb24gMTgyODJmNzRhNjZhOWMwY2FjN2YzZTliNDQ2NzQ3Y2Y=
>  <-  235 2.7.0 Authentication successful
> …略…

というように Auth CRAM-MD5 での SMTP Auth がうまくいった,ということが確認できれば OK だ.

さて,やっと肝心の SMTP over TLS をテストしよう. といってもここまでくればテストはもう簡単で,
  swaks -tls --server localhost
とすればよい. ただし,念の為にテストメールを実際に送ろうとしている.
これを実行して,swaks の出力が
> …略…
>   -> STARTTLS
>  <-  220 2.0.0 Ready to start TLS
>  === TLS started w/ cipher DHE-RSA-AES256-SHA
> …略…

というように TLS を使って無事に動いているようならば大丈夫だ.
もちろん, Maildir/new に実際にメールが届いているかもチェックし,そのメールのヘッダ部分に
> (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits))

という記述があることも確認しておこう.

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

// *** 実習 [#sc008a67]
// SMTP over TLS/SSL には上記の StartTLS の他にもうひとつ SMTPS と呼ばれるものがあり,今回も設定次第ではそれを動かすことができる.
// では,SMTPS とは何か,StartTLS と比べての利点/欠点は何か調べよ.

&ref(./notes.png); さらに余力があるようだったら何か手元の MUA で starttls に対応するように設定して動作確認してみよ.

* IMAP/POP を使う [#j1bf60e2]

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

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

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

&ref(./notes.png); さて,いつものように ports コレクションからインストールしよう.
ただし,imap サーバのインストールの前に courier-authlib(courier-imap の認証関係だけ抜き出したmeta ports) のインストールを行っておく(そうしないと実質的に使えない).
いつものように

  portsnap fetch  
  portsnap update
  portinstall courier-authlib

とする. 必要な他のツールも一緒にインストールされるので,しばらく待とう.
また courier-authlib のインストールの段階で出るオプション画面
&ref(./courierauth-install.png);
ではとりあえず "Userdb support" を選んでおこう. あとはスムーズに進むだろう.


次に

  portinstall courier-imap

として courier-imap 本体をインストールする. 最初にオプション選択画面
&ref(courierimap-install.png);
が出るが,多分デフォルトで IPv6 が選ばれているだろう.
IPv6 は使わないので外し,逆に先と同様に "Userdb support" を選択して先に進もう.
しばらく待っているとインストールが終わるだろう.

さて,念の為にいつものように今回インストールされた複数のソフトのログを /var/log/ports の下から探してみて,メッセージを抜き出すと,

(security::courier-authlib-base.log から)
>  configure: WARNING: -----------------------------------------------------
>  configure: WARNING: expect not found - will not be able to change passwds
>  configure: WARNING: in webmail
>  configure: WARNING: -----------------------------------------------------

>  Added group "courier".
>  Added user "courier".

>        This port has installed the following files which may act as network
>        servers and may therefore pose a remote security risk to the system.
>  /usr/local/libexec/courier-authlib/authdaemond
>  &br;
>        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-authdaemond
>  &br;
>        If there are vulnerabilities in these programs there may be a security
>        risk to the system. FreeBSD makes no guarantee about the security of
>        ports included in the Ports Collection. Please type 'make deinstall'
>        to deinstall the port if this is a concern.
>  &br;
>        For more information, and contact details about the security
>        status of this software, see the following webpage:
>  http://www.Courier-MTA.org/authlib/


(mail::courier-imap.log から)
>  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
>  &br;
>  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.


>        This port has installed the following files which may act as network
>        servers and may therefore pose a remote security risk to the system.
>  /usr/local/libexec/courier-imap/couriertcpd
>  /usr/local/bin/couriertls
>  &br;
>        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-imapd
>  /usr/local/etc/rc.d/courier-imap-pop3d
>  /usr/local/etc/rc.d/courier-imap-pop3d-ssl
>  /usr/local/etc/rc.d/courier-imap-imapd-ssl
>  &br;
>        If there are vulnerabilities in these programs there may be a security
>        risk to the system. FreeBSD makes no guarantee about the security of
>        ports included in the Ports Collection. Please type 'make deinstall'
>        to deinstall the port if this is a concern.
>  &br;
>        For more information, and contact details about the security
>        status of this software, see the following webpage:
>  http://www.courier-mta.org/imap/

というメッセージが見つかる.

前者のログファイルの内容は特に問題ない.
後者は設定に関わる部分があるので重要だ(詳しくは後述する). 

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

&ref(./warning.png); SMTP Auth の途中から courier-imap のインストールへ飛べ,と言われてここへ来た場合は,元のところへ戻ろう.

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

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

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

&ref(./notes.png); 次に,over TLS/SSL で使う自己認証証明書(courier-imap はこれを要する)を作る.
先に作った鍵と証明書とは違う機能のものなので,新たに作ろう(変換も可能とは思うが).

方法は簡単で,まず /usr/local/etc/courier-imap にサンプルとしておいてあるimapd.cnf.dist と pop3d.cnf.dist をコピーして  imapd.cnf と pop3d.cnf というファイルを作り,中をみて [ req_dn ] 以下の部分を自分のサーバにあわせて適切に編集する.
具体的には
  cd /usr/local/etc/courier-imap
  cp imapd.cnf.dist imapd.cnf
  cp pop3d.cnf.dist pop3d.cnf
  chmod u+w *.cnf
  emacs imapd.cnf
  emacs pop3d.cnf

という感じだ. それから,
  cd /usr/local/share/courier-imap/
  ./mkimapdcert
  ./mkpop3dcert

とすると,/usr/local/share/courier-imap/ に imapd.pem, pop3d.pem という自己認証証明書ができる.
ファイル名も場所も特に変更を要しないので,これで証明書の作成はおわり.

次に,IMAP 本体の設定を行おう. 
&ref(./warning.png);いつものように念の為バックアップをとってから.
/usr/local/etc/courier-imap の imapd というファイルを編集して,項目の "IMAP_CAPABILITY" と "IMAP_CAPABILITY_TLS" を認証ありに修正する.
具体的には,

>  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
>  …略…

とあるので,実際はこれらのスクリプトが起動操作を行うのだということはわかる.
そして念の為に /usr/local/etc/rc.d ディレクトリを覗いてみると,これらは確かにあり,かつ,他に courier-authdaemond というファイルもあり, これも同様の役割を担うことが推測できる.

そこでこれらのファイルのうち,IMAP サーバの起動に関連しそうなスクリプト "courier-authdaemond", "courier-imap-imapd", "courier-imap-imapd-ssl" の3つを直に読んでみよう.
すると,例えば courier-imap-imapd には

>  # 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
>  &br;
>  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"

などと書き込むのが良さそうだということが推測できる. 

&ref(./notes.png); 上のように書き込み,念の為にリブートしておこう.
その後,lsof などを用いて imapd が動いていることを確認しよう. 例えば
  lsof -i4 | grep -i imap
として出力をみる,などである.

imapd が動いていないようならばもう一度設定を見直そう.

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

今回は userdb でパスワード照合を行うようにインストールしたので, IMAP 用にユーザ情報を登録しておかないといけない.
&ref(./notes.png);
具体的には次の順番で作業を行えばよい.
より詳しく知りたい者は,http://www.courier-mta.org/FAQ.html などを参照のこと.

+ まず空のディレクトリ /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 用のユーザ情報を登録しておこう.

&ref(./warning.png); この手順はいかにも面倒だし,間違えやすそうで心配だ.
そこで,実際に courier-imap を使う場合には ports から courierpasswd をインストールしてこれを使用した方がよいだろう.

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

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

ただし,動作確認でもたついていると courier-imap サーバが接続を切ってしまうので,これに余裕を持たせておきたい.
&ref(./notes.png); そのための準備を先にしておこう. 具体的には,/usr/local/etc/courier-imap/imapd ファイルの
>  IMAP_IDLE_TIMEOUT=60

という部分が「60秒反応がなければ切断」という意味なので,この 60 を適当に増やしておけばよい.
例えば 180 ぐらいにすれば問題ないだろう.

なお,このファイルを編集したら courier-imap サーバを一旦停めて再度動かさないといけないのでそうしておこう. 
具体的には

  /usr/local/etc/rc.d/courier-imap-imapd stop
  /usr/local/etc/rc.d/courier-imap-imapd start

としておけばよい.

&ref(./notes.png); さて,では SMTP Auth の時と同じようにテストしてみよう.
''Shell-A'' で,telnet localhost 143 とすると

>  Trying 127.0.0.1...
>  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-2008 Double Precision, Inc.  See COPYING for distribution information.

などと言ってくる. ここで,
>  a authenticate cram-md5

と入力すると
>  + PG5hbmlrYS1pbWFwQHNlcnZlcj4=

などとサーバから文字列が送られてくる.

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

この最後の文字列 ''dGVzdHVzZXIgYjlkMDA5MzQ4YmVjMzlkNzcwMWU4MWRiZWE3NmZhN2M='' が IMAP サーバに出すべき返事になるので,これを ''Shell-A'' での作業の続きに張り付けて返答とする.

そして
>  a OK LOGIN Ok.

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

なお,POP サーバを立ち上げたならば同様にテストが可能である.
その際は
  telnet localhost 110
とすると,
>  Trying 127.0.0.1...
>  Connected to localhost.
>  Escape character is '^]'.
>  +OK Hello there.

となるので,ここで
>  capa 

と入力すると
> SASL CRAM-MD5 CRAM-SHA
> STLS
> TOP
> USER
> LOGIN-DELAY 10
> PIPELINING
> UIDL
> IMPLEMENTATION Courier Mail Server
> .

と応答が返ってくる.
ここで
>  auth cram-md5

と入力すると
>  + PG5hbmlrYS1pbWFwQHNlcnZlcj4=

などとサーバから文字列が送られてくるので,
これに userdb-test-cram-md5 コマンドで返答用文字列を作成して張り付けると
> +OK logged in.

と認証されるという流れになる.  

&ref(./notes.png); 余裕があれば適当な MUA で IMAP サーバに接続してみよう.
さらに余裕があれば,IMAP over TLS/SSL 設定でサーバに接続してみよう.

* レポート [#z0eef47b]
途中で「調べよ」と指示された事項について調査を行い,報告せよ.
また,本日行った作業について報告せよ.
もちろん各自の

+ 所属(学部,学科)
+ 学籍番号
+ 学年
+ 氏名
+ 日時
+ 肝心のレポート内容(得た知見,作業について気づいたこと等)

を書くのを忘れないように. 

*** about Icons [#v3d7ae04]
Some icons in this page are downloadable at [[ICONFINDER:http://www.iconfinder.net/]].
The "note" icon designed by [[Marco Martin:http://www.notmart.org/]] is distributed with the LGPL licence
and the "warning" icon designed by [[Alexandre Moore:http://nuovext.pwsp.net/]] with the GPL licence.