前回から続くFDSとDovecotを使ったPOP3/
パスワード検索と認証バインド
とりあえず前回の設定でPOP3/
先ほどの例では、
実際の挙動をLDAPサーバのログから追ってみます。以下はPOP3サーバにログイン、
# dovecotを起動すると、早速検索用のDNでバインドが行われ、以後の検索のため待機する
[14/Oct/2008:11:59:16 +0900] conn=26 fd=64 slot=64 connection from 127.0.0.1 to 127.0.0.1
[14/Oct/2008:11:59:16 +0900] conn=26 op=0 BIND dn="cn=Directory Manager" method=128 version=2
[14/Oct/2008:11:59:16 +0900] conn=26 op=0 RESULT err=0 tag=97 nentries=0 etime=0 dn="cn=directory manager"
# POP3セッションでユーザ名、パスワードが入力されたため、エントリが存在するか検索し、パスワードを照合
[14/Oct/2008:11:59:19 +0900] conn=26 op=1 SRCH base="ou=Mail,dc=bluecoara,dc=net" scope=2 filter="([email protected])" attrs="userPassword"
[14/Oct/2008:11:59:19 +0900] conn=26 op=1 RESULT err=0 tag=101 nentries=1 etime=0
# メールボックスの存在するホームディレクトリ属性を取得
[14/Oct/2008:11:59:19 +0900] conn=26 op=2 SRCH base="ou=Mail,dc=bluecoara,dc=net" scope=2 filter="([email protected])" attrs="mailMessageStore"
[14/Oct/2008:11:59:19 +0900] conn=26 op=2 RESULT err=0 tag=101 nentries=1 etime=0
# dovecotを終了すると検索用DNがアンバインドされる
[14/Oct/2008:11:59:21 +0900] conn=26 op=3 UNBIND
[14/Oct/2008:11:59:21 +0900] conn=26 op=3 fd=64 closed - U1
# POP3セッションでユーザ名とパスワードが入力されたら、ユーザの有無を確認
[14/Oct/2008:11:58:53 +0900] conn=21 op=1 SRCH base="ou=Mail,dc=bluecoara,dc=net" scope=2 filter="([email protected])" attrs=ALL
[14/Oct/2008:11:58:53 +0900] conn=21 op=1 RESULT err=0 tag=101 nentries=1 etime=0
# POP3セッション時のユーザ名、パスワードを使ってディレクトリサーバにバインドできるか確認
[14/Oct/2008:11:58:53 +0900] conn=21 op=2 BIND dn="uid=HNAKAMITSU,ou=Mail,dc=bluecoara,dc=net" method=128 version=2
[14/Oct/2008:11:58:53 +0900] conn=21 op=2 RESULT err=0 tag=97 nentries=0 etime=0 dn="uid=hnakamitsu,ou=mail,dc=bluecoara,dc=net"
[14/Oct/2008:11:58:53 +0900] conn=21 op=3 BIND dn="" method=128 version=2
[14/Oct/2008:11:58:53 +0900] conn=21 op=3 RESULT err=0 tag=97 nentries=0 etime=0 dn=""
# メールボックスの存在するホームディレクトリ属性を取得
[14/Oct/2008:11:58:53 +0900] conn=21 op=4 SRCH base="ou=Mail,dc=bluecoara,dc=net" scope=2 filter="([email protected])" attrs="mailMessageStore"
[14/Oct/2008:11:58:53 +0900] conn=21 op=4 RESULT err=0 tag=101 nentries=1 etime=0
[14/Oct/2008:11:58:56 +0900] conn=21 op=6 UNBIND
[14/Oct/2008:11:58:56 +0900] conn=21 op=6 fd=64 closed - U1
チャレンジ・レスポンス方式認証とLDAP
LDAPを用いる場合に2つの認証方式があることをお話ししましたが、
たとえばサーバ側でAPOPを実装する場合、
- ※ 実際にはAPOPには2007年に弱点も見つかっていますので、
今となってはそれほど使用される機会があるとは思いませんが、 チャレンジ・ レスポンス方式を説明する上でAPOPは絶好の材料なのです。 - 参考:APOP
(エーポップ) 方式におけるセキュリティ上の弱点 (脆弱性) の注意喚起について
さて、
% telnet localhost 110 Escape character is '^]'. +OK Dovecot ready. <d43.e.48f98c19.Lqw3XswPopRACVhKEheing==@cos5a> APOP [email protected] a12145991e03d06a94c54f94e2e60536 ←─サーバに送る文字列 +OK Logged in.
ここで、
APOP [email protected] a12145991e03d06a94c54f94e2e60536
という文字列を送信しています。フォーマットは見てわかるとおり、
APOP ユーザ名 ハッシュ値
です。3番目のハッシュ値は接続の度にサーバから発行されるユニークなチャレンジ、
<d43.e.48f98c19.Lqw3XswPopRACVhKEheing==@cos5a>
を元にした値であるため、
% printf '<d43.e.48f98c19.Lqw3XswPopRACVhKEheing==@cos5a> hnakamitsu' | md5sum
ごらんのように、
サーバからのチャレンジと平文パスワードを連結した文字列のMD5ハッシュ値
となります。メールクライアントがこのハッシュ値をサーバに送信し、
クライアントに送ったチャレンジと平文パスワードを連結した文字列のMD5ハッシュ値
を得る必要があり、
しかし前述の認証バインド方式では実際の認証をLDAPサーバに委任するため、
このように考えていくと、
- ユーザにはAPOP/
CRAM-MD5/ DIGEST-MD5などのチャレンジ・ レスポンス認証を使用させたい - セキュリティ上、
dovecot-ldap. conf中に閲覧用のDNとパスワードを記述したくない - セキュリティ上、
LDAPサーバに平文パスワードを登録したくない
のような矛盾が発生してしまい、
技術的にはSASLを使用し、
したがって考え方としては、
- 設定を簡単にすませたいのであれば認証バインド
- 少しでもLDAPサーバのパフォーマンスを向上させたい場合やチャレンジ・
レスポンス認証を使いたい場合はパスワード検索
という形で覚えておくと良いのではないでしょうか。もう少し内容を詳しく知りたい方はLDAP - Dovecot Wikiが参考になります。
APOP/CRAM-MD5/DIGEST-MD5を試す
脱線ついでに、
auth default {
mechanisms = plain apop cram-md5 digest-md5
...
}
ただし、
- 通信全体が暗号化されるため、
サーバ、 クライアント側の負荷につながる - 証明書の管理コスト増大
などが考えられますが、
まとめ
最初のFDS紹介からずいぶん時間が経ってしまいましたが、
メールサーバの大枠が完成したら、
それではまた次回。