NTLM authentication module for IMAP

岡田 健一 / Kenichi OKADA okada @ opaopa.org
2001年 2月 20日 (火) 17:54:12 JST


おかだです。

;; 完全には整理がついていないのですが…

In the message <uae7izvfy.wl @ todhcp111128.europe.nokia.com>
"Taro Kawagishi (川岸太郎)" <taro.kawagishi @ nokia.com> wrote:

> | 本体にコミットすべく、いろいろいじっていたのですが、
> | いくつか質問があります.
> | 
> | 1. sasl-next-step-exists-p が新設されていますが、
> |    sasl-next-step ではだめですか?

> elmo-imap4.el の関数 elmo-network-authenticate-session 内の2番目の
> sasl-next-step では返り値を取っていませんのでせっかく実行してもその結
> 果を次のstepにつなげられないと思います。その部分の意図は、次のstep関数
> がsasl-mechanism に登録されているかを見るだけではないかなと思ったので、
> sasl-next-step-exists-p を新設しました。詳しくは覚えていないのですが
> sasl-next-step ではうまく行かなかった記憶があります。

なるほど.elmo-imap4.el 側のコードが悪いのかもしれません.
もう少し見てみます.

> |    hash-func が nil の場合、添付2のようなエラーが出ました.
> |    ;; これは簡単な修正で直りそうです.

> すみません、うっかりしていました。
> 以下のような修正でどうでしょうか?
> 一応動いているのですが。

せっかく、コードを修正してくださったのですが、
後で書きますが、とりえず別の方法で対処しました.

> |    一番問題なのは、sasl-ntlmがロードされた後、
> |    sasl-passwd-hash-function は 'ntlm-get-password-hashes と
> |    なりますが、以後 別の認証方式を使おうが全部 hash されてしまう
> |    のではないでしょうか?

> elmo-get-passwd とか elmo-get-passwd-or-hash とかが使われる場面は、パ
> スワードを引いてくるキーとして
> (elmo-network-session-password-key session)
> を使うと思いますが、このキーの中に認証方式が含まれているので、上の修正
> をしていただければ、大丈夫だと思います。例えば、
> 	"IMAP:kawagish @ NTDOMAINNAME/ntlm @ XXX.YYY.ZZZ.com:143"
> というような感じです。

それは、elom-passwd-alistにキャッシュされている場合ですよね.
elmo-passwd-life-time で elmo-passwd-alistのエントリが消去されてた
場合に問題が起るような気がします.

> それからこれは書き落としてしまいましたが、NTLMではユーザを同定するのに、
> ユーザー名とNTドメイン名の両方が必要です。NTドメイン名を与えるために
> Samba のやりかたに倣って、WLでのユーザー名部分に
> <username>@<ntdomainname> と記述するという約束にして実装しています。

digest-md5のrealmと同じ問題なのですね.
elmo-passwd-alistまわりが、username, passphrase の組しか
扱えないことが原因ですが、
現状の方法がコストの低い解なのだと思います.

> | 3. そもそも、elmo-get-passwd-or-hash の hash 部分は、elmo の担当でしょ
> |    うか? ntlm.el 側で持った方がいいような気がします.

> わたしもそう思うのですが、elmo-imap4.el の
> elmo-network-authenticate-session の実装では、sasl.elの
> sasl-read-passphraseとは別に、実行時にbindされるdynamic変数
> sasl-read-passphraseが優先されているので、呼ばれているntlm.el側では変
> えられずelmo-passwd-alistを共通に使うelmo-get-passwdの仕組みを拡張する
> 方が自然かなと思ったのです。
> この当たりもう少し考えてみます。

少し考え方に違いがあるのだと思います.
sasl.el がFLIMの一部であり、Wanderlust以外からも利用される可能性があり
ます.そのため、わたしは、できる限りelmoは改造せず、
sasl.el側で対処しようとしています.

とりあえず、現状では elmo 側を変更せずに、NTLM を使えるように
しています.saslのAPIは変更せず、sasl-read-passphraseは、
パスワードのみを返すようにして、sasl-ntlm-responseの中で、
ntlm-get-password-hashes するようにしています.

;; もし、パスワードをそのままelmo-passwd-alistに保存するのを嫌い、
;; hash化したものを保存するようにしたいというのでしたら、
;; やはり elmo側とsasl.el側の両方を変更する必要があります.
;; お気持ちはよくわかります.しかし、APIの変更となると
;; いろいろ規模の大きな変更となりますので、
;; とりあえずは、現状の方法でいこうと思います.

;; あと、sasl-ntlm-response で、sasl-read-passphraseを
;; 定義していますが、これを利用するとエラーになりませんか.
;; 川岸さんのコードでは、passphraseはntlm-get-password-hashesで
;; 処理されたものでなくてはならないですよね.

ちなみに、わたしの変更は、slim-1_14 にcommitしてあります.
saslの中だけで、NTLM を使えるように変更してありますので、
他に影響を与えることはないと思います.川岸さんの方で問題なければ、
wl-2_4 にもコミットしようと思います.

> | ついでに質問があります.NTLM について RFC または それに次ぐような
> | 仕様書はありますでしょうか?
> | わたしがざっと探した限りでは、fetchmailやmuttのコードしか
> | 見つかりませんでした.
> | 
> | わたしはテスト環境を持っていないので、
> | slim-1_14/tests/test-sasl.el のようなテストコードか、
> | もしくは、digest-md5 での
> | のようなセッションの例がありますと非常に助かります.

> これですが、実運用しているサーバーしかアクセスできないので自分のパスワー
> ドを一時的に変えて実験してみました。添付しておきます。

ありがとうございます.commit しておきました.
とりあえず、現状のコードに合せて

-         '(lambda (passphrase)
-            (ntlm-get-password-hashes
-             "!\"#456secret")))
+         #'(lambda (passphrase)
+             "!\"#456secret"))

としてあります.

-- 
岡田 健一  URLs: mailto:okada @ opaopa.org
	   	 http://www.opaopa.org




More information about the Emacs-mime-ja mailing list